Tworzenie i destrukcja nowych form

0

Witajcie !
Ostatnio zacząłem zastanawiać się nad kilkoma kwestiami i pomyślałem, że dobrze będzie jeśli ktoś rozwieje moje wątpliwości.

Powiedzmy, że projekt składa się z kilku form, z których forma pierwsza jest formą główną. Kiedy w Delphi dodajemy do projektu nowe formy automatycznie nadawany jest om status auto-create, co możemy zobaczyć w oknie Project->Options->Forms, no i oczywiście w źródle samego projektu.
Oznacza to, że w raz z uruchamianiem się programu zostanie przeprowadzone tworzenie wszystkich form. Zastanawia mnie dlaczego w ten właśnie sposób dodawane są przez Delphi nowe formy do projektu. Jest to raczej niekorzystnie i wedle mojego rozumowania opóźnia czas uruchamiania się aplikacji. Szczególnie jeśli form mamy dość sporo. Oczywiście mówię tu o formach, które po uruchomieniu się aplikacji nie muszą być widoczne.

Oczywiście nic nie stoi na przeszkodzie, żeby wszystkie dodatkowe formy poprzenosić sobie w opcjach projektu do panelu Available Forms i a w Auto-Create Forms pozostawić jedynie formę główną.
W takim wypadku, jeśli przycisk umieszczony na formie głównej miałby odpowiadać za pojawienie się powiedzmy formy 2, to dla zdarzenia OnClick przycisku należałoby przypisać kod:
Form2:=TForm2.Create(Application);
Form2.Show;
Wtedy forma 2 zostanie utworzona i wyświetlona.
Powiedzmy teraz, że zwyczajnie zamykamy formę 2. Została ona zamknięta (nie zwolniona).
Znowu klikamy na przycisk formy 1. Co się wtedy dzieje ?
Czy zgodnie z powyższym kodem forma 2 jest ponownie tworzona ?
Czy zatem mamy utworzone dwie formy 2 skoro wcześniej zamykając formę 2 nie nastąpiła jej destrukcja tylko zwyczajne zamknięcie ?
Jeśli tak, to każde kliknięcie przycisku będzie tworzyć nowe formy 2 ?
Jeśli tak, to rozumiem, że pod zdarzenie OnClose formy 2 należałoby przypisać kod:
Action:=caFree;
Form2:=nil;
żeby podczas zamykania następowała automatyczna destrukcja tej formy.

Z góry dziękuję za głosy w dyskusji !

Pozdrawiam wszystkich !

0

Ad. 1. Jeśli chcesz użyć formy jako "zwykłej" formy, to jest to po prostu wygodniejsze. Potem dajesz Show; i Hide; kiedy trzeba i tyle.
Ad. 2. Tak, tworzona jest w ten sposób kolejna instancja tej formy.
//Dopisane: Ten kod w drugim punkcie powinien raczej wyglądać tak:

  Application.CreateForm(TForm2, Form2);
0

Tworzenie jeżeli nie chcesz zwalniać:

if not Assigned(Form2) then //Czy Form2 istnieje?
   Form2:=TForm2.Create(Application); //Jeżeli nie to ją utwórz
Form2.Show;

A jezeli zwalniasz to tak:

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action:= caFree;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  Form2:= nil;
end;

EDIT//

Adam.Pilorz napisał(a)

//Dopisane: Ten kod w drugim punkcie powinien raczej wyglądać tak:

  Application.CreateForm(TForm2, Form2);

A jaka jest różnica od:

Form2:=TForm2.Create(Application);
0

ad.1. możesz to sobie zmienić w opcjach Delphi

ad.2.
a) zostaje zamknięta ale nie zwolniona (Action := caFree; w onClose załatwia sprawę)
b) kolejny click powoduje utworzenie nowej instancji formy (zajmują coraz więcej pamici, a odwołnie się do poprzedniej formy aby ją pokzać jest utrunione bo nie mamy do niej ani uchwytu ani wskaźnika)

0

Witajcie !
Panowie, zatem mam już jasność 100%-ową :)
Dziękuję koledzy za poświęcenie czasu na te wypowiedzi.

Serdecznie pozdrawiam !

PS.
Podrowienia dla sąsiada z Dąbrowy Górniczej - Misiekd :]

0
Stander napisał(a)

Podrowienia dla sąsiada z Dąbrowy Górniczej - Misiekd :]

hehe i nawzajem ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1