![]() |
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:
|
Re: dynamische TStringList(en)
Zitat:
Zitat:
Und ob man einem Anfaenger zumutet, TList neu zu schreiben und alle Typen auszutauschen, oder ob man ihn 5 Zeilen fuer die Templates schreiben laesst, macht wohl auch keinen Unterschied mehr :roll: Greetz alcaeus |
Re: dynamische TStringList(en)
Zitat:
|
Re: dynamische TStringList(en)
Moin TheAn00bis,
Zitat:
Dass passiert nämlich nicht automatisch. |
Re: dynamische TStringList(en)
Zitat:
|
Re: dynamische TStringList(en)
Zitat:
Zitat:
Hab jetzt die TList-Variante genommen und bin sehr zufrieden! :) |
Re: dynamische TStringList(en)
Moin TheAn00bis,
Zitat:
|
Re: dynamische TStringList(en)
Ein Problem hätte ich doch noch:
Ich hab jetzt eine KartenListeListe, die viele KartenListen enthällt. Alles Typ TList. Die KartenListen enthalten Pointer auf viele TKarten. Eine Funktion von TKarte ist beispielsweise "test". Ihr Ergebnis ist vom Typ String. Wie weise ich jetzt einer Variable den Wert dieser Funktion zu? Beispielsweise nehme ich aus KartenListeListe die erste KartenListe und daraus die zweite Karte (und davon eben die Funktion "Test"). Ich habe nur einige Ideen und die scheinen alle absolut nicht zu funktionieren. |
Re: dynamische TStringList(en)
Delphi-Quellcode:
Wenn du mehrere Funktionen der entsprechenden Klasse benutzen willst, kannst du es auch so machen:
procedure a;
var s: string; begin s := KartenListeListe1.KartenListe1.Karte2.Test; end;
Delphi-Quellcode:
procedure a;
var s: string; begin with KartenListeListe1.KartenListe1.Karte2 do begin s := Test; end; end; |
Re: dynamische TStringList(en)
Danke, aber die Listen in KartenListeListe werden dynamisch erstellt und haben alle den selben Namen. (oder!?) Jedenfalls erstelle ich die so:
Delphi-Quellcode:
Jetzt will ich aus jeder Karte davon den string auslesen können. Wie komme ich jetzt an den string einer beliebigen Karte? (wäre schön mit Variable für die Nummer der KartenListe und der Karte)KartenListeListe:=TList.Create; for i:=1 to 5 do begin KartenListe:=TList.Create; KartenListeListe.Add(KartenListe); end; for i:=1 to 5 do begin Karten:=TKArte.Create; TList(KartenListeListe[i]).add(Karte); end; |
Re: dynamische TStringList(en)
Zitat:
Delphi-Quellcode:
Aber lass mich raten: die zwei Listen stellen ein zweidimensionales Array von Kartenteilen dar? Dann würde ich alcaeus' ObjetList-Template auf zwei Indizes umschreiben, das wird dir die Arbeit erheblich erleichtern.
TKarte(TList(KartenListeListe[i]).Items[ii]).Test
|
Re: dynamische TStringList(en)
Zitat:
Klar, dann muss da TKarte hin... gar nicht dran gedacht :|. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:44 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