1. Rapid-Q  /FAQ

(Frequently Asked Questions)

Rapid-Q is a BASIC -like programming language that is now abandoned by its creator William Yu. He sold the rights to RealBasic (XOJO). However, it is still very functional and you can continue to use it. The compiler is multi-platform, although not completely compatible in terms of the graphical interface, but the underlying language is more or less compatible between platforms. Rapid-Q is available for Windows, Linux, and Unix (Solaris and HP-UX are supported). However, most development is in Windows. You can use Rapid-Q to create both GUI and CONSOLE applications, including CGI applications. Rapid-Q generates byte-code as opposed to the native opcode of your processor. This requires an interpreter to read and execute the byte-codes, however, this interpreter is embedded in all your applications, so no extra files are necessary when you distribute your executable. A potential issue is speed, but depending on what you're using Rapid-Q for, this may not be a factor. 

Where do you get the latest RapidQ installer? Is it updated regularly?

Installing RapidQ is very easy by dragging the folder from a zip file to your hard drive. To uninstall RapidQ, just delete the folder No dependencies or other downloads are needed. The zip file contains the latest libraries and many examples to get you up and running quick!  Go to the Downloads Page
RealBasic will not support or update the compiler. The RapidQ2 project is intended to improve the compiler by creating include files with added functionality.

Where do you get sample code or support for RapidQ?

Go to the Links Page
How can I ask questions to users? Try discussion groups and collection of files to members
https://groups.yahoo.com/neo/groups/rapidq/info

If RapidQ is a Beta release does the program have a lot of bugs? Will they be fixed?
The bugs are not too bad and many can be avoided by alternative coding. The main reason for this new documentation is to inform programmers of possible bugs and alternative coding options. Obviously there is potential for a bug in your program that will not be fixed since the compiler is now longer under development. It's not so bad, what compiler doesn't have a bug somewhere? Don't contact William Yu, or RealBasic about supporting the compiler! A great alternative is FreeBasic.

How slow is Rapid-Q anyway?
Although Rapid-Q is based on compiling your sources to byte-code, execution isn't as slow as many think. Byte-coded programs, which can be faster than some scripted programming languages. Obviously your programs will be slower than optimized C/C++ code and other compilers that build machine language code. however, it is not all that slow! You will notice slow speed for nested loops, heavy computations, or to perform very low level manipulation to data. For example, reading a single byte from a 1MB file will take longer in Rapid-Q than in most languages, but not so extremely slow. Same with looping I = I + 1 a few thousand times. But in terms of displaying graphics, controls and forms, it's just as fast as any other language. The problem with byte-code is going away with faster and faster computers. If you need real speed you can create a separate DLL written in FreeBasic with small changes.

What about bloat-ware?
At a minimum the  Rapid-Q interpreter requires about 300KB (150KB for Linux, 600KB for Sparc). So this is the overhead that all your programs will have. Compared to some Windows programs, this isn't that bad, Most likely your bytecode is less than 50KB anyway (for a moderate/large application), plus any resources and graphics you may want to include of course.

Does Rapid-Q require extra runtime DLLs?
No.
All your programs require no extra runtime DLLs or externalities. Just distribute your .EXE file and that's it. They should run on any Win95/98/NT system, assuming the end user hasn't done anything to his/her Windows System files. If you compare the bloat-ware of Rapid-Q and the runtime DLLs of other languages, Rapid-Q isn't that bad in terms of bloated size.

How much memory does Rapid-Q suck out of my programs?
RapidQ eats up less than 200KB for virtual, global, and heap memory combined. This is because all variables and objects are created dynamically. The heap/stack memory is the one you should look out for. If your program is deeply nested or involves intense recursion, this can grow and shrink very rapidly. You don't need to worry about cleaning up your objects or variables when your program terminates. Rapid-Q will free all your objects and clean up the memory space for you. There can be memory leaks during run-time that are described in the documentation.

How easy is it to hack into my programs?
Being a byte-code compiler, if the end user knows how everything is constructed, then it's just a formality. However, Rapid-Q generates a non-standard, or non-specific type byte-code output, which means, unless the user specifically knows what each operation does, it is very very difficult to hack your program. It's easy to hack into your string variables (like any other language), because these things aren't encrypted anyway. In most cases, your program should be safe from snoopers, they might not even know your program is byte-code generated! Unlike Java or other languages, Rapid-Q does not attach any symbol table or extra debugging information to your .EXE.

Do I need a license to distribute my programs?
No. You don't need a license to use Rapid-Q (it's free), and you definitely don't need any license to distribute or sell your programs. The only agreement you have to worry about is that if you choose to use Rapid-Q, you assume any and all consequences, direct or indirectly from the use of Rapid-Q. Rapid-Q can be used for any task, whether it's profit-seeking or otherwise. You don't pay me a cent, and you don't even have to acknowledge that your program was created with Rapid-Q (although this would be a nice gesture). You CANNOT, however, distribute Rapid-Q (the program itself) and charge for it. You're allowed to bundle Rapid-Q along with your program(s), so long as the user is well informed that it's not buying into Rapid-Q, but rather, buying into your program. How is that done? By not even advertising that your distribution includes a copy of Rapid-Q. Call it the hidden feature.

Can you make a DLL with RapidQ? Can you link with .LIB files? 
 No,
there is no support for making your own DLL, ActiveX, or COM programming interface. However, RapidQ can freely use DLLs written in another language using the STDCALL convention. If you can properly set up DECLARE SUB/FUNCTION statements. RapidQ cannot use DLL with COM interfaces. Also there is  no ability for the compiler to do a run-time link with a library file (.LIB). Again FreeBasic, is a good alternatives here.

What is the latest version of DirextX supported? 
DirectX version 6.0 is the last version supported. DXsound is also version 6.0. The DirectX and Direct3D components are very functional since DirectX is mostly backward compatible. However, RapidQ only represent a subset of all DirectX components. Support for Direct 3D is through DirectX Retained Mode interface and requires you distribute the D3DRM.DLL with your program. Unfortunately it is no longer being upgraded by Microsoft. There is no current support for DirectShow, DirectInput, and newer interfaces. It is possible to use wrapper DLLs (the DLL does the work for you).

Can you use OpenGL for graphics and is it fast? 
 Yes,
you can use OpenGL 1.2. There is a set of include files that allows you to interface to OpenGL (see the GL demos Page).  To make OpenGL programs run optimally be sure to download the drivers for your video board -- don't rely on the Drivers that came with your operating system. The speed of OpenGL is mostly dependent on hardware acceleration, but you will notice that RapidQ will be slower than C++ code.

My virus detection software tells me RapidQ has a Trojan virus or some weird virus: 
This is an old problem, that requires you to
update your antivirus software. Also RapidQ compresses the executable with UPX. This makes for a smaller executable but the UPX file compressor might set off some virus dectection software. Unpack your program before running / distribution. Older Norton Antivirus definition files detect a "Hacktool" or a Trojan. Rapidq does not  have a virus! Here are some options:
1) Be sure to download the latest libraries (see Links Page). 
2) Update virus definition file or use the older rapidq3.lib.
3) Exclude the file or folder, and perform a scan, then take it out of quarantine.
4)  If Norton AntiVirus is set to its highest sensitivity, then put the virus settings back to their default (standard) level. This may be 
important for AV alerts each time that a program writes to another file.
--Click Norton AntiVirus (NAV) 'options'
--Select Script blocking.


I get a "Cannot focus a disabled or invisible window" error, how do I fix it? 
 The error  doesn't cause any problems so just ignore it. The fix is to put the file "riched32.dll " (dated 3/2003) into the directory with RapidQ.EXE and RC.EXE. 
Obtain this file from rapidq source locations such as g.slyip.com (use the search box). The problem is a  result of an newer richedit dll that comes with the newer versions of windows. The IDE must have a disabled or invisible window that it  tries to focus when it first runs, but since earlier versions of the dll in question didn't catch it, it went unnoticed until the dll's were updated recently. Do not register this DLL! Just put it in the RapidQ directory. Alternatively just use the FreeQ IDE.

How do you minimize an application to the task bar?
Use QFormEx (found in rapidq2.inc) or these commands minimize an application to the task bar:
SetWindowLong(Form.Handle, GWL_HWNDPARENT, 0)
SetWindowLong(Application.Handle, GWL_HWNDPARENT, Form.Handle)
Form.WindowState = wsMinimized


How do you to put a bitmap in the ClipBoard?

 Draw to a QBitmapEx (found in rapidq2.inc) then use Bitmap.PasteToClipboard. 
The width, height and PixelFormat of the QBitmapEx object affect how it looks.

Can you create a custom event?
Yes, you can use an existing event like OnMouseMove, or make a custom event using Windows messages.  See the source code for QFormEx to see custom events that hook the WndProc Callback function with Windows messages.

Here is an example by Pavel Minayev:
' A short example demonstrating custom events 
' QCircle is a simple control that looks a circle, and it  provides OnHitCircle event, which is called each time the 
' user clicks inside of the circle. It also passes one argument  which is the distance from the center of the circle to 
' the point clicked. 

$INCLUDE "rapidq.inc"
' This declaration is used as a template for event handlers
' for OnHitCircle event
DECLARE SUB HitCircleEvent(d AS SINGLE)
TYPE QCircle EXTENDS QCanvas
' Declare an event based on previously declared handler template
OnHitCircle AS EVENT(HitCircleEvent)
 EVENT OnPaint
WITH QCircle
.Circle(0, 0, .Width, .Height, clWindowText, clBtnFace)
END WITH
END EVENT
 EVENT OnMouseDown(Button AS LONG, x AS LONG, y AS LONG, Shift AS LONG)
WITH QCircle
d = SQR((x - .Width / 2) ^ 2 + (y - .Height / 2) ^ 2)
' If cursor was inside of the circle, fire the event
IF d <= .Width / 2 THEN CALLFUNC(.OnHitCircle, d)
END WITH
END EVENT
 CONSTRUCTOR
Width = 100
Height = 100
END CONSTRUCTOR
END TYPE
' ************* Test code *********
SUB Circle1_HitCircle(d AS SINGLE)
SHOWMESSAGE "Distance from center: " + STR$(d)
END SUB
CREATE Form AS QForm
Width = 300
Height = 300
CREATE Circle1 AS QCircle
OnHitCircle = Circle1_HitCircle
END CREATE
Center
ShowModal
END CREATE