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
>


Reply via email to