Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TImages, deren Pointer in einer TList stehen, frei geben (https://www.delphipraxis.net/45041-timages-deren-pointer-einer-tlist-stehen-frei-geben.html)

idontwantaname 28. Apr 2005 14:09


TImages, deren Pointer in einer TList stehen, frei geben
 
Hallo :hi:

Ich habe ein Problem, und zwar folgendes: Ich erstelle dynamisch mehrere TImage-Objekte und speichere diese mit folgendem Code in eine TList:
Delphi-Quellcode:
MyImage: TImage;
Images: TList;
{...}
MyImage := TImage.Create( Form1 );
MyImage.Parent := Form1;
{...}
Images.Add( @MyImage );
Nun möchte ich diese Images wieder freigeben und so hab ich versucht, dies so zu lösen:
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
var
  i: Integer;
  MyImage: ^TImage;
begin
  for i := 0 to Images.Count - 1 do
  begin
    MyImage := Images.Items[i];
    MyImage^.Free;
  end;

  Images.Free;
end;
Leider gibt es beim schließen des Programms eine AV :(
Kann mir jemand helfen und erklären, wo der Fehler in diesem Code ist ??

Khabarakh 28. Apr 2005 14:16

Re: TImages, deren Pointer in einer TList stehen, frei geben
 
Wie schon oft gesagt, Objektreferenzen (also z.B. Image: TImage) sind schon selbst Pointer. Delphi nimmt dir schon die meiste Arbeit ab, mit ^TImage hast du einen Pointer auf einen Pointer auf deine Klasse.
Nimm am besten gleich Delphi-Referenz durchsuchenTObjectList .

idontwantaname 28. Apr 2005 14:24

Re: TImages, deren Pointer in einer TList stehen, frei geben
 
so, ich hab jetzt eine TObjectList genommen, und füge die Images mit
Delphi-Quellcode:
Images.Add( MyImage );
ein, und gebe die Objekte auch wieder mit
Delphi-Quellcode:
for i := 0 to Images.Count do
  Images.Items[i].Free;
wieder frei, nur bekomme ich immer noch eine AV :cry:

teebee 28. Apr 2005 14:27

Re: TImages, deren Pointer in einer TList stehen, frei geben
 
Ist die Eigenschaft OwnsObject der ObjectList gesetzt? Dann sezte sie auf False, dann übernimmt die Liste die Freigabe nicht selbst.

Edit: Oder gib einfach nicht selbst frei...

Gruß, teebee

idontwantaname 28. Apr 2005 14:32

Re: TImages, deren Pointer in einer TList stehen, frei geben
 
oh, das macht eine TObjectList selber ?? :oops:
na, dann ist das problem gelöst :-D

Khabarakh 28. Apr 2005 14:38

Re: TImages, deren Pointer in einer TList stehen, frei geben
 
Zur ursprünglichen Frage:
Nach unten zählen!
Delphi-Quellcode:
for i := Images.Count - 1 downto 0 do
  Images.Delete(i);

idontwantaname 28. Apr 2005 14:43

Re: TImages, deren Pointer in einer TList stehen, frei geben
 
okay,
nochmals danke

Christian Seehase 28. Apr 2005 15:43

Re: TImages, deren Pointer in einer TList stehen, frei geben
 
Moin idontwantaname,

wenn Du dir Objekte so erzeugst

Delphi-Quellcode:
MyImage := TImage.Create( Form1 );
nämlich mit Angabe eines Owners (in diesem Falle Form1), brauchst Du diese nicht selber freizugeben.
Dies geschieht automatisch, wenn der Owner freigeben wird.

sECuRE 28. Apr 2005 16:06

Re: TImages, deren Pointer in einer TList stehen, frei geben
 
Hi,

alternativ zum nach unten zählen kann man es auch so lösen:
Delphi-Quellcode:
while (Images.Count > 0) do
  Images.Items[0].Free;
cu

idontwantaname 28. Apr 2005 17:07

Re: TImages, deren Pointer in einer TList stehen, frei geben
 
Zitat:

Zitat von Christian Seehase
Moin idontwantaname,

wenn Du dir Objekte so erzeugst

Delphi-Quellcode:
MyImage := TImage.Create( Form1 );
nämlich mit Angabe eines Owners (in diesem Falle Form1), brauchst Du diese nicht selber freizugeben.
Dies geschieht automatisch, wenn der Owner freigeben wird.

auch gut, dann hat sich die sache ja ziemlich einfach erledigt :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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