![]() |
erstellte Form in TList freigeben
Abend an alle,
ich schreibe gerade in Programm welches einige Formulare erstellt, die von TForm abgeleitet sind. Diese speichere ich in einer Liste. Da bei mir ein erstelltes Formular 50 MB Speicher benötigt möchte ich gerne diese auch aus der TList wieder entfernen können, aber irgendwie scheitere ich daran!? Die TList speichert Zeiger dieses Records:
Delphi-Quellcode:
Das erstellen und anzeigen funktioniert auch wunderbar, nur das freigeben halt nicht. Hier mein gescheiterter Code:
RTFieldForm = record
Form : TFieldForm; Num : Integer; end;
Delphi-Quellcode:
Ich bin mir ziemlich sicher, dass Item[0] auch einen richtigen Pointer beeinhaltet.
var
F : PFieldForm; begin new(F); F := lFields.Items[0]; FreeAndNil(F^.Form); //Free funktioniert auch nicht... Dispose(f); end; Gruß Janek |
Re: erstellte Form in TList freigeben
Wäre die Verwendung von TObjectList nicht einfacher?
|
Re: erstellte Form in TList freigeben
Lass auf jeden Fall mal das New(f) weg.
|
Re: erstellte Form in TList freigeben
Also wenn ich New(f) weglasse, funktioniert es auch nicht.
Ich versuche mich einmal an TObjectList und melde mich wieder. Aber schonmal Danke für die Tipps! |
Re: erstellte Form in TList freigeben
Wenn du uns jetzt noch mitteiltest, was nicht funktioniert... :glaskugel: Möglicherweise willst du auch noch mit TList.Delete den freigegebenen Eintrag aus der Liste löschen.
|
Re: erstellte Form in TList freigeben
Also:
Ich erstelle ein Formular mit diesem Code
Delphi-Quellcode:
Und jetzt will ich das auch wieder freigeben können:
new(F);
F^.Num := 1; F^.Form := TFieldForm.Create(MainForm); F^.Form.Show; lFields.Add(F); Dispose(F);
Delphi-Quellcode:
Naja und oben hatte ich ja auch schon einen anderen Lösungsversuch geschrieben. Als Fehlermedlung komm immer ein Speicherfehler:
lFields.Delete(0); //geht nicht
z.B. Zitat:
Janek //Count liefert 1 zurück, also wird ein Index auch angelegt. //okay jetzt geht es Beim Erstellen muss das Dispose weg und beim Freigeben das New. Eigentlich auch logisch :gruebel: |
Re: erstellte Form in TList freigeben
warum der umweg über das record? speicher doch den pointer auf die Form-Instanz doch gleich in der TList und die nummer kannst notfalls im Tag-Property des Forms unterbringen.
freigeben kannst das dann einfach, indem du einer TForm-Variable den (auf deine Form-klasse gecasteten) Pointer zuweist und dann normal freigibst. Gruß Frank |
Re: erstellte Form in TList freigeben
Danke für die Antwort Frank, aber dann wird ja tortzdem nicht der Speicher der Form richtig freigegeben oder?
Immer wenn ich TForm.Free angegeben habe, wurde die Form zwar "gelöscht" hat aber trotzdem noch die 50 MB Speicher gefressen. Ich versteh bloß nicht wieso. |
Re: erstellte Form in TList freigeben
Vielleicht hast du Komponten auf der Form, die nciht die Form als Parent haben und die somit noch nicht zerstört wurden? Vielleicht solltest mal nach dem Speicherleck schauen.
Wie wärs damit?
Delphi-Quellcode:
var : FormList : TObjectList
Form1 : TForm; i : integer; begin FormList := TObjectList.Create; FormList.OwnsObjects := True; Form1 := TForm.Create(Self); i := FormList.AddObject(Form1); FormList.Delete(i); end; |
Re: erstellte Form in TList freigeben
Bam. Da viel es mir vor Schuppen von den Augen.
Ich habe bloß meine dumme Klasse vergessen freizugeben. Vielen Dank an alle, die mir geholfen haben :dp: Good night, Janek |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz