AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Object aus TOPbjectList nicht Castbar

Ein Thema von eyeless · begonnen am 1. Dez 2005 · letzter Beitrag vom 2. Dez 2005
Antwort Antwort
eyeless

Registriert seit: 12. Aug 2005
49 Beiträge
 
#1

Object aus TOPbjectList nicht Castbar

  Alt 1. Dez 2005, 11:04
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:
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;
Soweit so gut ...

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:
var
 obj : Tm3u
begin
 obj := Tm3u.Create;
 obj.dir := 'blabla';
 obj.list.assign(irgendsoneliste);
 m3ulist.add(obj);
 obj.destroy;
end;
Kann mir nu jemand sagen, was ich so dermaßen falsch mache ?

Wär kewl, wenn ..

mfg :: eyeless
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Object aus TOPbjectList nicht Castbar

  Alt 1. Dez 2005, 11:12
Hallo eyeless,

wenn du im constructor deiner Klasse zuerst inherited Create aufrufst, dann sollte es klappen.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

Re: Object aus TOPbjectList nicht Castbar

  Alt 1. Dez 2005, 11:22
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:
var
obj : Tm3u
begin
obj := Tm3u.Create;
obj.dir := 'blabla';
obj.list.assign(irgendsoneliste);
m3ulist.add(obj);
obj.destroy; // <- btw: Sowieso besser .Free;
end;
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!
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
eyeless

Registriert seit: 12. Aug 2005
49 Beiträge
 
#4

Re: Object aus TOPbjectList nicht Castbar

  Alt 1. Dez 2005, 14:19
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;
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Object aus TOPbjectList nicht Castbar

  Alt 1. Dez 2005, 15:48
Noch besser so:

Delphi-Quellcode:
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;
marabu
  Mit Zitat antworten Zitat
eyeless

Registriert seit: 12. Aug 2005
49 Beiträge
 
#6

Re: Object aus TOPbjectList nicht Castbar

  Alt 1. Dez 2005, 16:32
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
  Mit Zitat antworten Zitat
eyeless

Registriert seit: 12. Aug 2005
49 Beiträge
 
#7

Re: Object aus TOPbjectList nicht Castbar

  Alt 2. Dez 2005, 11:13
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:
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;
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.

Was mache ich falsch? Was muss ich ändern?

Hoffe auf Hilfe, eyeless
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Object aus TOPbjectList nicht Castbar

  Alt 2. Dez 2005, 11:33
Hallo.

Kein Wunder, dass alles immer das gleiche ist - ist ja auch immer das gleiche Objekt.

Delphi-Quellcode:
// ...
    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;
marabu
  Mit Zitat antworten Zitat
eyeless

Registriert seit: 12. Aug 2005
49 Beiträge
 
#9

Re: Object aus TOPbjectList nicht Castbar

  Alt 2. Dez 2005, 13:09
Ja, mmhh, hätt ich eigentlich auch selber drauf kommen können ...

Nun funzt alles SUPI!

DankÖ

:: eyeles
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 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