![]() |
Object aus TOPbjectList nicht Castbar
Tach!
Ich Problem: Ich habe mit eine Klasse namens Tm3u, abgeleitet von TObject, erzeugt, und wollte diese nun mithilfe einer TObjectList .. auflisten halt. hier mal die Klasse:
Delphi-Quellcode:
Soweit so gut ...
type
Tm3u = class(TObject) dir : String; list : TStringList; constructor Create; destructor Destroy; end; constructor Tm3u.Create; begin list := TStringList.Create; dir := ''; end; destructor Destroy; begin list.free; end; Dem Object Werte zuweisen und dann in die Liste (m3ulist) einfügen geht ohne Probleme. Die Anzahl der Objecte in der Lsite stimmt dann auch ... Wenn ich dann aber z.B. sage showmessage((m3ulist.items[0] as Tm3u).dir), kriege ich eine 'InvalidCasting...' Fehlermeldung!!! Warum? Einfügen tue ich die Objecte so;
Delphi-Quellcode:
Kann mir nu jemand sagen, was ich so dermaßen falsch mache ?
var
obj : Tm3u begin obj := Tm3u.Create; obj.dir := 'blabla'; obj.list.assign(irgendsoneliste); m3ulist.add(obj); obj.destroy; end; Wär kewl, wenn .. mfg :: eyeless |
Re: Object aus TOPbjectList nicht Castbar
Hallo eyeless,
wenn du im constructor deiner Klasse zuerst inherited Create aufrufst, dann sollte es klappen. Grüße vom marabu |
Re: Object aus TOPbjectList nicht Castbar
Das ist zwar immer ratsam, aber hier optional, da nur der leere Konstruktor von TObject aufgerufen würde.
Das Problem ist, dass du nach dem Einfügen in die Liste das Objekt sofort wieder freigibst:
Delphi-Quellcode:
Du übergibst der Liste ja nur eine Refrenz auf das Objekt und nicht eine Kopie, also enthält die Liste nur noch "Müll". Wenn die Liste mit AOwnsObjects = true erstellt wurde, werden alle Items mit der Liste freigegeben. Wichtig ist hier aber, dass du den Destruktor überschreibst, sonst wird deine Stringlist nie freigegeben!
var
obj : Tm3u begin obj := Tm3u.Create; obj.dir := 'blabla'; obj.list.assign(irgendsoneliste); m3ulist.add(obj); obj.destroy; // <- btw: Sowieso besser .Free; end; |
Re: Object aus TOPbjectList nicht Castbar
Also besser so:
Delphi-Quellcode:
type
Tm3u = class(TObject) dir : String; list : TStringList; constructor Create; destructor Destroy; override; end; constructor Tm3u.Create; begin inherited Create; //muss nicht, kann aber, oder? list := TStringList.Create; dir := ''; end; destructor Destroy; begin list.free; end; // und dann weiter unten ... var obj : Tm3u begin obj := Tm3u.Create; obj.dir := 'blabla'; obj.list.assign(irgendsoneliste); m3ulist.add(obj); //obj.free; -> weg, und dafür m3ulist.AOwnsObjects := true beim erstellen der Liste ... end; |
Re: Object aus TOPbjectList nicht Castbar
Noch besser so:
Delphi-Quellcode:
marabu
type
Tm3u = class(TObject) dir : String; list : TStringList; constructor Create; destructor Destroy; override; end; constructor Tm3u.Create; begin inherited Create; // initialisiert den class record list := TStringList.Create; dir := ''; // macht inherited schon end; destructor Tm3u.Destroy; begin list.free; inherited; // nur der Ordnung halber end; // und dann weiter unten ... var obj : Tm3u begin obj := Tm3u.Create; obj.dir := 'blabla'; obj.list.assign(irgendsoneliste); irgendsoneliste.Free; // hier oder anderswo freigeben m3ulist.add(obj); //obj.free; -> weg, und dafür m3ulist.AOwnsObjects := true beim erstellen der Liste ... end; |
Re: Object aus TOPbjectList nicht Castbar
Also war jetzt nur noch anders, dass ich auch in Destroy inherited und die igendsoneliste freeen muss.
Ich werde es ausprobieren und auch dann sagen, ob funzt. mfg, eyeless |
Re: Object aus TOPbjectList nicht Castbar
Soo, an sich hat nun alles funktioniert.
Ich hab jez nur ein anderes Problem, was sich aber auch darauf bezieht: Ich lese in einer Schleife Daten (Ordner) aus, speichere den Pfad und die mp3s im ordner (als Stringlist) in einem Tm3u-Object und adde dieses in die liste m3uList. Das mache ich so:
Delphi-Quellcode:
Wenn ich aber nun zum schluss die einzelnen Objecte ausgeben lasse, haben allse den gleichen Pfad und alle haben ALLE mp3-namen (aus allen ordnern) in den Listen gespeichert.
procedure createObjs;
var i : Integer; m3uObj : Tm3u; aDir : String; begin m3uObj := Tm3u.Create; with m3uForm.TreeView do begin for i := 0 to Items.Count-1 do begin if countMP3s(addSlash(currDir+getNodePath(Items[i]))) > 0 then begin m3uObj.dir := addSlash(getNodePath(Items[i])); getMP3s(addSlash(currDir+getNodePath(Items[i])),m3uObj.mp3s); m3uList.Add(m3uObj); end; end; end; //m3uObj.Free; end; Was mache ich falsch? Was muss ich ändern? Hoffe auf Hilfe, eyeless |
Re: Object aus TOPbjectList nicht Castbar
Hallo.
Kein Wunder, dass alles immer das gleiche ist - ist ja auch immer das gleiche Objekt.
Delphi-Quellcode:
marabu
// ...
for i := 0 to Items.Count-1 do begin if countMP3s(addSlash(currDir+getNodePath(Items[i]))) > 0 then begin m3uObj := Tm3uObj.Create; // <--- vielleicht fehlt ja nur das hier m3uObj.dir := addSlash(getNodePath(Items[i])); getMP3s(addSlash(currDir+getNodePath(Items[i])),m3uObj.mp3s); m3uList.Add(m3uObj); end; end; // ... end; |
Re: Object aus TOPbjectList nicht Castbar
Ja, mmhh, hätt ich eigentlich auch selber drauf kommen können ...
Nun funzt alles SUPI! DankÖ :: eyeles |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:49 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