Najprawdopodobniej błąd wyskakuje przy tworzeniu formularza; Są dwie opcje:
#w oknie Projekt Options->Forms (skrót Shift+Ctrl+F11) masz wszystkie formularze tworzone automatycznie (do sprawdzenia także w głównym pliku projektu (o rozszerzeniu *.dpr))
#nie zwalniasz pamięci po zamkniętym formularzu
Sprawdź to, ja obstawiam na pkt 1.;
Poza tym tworzysz formularze dynamicznie, a nigdzie nie widzę zwalniania pamięci po ich zamknięciu; Więc zdecyduj się - albo twórz automatycznie wszystkie formularze i nie baw się z ręcznym, albo usuń je z listy automatycznie tworzonych form i twórz je ręcznie, ale pamiętaj o ich zwolnieniu;
Sposób 1 - tworzenie automatyczne
W oknie Project Options->Forms wszystkie formy (Form1
, Form2
i Form3
) mają być na liście Auto-create forms; Wywołanie formularza Form2
wyglądać będzie tak:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Hide();
Form2.ShowModal();
end;
zaś wywołanie Form3
tak:
procedure TForm2.Button1Click(Sender: TObject);
begin
Form2.Hide();
Form3.ShowModal();
end;
zostaje jeszcze uzupełnić zdarzenia OnClose
:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.Show();
end;
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form2.Show();
end;
Sposób 2 - tworzenie dynamiczne
W oknie Project Options->Forms przenieś Form2
i Form3
na listę Available forms, automatycznie tworzony ma być tylko formularz Form1
; Wywołanie formularza Form2
będzie wyglądać tak:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Hide();
Form2 := TForm2.Create(Form1);
Form2.ShowModal();
Form2.Free();
end;
zaś wywołanie Form3
tak:
procedure TForm2.Button1Click(Sender: TObject);
begin
Form2.Hide();
Form3 := TForm3.Create(Form2);
Form3.ShowModal();
Form3.Free();
end;
to jeszcze nie wszystko; Możesz jeszcze uzupełnić zdarzenie OnClose
w formularzach Form2
i Form3
w następujący sposób:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
Form2 := nil;
Form1.Show();
end;
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
Form3 := nil;
Form2.Show();
end;
i będzie wszystko pięknie działać; W załączniku masz przykładową aplikację napisaną w D7 wykorzystującą dynamiczne tworzenie formularzy; Zapoznaj się z nią i popraw odpowiednio program;