Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi dynamische TStringList(en) (https://www.delphipraxis.net/53848-dynamische-tstringlist-en.html)

TheAn00bis 23. Sep 2005 17:39


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:
procedure xyz;
var liste1, liste2, liste3: TStringList;
begin
liste1:=TStringList.Create;
liste2:=TStringList.Create;
liste3:=TStringList.Create;
end;
Aber das müsste doch auch irgendwie so gehen (oder?):

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;

SirThornberry 23. Sep 2005 17:44

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;

TheAn00bis 23. Sep 2005 21:49

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...

arbu man 23. Sep 2005 21:53

Re: dynamische TStringList(en)
 
Wie wäre es dann mit einen Array of TStringlist oder immer wieder gut eine TObjecktlist

TheAn00bis 23. Sep 2005 21:58

Re: dynamische TStringList(en)
 
Zitat:

Zitat von arbu man
Wie wäre es dann mit einen Array of TStringlist oder immer wieder gut eine TObjecktlist

Oh wow, manchmal sieht man den Wald vor lauter Bäumen nicht. ;)

Danke für den Tip.

Christian Seehase 23. Sep 2005 22:06

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:
TStringList(LStringlistList[0]).Add('Zeile der ersten StringListe hinzufügen');
Bei TList musst Du Dich aber auch darum kümmern, dass die Objekte wieder freigegeben werden, wenn Du sie nicht mehr brauchst:

Delphi-Quellcode:
 for LCount := 0 to 4 do
  begin
    TStringList(LStringlistList).Free;
  end;
Wenn Du, wie schon vorgeschlagen wurde, Hier im Forum suchenTObjectList verwendest, kannst Du Dir das u.U. sparen, wenn Du diese mit Create(true) aufrufst.

Grishnak 23. Sep 2005 22:21

Re: dynamische TStringList(en)
 
Ich empfehle dir eine abgeleitete Klasse von TObjectList:

Delphi-Quellcode:
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;
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.

//EDIT: wenn du eine TObjectList verwenden willst, musst du im USES-Abschnitt noch "Contnrs" einbinden!

alcaeus 24. Sep 2005 08:36

Re: dynamische TStringList(en)
 
Christian sagt ObjectList, Grishnak sagt typisierte ObjectList (Typecast sparen), ich sag ObjectList-Descendent mit Templates :mrgreen:

Der Vorteil? Du schreibst insg. 5 Zeilen Code in eine leere Unit und das wars:
Delphi-Quellcode:
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.
Besser kanns (fast) nicht mehr werden, oder? :mrgreen:

Greetz
alcaeus

TheAn00bis 24. Sep 2005 09:22

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?

bttb930 24. Sep 2005 09:25

Re: dynamische TStringList(en)
 
Zitat:

Zitat von alcaeus
Christian sagt ObjectList, Grishnak sagt typisierte ObjectList (Typecast sparen), ich sag ObjectList-Descendent mit Templates :mrgreen:

Der Vorteil? Du schreibst insg. 5 Zeilen Code in eine leere Unit und das wars:
Delphi-Quellcode:
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.
Besser kanns (fast) nicht mehr werden, oder? :mrgreen:

Greetz
alcaeus

Was ist das denn für ein Gehacke??? Und ist das hilfreich um einem Anfänger ein Problem zu erklären? Sicher nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 Uhr.
Seite 1 von 3  1 23      

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