Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stringlist und Objects (https://www.delphipraxis.net/139504-stringlist-und-objects.html)

Berni68 30. Aug 2009 09:15


Stringlist und Objects
 
Hallo zusammen,

ich benötige recht häufig Stringlisten.
An den Stringlisteneinträgen hängen noch weitere Daten dran.

Das mache ich wie folgt (in Anlehnung an einen anderen Beitrag aus der DP):

Delphi-Quellcode:
type
  TDat = class(TObject)
    s: string;
    ...
    destructor Destroy; override; // nur zum testen
  end;
Delphi-Quellcode:
destructor TDat.Destroy;
begin
  showmessage('TDat.Destroy');
  inherited Destroy;
end;
Verwendet wird das so:
Delphi-Quellcode:
  dat:= TDat.Create;
  with d do begin
    s:= 'Test';
    ...
  end;
  MeineStringListe.AddObject('Zeile', dat);

Das funktioniert soweit auch.
Das Problem aber ist nun folgendes:

Mit
Delphi-Quellcode:
  MeineStringListe.Clear;
und
Delphi-Quellcode:
  MeineStringListe.Free;
erzeugt man Speicherleichen.
-> Wie kann ich solche Speicherleichen auffinden:
Gerade in einem anderen Beitrag gefunden: mit -> TObjectList geht das wohl
werd ich gleich mal probieren!

Man könnte zwar vor Clear oder Free

Delphi-Quellcode:
  with MeineStringListe do for i:=0 to Count-1 do Objects[i].Free;
aufrufen, finde ich aber umständlich.
-> Gibt es eine elegantere Möglichkeit?

Eleganter wäre wohl:

Delphi-Quellcode:
type
  TObjStringList = class(TStringList)
    procedure Delete(Index: Integer); override;
  end;

procedure TObjStringList.Delete(Index: Integer);
begin
  Showmessage('TObjStringList.Delete '+IntToStr(Index));
  Objects[Index].Free;
  inherited;
end;
Wenn man einzelnen Stringlisteneintrag löscht geht das zwar,
aber bei Clear und Free wird delete nie aufgerufen
(-> ich dachte zumindest clear ruft für alle delete auf)
muss man dann neben delete auch clear und/oder free überschreiben
oder besser:

gibt es was fertiges im Sinne von TObjStringList bei dem schon an alles gedacht wurde?

himitsu 30. Aug 2009 09:23

Re: Stringlist und Objects
 
ich glaub bei StringList.OwnsObjects := True; gibt er diese selber frei.

alzaimar 30. Aug 2009 09:25

Re: Stringlist und Objects
 
Zitat:

Zitat von Berni68
gibt es was fertiges im Sinne von TObjStringList bei dem schon an alles gedacht wurde?

Nein, aber das selbst zu basteln sollte eine Arbeit von nicht einmal 5, na ja 10 Minuten darstellen. Ich würde so eine Komponente z.B. nicht verwenden, da in meinen Augen die Stringliste so kein geeigneter Container für eine Objektliste ist, aber das ist Geschmackssache.

mirage228 30. Aug 2009 09:27

Re: Stringlist und Objects
 
Zitat:

Zitat von himitsu
ich glaub bei StringList.OwnsObjects := True; gibt er diese selber frei.

Zumindest in Delphi 7 gibt es diese Eigenschaft nicht und da er laut Profil Delphi 5 Prof verwendet, wird das wohl so nicht gehen, wobei ich mich auch nicht entsinne, dass es diese Eigenschaft bei TStringList in neueren Delphi Versionen gibt...

Musst Du wohl doch selbst bauen, wobei da die 3 Methode Delete, Clear und Free anzupassen kein großer Aufwand sein sollten :)

Viele Grüße

Berni68 30. Aug 2009 09:38

Re: Stringlist und Objects
 
Ok,
das anzupassen krieg ich hin.

Aber

Zitat:

Komponente z.B. nicht verwenden, da in meinen Augen die Stringliste so kein geeigneter Container für eine Objektliste ist, aber das ist Geschmackssache.
heißt doch irgendwie dass der Ansatz insgesamt nicht so gut, oder zumindest unüblich ist.

Wäre es besser TStringList zu vergessen und auf TObjectList (oder Alternative) aufzubauen?

himitsu 30. Aug 2009 09:53

Re: Stringlist und Objects
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, D7 und TDE/D2006 kennen es wirklich noch nicht :|

Ansonsten find ich die Beschreibungen der OH immer sowas von geil und aussagekräftig :wall:

DeddyH 30. Aug 2009 12:41

Re: Stringlist und Objects
 
Damit ist doch alles gesagt :lol:. Wann immer möglich, greife ich selbst deshalb auch meist auf die alte Hilfe von D7 zurück, die war wenigstens noch brauchbar.


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