Ich hab hier ein kleines Testprogramm geschrieben, das, neben dem Hauptformular, mehrere Unterformulare hat (mit je einem Riesenbild zur Verdeutlichung ).
Diese Unterformulare werden im Hauptform per Listbox ausgewählt und per Buttonclick dynamisch erzeugt:
Delphi-Quellcode:
procedure THauptformular.Showform(Item:integer);
begin
case item of
0 : begin
form1 := TForm1.Create(self);
form1.onclose := DoCloseSubForm;
form1.Tag := item;
form1.Show;
end;
1 : begin
form2 := TForm2.Create(self);
form2.OnClose := DoCloseSubForm;
form2.Tag := item;
form2.Show;
end;
2 : begin
form3 := TForm3.Create(self);
form3.onclose := DoCloseSubForm;
form3.Tag := item;
form3.Show;
end;
3 : begin
form4 := TForm4.Create(self);
form4.onclose := DoCloseSubForm;
form4.Tag := item;
form4.Show;
end;
4 : begin
form5 := TForm5.Create(self);
form5.onclose := DoCloseSubForm;
form5.Tag := item;
form5.Show;
end;
5 : begin
form6 := TForm6.Create(self);
form6.onclose := DoCloseSubForm;
form6.Tag := item;
form6.Show;
end;
6 : begin
form7 := TForm7.Create(self);
form7.onclose := DoCloseSubForm;
form7.Tag := item;
form7.Show;
end;
end;
end;
Soweit funktioniert das ganze auch wunderbar.
Beim Schließen des Unterformulars wird die Instanz nun wieder freigegeben:
Delphi-Quellcode:
procedure THauptformular.DoCloseSubForm(Sender: TObject;
var Action: TCloseaction);
begin
action := caFree;
end;
Das scheint aber nur teilweise zu funktionieren. Lt. Taskmanager bleiben etwa 650Kb stehen und zwar jedesmal, also wenn ich die Unterformulare 5 mal aufrufe, bleiben insgesamt 3250 Kb stehen !!. Wie kommt das und wie kann man das verhindern ?