Ik zal proberen het e.e.a. op een rijtje te zetten.
Application.CreateForm(...) is bedoeld voor je project source. Als je formulier dat het
eerste werdt gemaakt door CreateForm wordt gesloten (.Close) wordt je applicatie afgesloten.
met Form1 := TForm1.Create(Self); maak je een nieuwe instantie van TForm1 aan.
Het volgende kan dus ook:
code:
1
2
3
4
5
6
7
8
| var f1, f2, f3 : TForm1;
begin
f1 := TForm1.Create(Self);
f1.Show;
f2 := TForm1.Create(Self);
f2.Show;
f3 := TForm1.Create(Self);
f3.Show; |
.Destroy moet je niet aanroepen. Destroy is ze zogenaamde 'destructor' (.Create is de 'contructor'). .Free roept de destructor aan.
.Release roept .Free aan zodra je uit je code bent. Dit kan heel nuttig zijn.
Voorbeeld:
Met neme een formulier dat je wil vrijgeven als de gebruiker op een knop drukt. Dat
kan niet door .Free. De de methode free wordt uitgevoerd en vervolgens wordt er terug gesprongen naar de plek waar .free werdt aangeroepen. Dit is dan je Button1Click, maar die bestaat niet meet. Je formulier bestaat immers niet meer en je hebt een Access Violation. Release lost dit op. De free wordt dan pas uitgevoerd als je uit je event-code bent (of je roept Application.ProcessMessages aan).
.Close is nuttig als je een formulier modaal wilt weergeven en je wilt weten op welke knop de gebruiker heeft geklikt ofzo. Neem een printvoorbeeld. Formuliertje met een afbeelding en twee knoppen: Print & annuleren.
De eigenschap modalresult van de knop kan je instellen op mrOK en mrNo maar in code kan ook:
code:
1
2
| ModalResult := mrOK;
Close; |
Dat formulier kan je dan als volgt gebruiken:
code:
1
2
3
4
5
| PrintForm := TPrintForm.Create(Self);
// doe iets
if PrintForm.ShowModal = mrOK then // je krijgt pas het resultaat als PrintForm gesloten is
PrintZut;
PrintForm.Free; |
Oh ja, als je dingen aanmaakt in je FormCreate (or whereever) geef dat dan ook vrij! Ik vergeet het zelf ook nog wel een om bijvoorbeeld een TStringList vrij te geven.
Ik hoop dat je er wat aan hebt en dat het duidelijk genoeg is.
Sorry voor de layout