Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einzelne Objekte einer TObjectlist überschreiben/freigeben (https://www.delphipraxis.net/70502-einzelne-objekte-einer-tobjectlist-ueberschreiben-freigeben.html)

smudo 31. Mai 2006 09:00


Einzelne Objekte einer TObjectlist überschreiben/freigeben
 
Hallo,

Ich nutze eine Objectliste zum abspeichern von Records:
Delphi-Quellcode:
RSaveRec=Record
  s:String;
  i:Integer;
  b:Boolean;
end;
PSaveRec=^RSaveRec;

function TForm1.GetObject: PSaveRec;
begin
  New(Result);
  Result.s:=edS.Text;
  Result.i:=seI.Value;
  Result.b:=chkb.Checked;
end;

SaveObjectList.ActiveObject:=TObject(GetObject);
ActiveObject ist eine Property der Klasse TSaveObjectList, welche das übergebene Objekt an der aktuellen Position in einer TObjectlist speichert. Das funktioniert auch gut, solange an der Position in der ObjectListe noch nichts gespeichert war.
Möchte ich aber ein Objekt überschreiben, kommt es zu einer Zugriffsverletzung.

Wie kann ich ein einzelnes Object aus einer Objectliste freigeben bzw. überschreiben, ohne das Object selbst zu kennen?

ich habe mit diesem Thread
Speicherverwaltung Objectlisten
versucht, das Problem zu klären, bin aber nicht weitergekommen.

Schon mal Danke im Voraus für eure Anregungen

René

marabu 31. Mai 2006 09:10

Re: Einzelne Objekte einer TObjectlist überschreiben/freigeb
 
Hallo René,

interessanter scheint mir die Prozedur SetActiveObject() zu sein. Ist die ObjectList Owner der gespeicherten Objekte?

Grüße vom marabu

Hawkeye219 31. Mai 2006 09:23

Re: Einzelne Objekte einer TObjectlist überschreiben/freigeb
 
Ist es eigentlich klug, einen Zeiger auf einen Record als TObject zu behandeln? Ich vermute, die TObjectList benutzt zur Freigabe des alten "Objekts" dessen Methode Free. Dein Record kann diese Methode aber nicht zur Verfügung stellen...

Gruß Hawkeye

smudo 31. Mai 2006 09:31

Re: Einzelne Objekte einer TObjectlist überschreiben/freigeb
 
Delphi-Quellcode:
procedure TSaveObjectList.SetActiveObject(const aObject: TObject);
begin
{  if FObjectList[FPosition]<>Nil then
    FObjectList[FPosition].Free;     //Vor dem Überschreiben freigeben? funktioniert nicht}
  FObjectList[FPosition]:=Nil;       //Wenn schon gefüllt - krachts hier!!!
  FObjectList[FPosition]:=aObject;
end;
Ganz am Anfang weise ich der Liste Nil zu
Delphi-Quellcode:
FObjectList.Add(Nil);
und das lässt sich auch noch getrost überschreiben.

smudo 31. Mai 2006 09:46

Re: Einzelne Objekte einer TObjectlist überschreiben/freigeb
 
Ok, mein schlauer Kollege K.L. wies mich darauf hin, dass man in einer ObjectListe nicht mit Records, sondern besser auch mit TObject-Klassen arbeiten sollte. Hab ich gemacht und es funktioniert.

Dank an marabu und Hawkeye219, der ja schon auf dieses Problem hingewiesen hat.

René


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz