On Tue, 14 Oct 2008, Graeme Geldenhuys wrote:
> On Tue, Oct 14, 2008 at 3:50 PM, Michael Van Canneyt > <[EMAIL PROTECTED]> wrote: > >> When a new form is created using Application.CreateForm(), the form's > >> global instance variable is passed in as well. Now if that form's > >> CloseAction = caFree, where is that instance variable assigned nil > >> after it was freed? > > > > It is not, unless you set it to nil in the BeforeDestroy event. > > > > Using that variable is a very bad idea anyway. > > I hate those global form variables as well, but how else do you handle > non-modal forms? For example. I create a non-modal TaxCodeListing > form. The user used the main form's menu to get to TaxCodeList. If > the form already exists, it should bring it to the front and not > create another instance. To do that, if check if the global form > variable = nil or not. After the first create and even if the user > actually closed the form (not just sitting in the background), that > global form variable in now always <> nil. > > So when the user selects the menu option to view the TaxCodeList form > a little later. The apps sees that the global form variable <> nil and > tries to call .ActivateWindow() and I get a lovely exception error. > :-( > > function DisplayTaxCodeList: Boolean; > begin > Result := False; > if not Assigned(TaxCodeListForm) then > fpgApplication.CreateForm(TTaxCodeListForm, TaxCodeListForm) > else > TaxCodeListForm.ActivateWindow; > TaxCodeListForm.Show; > Result := True; > end; > > > Any better suggestions for managing non-modal forms? Sure. All forms are owned by the global application, so: C:=fpgApplication.FindComponent('TaxCodeListForm'); If (C<>Nil) then TaxCodeListForm(C).ActivateWindow else fpgApplication.CreateForm(TTaxCodeListForm, TaxCodeListForm) Michael. _______________________________________________ Lazarus mailing list Lazarus@lazarus.freepascal.org http://www.lazarus.freepascal.org/mailman/listinfo/lazarus