![]() |
dynamische TStringList(en)
Wenn ich dynamische StringListen erstelle, muss ich dann vorher jede einzeln Deklarieren?
Denn wenn ich zum Beispiel Buttons dynamisch erstelle, kann ich bei jedem Button den Namen neu zuweisen. Allerdings hat eine StringList die Eigenschaft "Name" nicht. Hier ein Beispiel: Ich will 3StringListen erstellen, dass geht so:
Delphi-Quellcode:
Aber das müsste doch auch irgendwie so gehen (oder?):
procedure xyz;
var liste1, liste2, liste3: TStringList; begin liste1:=TStringList.Create; liste2:=TStringList.Create; liste3:=TStringList.Create; end;
Delphi-Quellcode:
procedure abc;
var liste: TStringList; begin for i:=1 to 3 do begin liste:=TStringList.Create; liste.name:=liste(inttostr(i)); end; end; |
Re: dynamische TStringList(en)
ich glaub du verstehst das prinzip noch nicht ganz
Wenn du Object.Create aufrufst wird für das Object der speicher angefordert und wenn du liste:=TStringList.Create; schreibst so ist "liste" nichts anderes als ein Pointer auf den angeforderten Speicher. Wenn du das also in einer For schleife machst wird auch immer wieder speicher angefordert nur dein problem ist derzeit das du die Pointer auf den reservierten Speicher bei dem nächsten Schleifendurchlauf wieder überschreibst. Und da kommen dann Listen zum einsatz
Delphi-Quellcode:
[...]
LStringlistList: TList; //Die Liste mit Pointern [...] var LStringlist: TStringList; LCount: Integer; begin for LCount := 0 to 4 do begin LStringlist := TStringList.Create; LStringlistList.Add(LStringList); //Den Pointer auf die gerade erstellte Instanz in die Liste adden end; end; |
Re: dynamische TStringList(en)
Danke,
du hast recht, ich habe das absolut nicht verstanden. Habe mri auf dsdt.info jetzt ein Tutorial zu TList angeschaut, aber verstanden habe ich es nicht, da ich absolut keine Ahnung von Pointern habe. Aber brauch ich die denn für mein Problem überhaupt? Ich will nur beliebig viele TSTringListen erstellen können und hinterher darauf zugreifen können. In deinem Beispiel weiß ich nicht, was mir die TList bringt. Sie enthält Pointer auf den für die StringListen freigegebenen Speicher? Und wie kann ich diesen Speicher jetzt verwenden? Wäre auch mit einem Hinweis auf ein entsprechendes Tutorial oder einen Beitrag dankbar... |
Re: dynamische TStringList(en)
Wie wäre es dann mit einen Array of TStringlist oder immer wieder gut eine TObjecktlist
|
Re: dynamische TStringList(en)
Zitat:
Danke für den Tip. |
Re: dynamische TStringList(en)
Moin TheAn00bis,
wenn Du eine Instanz von einem Objekt erzeugst, so erhältst Du, zwangsläufig, den Pointer auf das Objekt (den reservierten, und wohl auch initialisierten, Speicher). Bei Dir würde also nun, nach dem Create Liste1 den Pointer auf die Instanz der ersten Stringliste enthalten, Liste2 den auf die zweite usw. Bei dem Beispiel mit TList wären es dann die jeweiligen Elemente des Arrays. Da TList aber nun einmal eine allgemeine Pointerliste ist, musst Du, bei der Verwendung, angeben, welchen Typ der Pointer hat. Bei SirThornberrys Beispiel sähe das dann so aus: LStringlistList[0] enthält den Pointer auf die erste StringListe, LStringlistList[1] den auf die zweite usw. Als TStringList zugreifen kannst Du dann so:
Delphi-Quellcode:
Bei TList musst Du Dich aber auch darum kümmern, dass die Objekte wieder freigegeben werden, wenn Du sie nicht mehr brauchst:
TStringList(LStringlistList[0]).Add('Zeile der ersten StringListe hinzufügen');
Delphi-Quellcode:
Wenn Du, wie schon vorgeschlagen wurde,
for LCount := 0 to 4 do
begin TStringList(LStringlistList).Free; end; ![]() |
Re: dynamische TStringList(en)
Ich empfehle dir eine abgeleitete Klasse von TObjectList:
Delphi-Quellcode:
Dann kannst du dir die ständige Typumwandlung (ObjectList.Items[i] as TStringList) sparen! Und wie Christian Seehase schon erwähnte, gibt die TObjectList die in ihr gespeicherte Objekte auch selbstständig wieder frei, wenn du sie - die ObjectList - nicht mit Create(false) angelegt hast.
type
TStringListList = class(TObjectList) private function GetStringList(index: integer): TStringList; procedure SetStringList(index: integer; const Value: TStringList); public property StringList[index: integer]: TStringList read GetStringList write SetStringList; default; end; [...] { TStringListList } function TStringListList.GetStringList(index: integer): TStringList; begin Result:=Items[index] as TStringList; end; procedure TStringListList.SetStringList(index: integer; const Value: TStringList); begin Items[index]:=Value; end; //EDIT: wenn du eine TObjectList verwenden willst, musst du im USES-Abschnitt noch "Contnrs" einbinden! |
Re: dynamische TStringList(en)
Christian sagt ObjectList, Grishnak sagt typisierte ObjectList (Typecast sparen), ich sag
![]() Der Vorteil? Du schreibst insg. 5 Zeilen Code in eine leere Unit und das wars:
Delphi-Quellcode:
Besser kanns (fast) nicht mehr werden, oder? :mrgreen:
unit uListItem;
interface uses Contnrs; type _LIST_ITEM_ = TStringList; {$DEFINE TYPED_LIST_TEMPLATE} {$INCLUDE objlist_tmpl.pas} TStringListList = _LIST_; implementation {$INCLUDE objlist_tmpl.pas} end. Greetz alcaeus |
Re: dynamische TStringList(en)
Wow, danke für die zahlreichen Antworten!
Werde alle Varianten ausprobieren! Dann lerne ich 1. am meiten und kann 2. selber entscheiden, welches für mich das sinnvollste ist. :) Edit: Zur TList-Variante: Das reicht doch, wenn ich die Liste ganz zum Schluß freigebe? Im onDestroy der Klasse? Warum muss ich das eigentlich selber machen, wird das beim beenden des Programmes nicht automatisch erledigt? |
Re: dynamische TStringList(en)
Zitat:
|
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