Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi erstellte Form in TList freigeben (https://www.delphipraxis.net/130760-erstellte-form-tlist-freigeben.html)

Looper 12. Mär 2009 19:18


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:
  RTFieldForm = record
    Form : TFieldForm;
    Num : Integer;
  end;
Das erstellen und anzeigen funktioniert auch wunderbar, nur das freigeben halt nicht. Hier mein gescheiterter Code:
Delphi-Quellcode:
var
  F : PFieldForm;
begin
  new(F);
  F := lFields.Items[0];
  FreeAndNil(F^.Form); //Free funktioniert auch nicht...
  Dispose(f);
end;
Ich bin mir ziemlich sicher, dass Item[0] auch einen richtigen Pointer beeinhaltet.

Gruß Janek

DeddyH 12. Mär 2009 19:22

Re: erstellte Form in TList freigeben
 
Wäre die Verwendung von TObjectList nicht einfacher?

Apollonius 12. Mär 2009 19:23

Re: erstellte Form in TList freigeben
 
Lass auf jeden Fall mal das New(f) weg.

Looper 12. Mär 2009 19:29

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!

Apollonius 12. Mär 2009 19:42

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.

Looper 12. Mär 2009 19:48

Re: erstellte Form in TList freigeben
 
Also:
Ich erstelle ein Formular mit diesem Code
Delphi-Quellcode:
  new(F);
  F^.Num := 1;
  F^.Form := TFieldForm.Create(MainForm);
  F^.Form.Show;
  lFields.Add(F);
  Dispose(F);
Und jetzt will ich das auch wieder freigeben können:
Delphi-Quellcode:
  lFields.Delete(0); //geht nicht
Naja und oben hatte ich ja auch schon einen anderen Lösungsversuch geschrieben. Als Fehlermedlung komm immer ein Speicherfehler:
z.B.
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt GoL.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 0000006D. Lesen von Adresse 0000006D'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
Mehr finde ich auch nicht heraus.. Ich prüfe nochmal, ob überhaupt ein Index angelegt worden ist

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:

_frank_ 12. Mär 2009 21:30

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

Looper 12. Mär 2009 21:33

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.

quendolineDD 12. Mär 2009 21:37

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;

Looper 12. Mär 2009 21:41

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.
Seite 1 von 2  1 2      

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