The problem you are trying to solve is unnecessary.
It is not good strategy to attempt to use the frmGlobal variable as a
flag as to whether or not the form has been created.
It is simpler and more reliable just to "have a look first" whether
the form has already been created.
procedure TForm1.ShowGlobalForm;
var
frmGlobal: TfrmGlobal;
begin
frmGlobal := Application.FindComponent('frmGlobal') as TfrmGlobal;
if not Assigned(frmGlobal) then
frmGlobal := TfrmGlobal.Create(Application);
frmGlobal.Show;
end;
Form variables of global scope (such as frmGlobal in your original
post) are not critical to a form's existence. They are just a handy
reference to the form for the use of the programmer.
The "real" reference to the form that matters (ie. the one that lives
and dies with the form) is the one in the Components list of the
owner.
Normally of course the global form variable will contain the same
value (pointer) as the value in the Components list. But even if you
overwrite the global variable with a reference to a new instance, or
accidentally set it to Nil, the owner the form still has the
reference to the original instance and will ensure it (and any other
instances of the form it owns) are finally freed.
--- In [email protected], "Jamie L. Mitchell" <[EMAIL PROTECTED]>
wrote:
>
> Hello all:
>
> I remember seeing a tip from ... somewhere on this issue. I cannot
> seem to dig it up now.
>
> I would like to have a global variable for a form:
>
> frmGlobal: TfrmGlobal;
>
> I would like to instantiate it from any place:
>
> frmGlobal := TfrmGlobal.Create(Application);
>
> and show it as a non-modal form:
>
> frmGlobal.Show;
>
> When I am done with the form, I would like to close it and free it
up.
> Of course, the problem with this is that, at a later date, I may
want
> to create it again. To avoid a memory leak, I clearly would not
want
> to create a new instance if the existing instance still exists. I
> could use:
>
> If (Assigned(frmGlobal)) Then ...
>
> except that assigned merely asks the variable, "are you NIL?" Since
> merely freeing the variable does not set it to NIL, the system
thinks
> it is still there.
>
> Since the form could be created anywhere, and the form should be
> deleted when it is closed, the best way to deal with it would seem
to
> be figuring out a way to free the form and set the global variable
to
> NIL from the OnDestroy event. I have had a number of problems doing
> this (chicken or egg problem.) A lot of AV's come out of
> experimenting with this.
>
> Does anyone have a good solution to how to free and NIL [the global
> variable] form from inside itself?
>
> Thanks
> jamie
>