Mike,
QueryUnload is an event that fire under certain circumstnaces during fomr destruction. It doe snot Destroy the form. Calling QueryUnload does nothing but run the code you put in there.
To release a form you call the Release method from your code. That will begin the form's release process. If anything is holding a reference to any object in the form then the form cannot release. Therefore you need to discharge any references in teh form's Release method.
For example, a form has a property named oTimer. In the Init of the form you do;
Thisform.oTimer = Thisform.Timer1
If you try to release the form it will not go away because the Timer object cannot release due to the external reference to it. You would need to put code like this in the form's Release method;
Thisform.oTimer = NULL
This will NULL the external reference and allow the time object to destroy itself normally. Then the Release method of the form's default behavior will release the form.