AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

dynamische TStringList(en)

Ein Thema von TheAn00bis · begonnen am 23. Sep 2005 · letzter Beitrag vom 27. Sep 2005
Antwort Antwort
Seite 1 von 3  1 23   
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#1

dynamische TStringList(en)

  Alt 23. Sep 2005, 17:39
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;
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: dynamische TStringList(en)

  Alt 23. Sep 2005, 17:44
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#3

Re: dynamische TStringList(en)

  Alt 23. Sep 2005, 21:49
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...
  Mit Zitat antworten Zitat
Benutzerbild von arbu man
arbu man

Registriert seit: 3. Nov 2004
Ort: Krefeld
1.108 Beiträge
 
Delphi 7 Professional
 
#4

Re: dynamische TStringList(en)

  Alt 23. Sep 2005, 21:53
Wie wäre es dann mit einen Array of TStringlist oder immer wieder gut eine TObjecktlist
Björn
>> http://bsnx.net <<
Virtual DP Stammtisch v1.0"iw" am 19.09.2007 - ich war dabei!
  Mit Zitat antworten Zitat
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#5

Re: dynamische TStringList(en)

  Alt 23. Sep 2005, 21:58
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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.262 Beiträge
 
Delphi 2006 Professional
 
#6

Re: dynamische TStringList(en)

  Alt 23. Sep 2005, 22:06
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:

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Grishnak
Grishnak

Registriert seit: 15. Sep 2005
Ort: Neu-Ulm
111 Beiträge
 
RAD-Studio 2009 Arc
 
#7

Re: dynamische TStringList(en)

  Alt 23. Sep 2005, 22:21
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!
Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: Dietersheim b. München
6.536 Beiträge
 
#8

Re: dynamische TStringList(en)

  Alt 24. Sep 2005, 08:36
Christian sagt ObjectList, Grishnak sagt typisierte ObjectList (Typecast sparen), ich sag ObjectList-Descendent mit Templates

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?

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#9

Re: dynamische TStringList(en)

  Alt 24. Sep 2005, 09:22
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?
  Mit Zitat antworten Zitat
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#10

Re: dynamische TStringList(en)

  Alt 24. Sep 2005, 09:25
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf