![]() |
Array of TStringList erzeugen
Hi!
Ich will für meinen Parser ein StringList-Array haben. Dazu hab ich schön ein array of TStrings deklariert. Jetzt will ich das Array mit dem Index 0 erzeugen. Bei folgendem Code denkt der Compiler aber, ich will auf einen String meiner StringListe zugreifen:
Delphi-Quellcode:
Wie kann ich denn aber sonst mit einem Stringlisten-array arbeiten? :?
Tokens[0] := TStringList.Create
|
Re: Array of TStringList erzeugen
:oops: Falscher Alarm, hatte zum Probieren das "array of" weggelassen :duck:
Allerdings wird eine Exception ausgelöst. Einmal die beiden einzigen Prozeduren in meinem Code:
Delphi-Quellcode:
Und einmal die Klassendeklaration von TTokenizer und var-Abschnitt:
constructor TTokenizer.Create;
begin Tokens[0] := TStringList.Create; end; procedure TForm2.FormCreate(Sender: TObject); begin Tokenizer := TTokenizer.Create; end;
Delphi-Quellcode:
Das bringt mir eine Speicher-Zugriffsverletzung... :?
type
TTokenizer = class(TObject) private public Tokens: array of TStrings; constructor Create; end; var Form2: TForm2; Tokenizer: TTokenizer; Parse: TParse; |
Re: Array of TStringList erzeugen
Hi,
der Code läuft zwar nicht könnte dir aber evtl. weiterhelfen
Delphi-Quellcode:
Der Codeschnipsel schon, du musst dir halt noch gedanken darüber machen wie du den Parser aufrufst.
Symbol = class(TObject)
procedure Add( aStr: string; aID: integer); overload; private StringList: TStringList; FList : TList; end; Lexer = class(TObject) constructor Create; private FFileName : string; FData : string; FPos : integer; Table : Symbol; end; { ... } // Parser procedure Symbol.Add(aStr: string; aID: integer); begin StringList.Add(AnsiLowerCase(aStr)); FList.Add(Pointer(aID)); end; // Lexer constructor Lexer.Create; begin Table := Symbol.Create; with Table do begin Add( s_tok_Programm, c_tok_Programm ); Add( s_tok_Unit, c_tok_Unit); Add( s_tok_Interface, c_tok_Interface); Add( s_tok_Implementation, c_tok_Implementation); Add( s_tok_Begin, c_tok_Begin); Add( s_tok_End, c_tok_End); end; end; |
Re: Array of TStringList erzeugen
@Nils: :gruebel: Ich wüsste nicht, wie mir der Code helfen soll. Ganz nebenbei gehts mir grade nur um die Erzeugung des TStringList-Arrays ;)
Gedanken über Parser kommen später. |
Re: Array of TStringList erzeugen
Moin Malo,
ich denke mal, der Fehler liegt hier:
Delphi-Quellcode:
TStrings ist eine abstrakte Klasse, von der man keine Instanzen bilden sollte.
Tokens: array of TStrings;
Nimm TStringList. |
Re: Array of TStringList erzeugen
Zitat:
Aber einen versuch waere es wert. Greetz alcaeus |
Re: Array of TStringList erzeugen
Zitat:
//edit: Es liegt aber am Array. Wenn ich eine einfache Instanz von TStringList erzeuge, funktioniert es wunderbar ;) |
Re: Array of TStringList erzeugen
Moin Andreas,
stimmt auch wieder, die Stelle hatte ich überlesen. @malo: es könnte bei einem dynamischen Array allerdings nicht schaden, wenn Du vor der Benutzung erst einmal Speicher reservierst (setlength). ;-) |
Re: Array of TStringList erzeugen
:wall: Hab ich auch grade rausgefunden. Hab mich nämlich an ein ähnliches Array-Problem vorher erinnert... funktioniert jetzt :)
|
Re: Array of TStringList erzeugen
Moin!
Und warum nicht einfacher mit einer TObjectList aus der Contnrs.pas anstatt einem dynamischen Arrays? MfG Muetze1 |
Re: Array of TStringList erzeugen
Zitat:
Das größte Verständnisproblem bei TList und TObjectList ist bei mir jedoch, wie man einen Typen festlegen kann in einer TList oder TObjectList ;) Da hab ich nämlich noch nichts zu gefunden :oops: |
Re: Array of TStringList erzeugen
Du machst ne ableitung davon und machst für jede Methode ne neue mit deiner Klasse, da die ja von TObject abgeleitet ist, hast du damit kein Problem... :gruebel:
|
Re: Array of TStringList erzeugen
Delphi-Quellcode:
und mittels TypeCast
TObjectList.Items[Index: Integer]: TObject;
Delphi-Quellcode:
ich verwende viel TObjectList, dann muss ich mich nicht um das Freigeben der Objecte kümmern
TStringList(TObjectList.Items[Index]);
Delphi-Quellcode:
property OwnsObjects: Boolean;
|
Re: Array of TStringList erzeugen
Zitat:
Delphi-Quellcode:
:-D Und schon hast du keinen stress mit irgendwelchen blöden pseudo-dynamischen arrays!
var
l:TObjectList; ... l.add(DeinObj); ... deinAnderesObj := l[0] as TDeineKlasse; |
Re: Array of TStringList erzeugen
Zitat:
So da hast mal die wichtigsten:
Delphi-Quellcode:
Den Rest kannst dir ja selbst machen ^^
Unit MaloUtils;
Interface Uses Classes, SysUtils, Contnrs; Type TMaloObj = Class // Dein Obj halt... Private { Private-Deklarationen } Public { Public-Deklarationen } End; Type TMaloObjList = Class( TObjectList ) Private { Private-Deklarationen } Function GetItems( Index: Integer ): TMaloObj; Public { Public-Deklarationen } Procedure Insert( Const Index: Integer; Const MaloObj: TMaloObj ); Function Add( Const MaloObj: TMaloObj ): Integer; Property Items[ Index: Integer ]: TMaloObj Read GetItems; Default; End; Implementation { TMaloObjList } Function TMaloObjList.Add( Const MaloObj: TMaloObj ): Integer; Begin Result := Inherited Add( MaloObj ); End; Function TMaloObjList.GetItems( Index: Integer ): TMaloObj; Begin Result := Inherited Items[ Index ] As TMaloObj; End; Procedure TMaloObjList.Insert( Const Index: Integer; Const MaloObj: TMaloObj ); Begin Inherited Insert( Index, MaloObj ); End; End. Oder nimst Casts wie nen Blöder ^^ Meiner einer schreibt lieber ne Listen Klasse für, ist später lesbarer und schöner zu Warten :zwinker: Bye |
Re: Array of TStringList erzeugen
@Kedariodakon: Dafür kann man lieber eins von diesen tollen delphi-pseudo-templates machen, dann hat man mit vier zeilen code eine solche klasse generisch erzeugt und kann sich den wirklich wichtigen sachen widmen. -> siehe
![]() |
Re: Array of TStringList erzeugen
Irgendwie kapiere ich jetzt immer noch nichts... mit arrays geht das so:
Delphi-Quellcode:
Und mit Klassen muss ich irgendwelche Umwege über irgendwelche Klassen gehen? Wo ist da der Vorteil? Ich sehe da nur unnötige Arbeit drin.
type
TMyType = string; var: MeinArray: array of TMyType; begin TMyType[0] := 'Hallo Welt'; end; |
Re: Array of TStringList erzeugen
Zitat:
Man kann sie einfacher erweitern... Man kann einfacher Werte hinzufügen ( irgendwo irgendwan ^^ )... Man kann einfacher Werte herrauslöschen ( irgendwo irgendwan ^^ )... ... Bye |
Re: Array of TStringList erzeugen
Hallo malo,
das hat den Vorteil dass du ein Element aus dem Mitte der Liste loeschen kannst, ohne nachher das halbe Array verschieben musst. Das wird im Hintergrund fuer dich erledigt, und du kannst dich auf die wichtigen Dinge des Lebens konzentrieren :zwinker: Aber wie maximov gesagt hat, ich kann auch nur die templated Collections empfehlen. Bei einem Blick drauf fuehlt man sich irgendwie frisch verliebt :love: :lol: Greetz alcaeus |
Re: Array of TStringList erzeugen
Zitat:
|
Re: Array of TStringList erzeugen
Zitat:
|
Re: Array of TStringList erzeugen
Zitat:
|
Re: Array of TStringList erzeugen
Delphi-Quellcode:
type
TMyClass = class(TObjectList) private function GetItem(AIndex: Integer): TStringList; protected public procedure NewClass; property Items[AIndex: Integer]: TStringList read GetItem; end; function TMyClass.GetItem(AIndex: Integer): TStringList; begin if AIndex<Count then Result := TStringlist(inherited Items[AIndex]) else Result := nil; end; procedure TMyClass.NewClass; begin Add (TStringList.Create); end; procedure Test; // Vor.: MyClass ist created begin myClass.NewClass; MyClass.Items[0].Add ('Hallo'); end; |
Re: Array of TStringList erzeugen
Öhm???
Also von vorn: Eine TObjectList ist eine Liste! Dieser Liste können Objecte vom Typ TObject hinzugefügt werden. Da alle Klassen von TObject Abgeleitet sind, kannst du jede Klasse da einfach reintun, egal ob das eine TStrings, eine TStringlist oder ein TButton oder Ein TLabel oder oder oder... ist, dies alles past in eine einzige Inztanz... Hinzugefügt werden sie einfach mit Add... So das raushollen ist ein wenig schwieriger, gerade dann, wenn man TLabels, TButtons, TForms und Co darin hat, aber dafür gibts ja abfragen ala
Delphi-Quellcode:
Eigendlich ist das einfachste OOP ...
If ... Is TButton Then ... := As TButton;
Schau doch einfach nochmal eine Seite zurück auf mein Beispiel, mit dem TMaloObj und der TMaloObjList, da ist TMaloObj ein Object (irgendeins) und TMaloObjList ist die Liste zu diesem Object... Wenn du die paar ZEilen dort vom Beispiel verstanden hast, kannst du dir ja mal die dpCollection anschauen, denn es bringt nach meiner Meinung nix, was zu benutzen, was man nicht versteht... Bye |
Re: Array of TStringList erzeugen
Zitat:
@Kedariodakon: Es geht nicht um die dpCollection, sondern eher um die technik des templates. Damit kann man nämlich mit 4 zeilen code eine komplette typisierte objektliste erzeugen. |
Re: Array of TStringList erzeugen
Zitat:
Bye |
Re: Array of TStringList erzeugen
Zitat:
TCollection schluckt nur TCollectionItem-Nachfahren! Will man Objekte verwalten wäre eine TObjectList ein passabler Anfang. ;) Und wen so ein Template interessiert... Nix einfacher als das. ;)
Nix weltbewegendes, auf kein Fall etwas schönes.... aber tierisch praktisch :mrgreen:
Delphi-Quellcode:
Die Verwendung ist denkbar einfach (die 4 Zeilen, von denen maximov sprach ;) )
{$IFNDEF TYPED_OBJECT_LIST_TEMPLATE}
unit TypedObjectList_template; interface uses Contnrs; type _OBJECT_LIST_ITEM_ = TObject; {$ENDIF TYPED_OBJECT_LIST_TEMPLATE} {$IFNDEF TYPED_OBJECT_LIST_TEMPLATE_SECOND_PASS} // Jedi's include to evaluate compiler version... {$INCLUDE Jedi.inc} type _OBJECT_LIST_IENUM_ = interface; _OBJECT_LIST_ENUM_ = class; _OBJECT_LIST_ = class(TObjectList) protected function GetItem(Index: Integer): _OBJECT_LIST_ITEM_; virtual; procedure SetItem(Index: Integer; const Value: _OBJECT_LIST_ITEM_); virtual; public function Add(aObject: _OBJECT_LIST_ITEM_): Integer; reintroduce; virtual; function Extract(Item: _OBJECT_LIST_ITEM_): _OBJECT_LIST_ITEM_; reintroduce; virtual; function Remove(aObject: _OBJECT_LIST_ITEM_): Integer; reintroduce; virtual; function IndexOf(aObject: _OBJECT_LIST_ITEM_): Integer; reintroduce; virtual; procedure Insert(Index: Integer; aObject: _OBJECT_LIST_ITEM_); reintroduce; virtual; function First: _OBJECT_LIST_ITEM_; reintroduce; function Last: _OBJECT_LIST_ITEM_; reintroduce; property Items[Index: Integer]: _OBJECT_LIST_ITEM_ read GetItem write SetItem; default; function GetIEnumerator(): _OBJECT_LIST_IENUM_; {$IFDEF COMPILER9_UP} function GetEnumerator(): _OBJECT_LIST_ENUM_; {$ENDIF COMPILER9_UP} end; _OBJECT_LIST_IENUM_ = interface function MoveNext: Boolean; function GetCurrent: _OBJECT_LIST_ITEM_; property Current: _OBJECT_LIST_ITEM_ read GetCurrent; end; _OBJECT_LIST_ENUM_ = class(TInterfacedObject, _OBJECT_LIST_IENUM_) private fCollection: _OBJECT_LIST_; fIndex: Integer; constructor Create(List: _OBJECT_LIST_); public function MoveNext: Boolean; function GetCurrent: _OBJECT_LIST_ITEM_; property Current: _OBJECT_LIST_ITEM_ read GetCurrent; end; {$ENDIF TYPED_OBJECT_LIST_TEMPLATE_SECOND_PASS} {$IFNDEF TYPED_OBJECT_LIST_TEMPLATE} implementation {$DEFINE TYPED_OBJECT_LIST_TEMPLATE_SECOND_PASS} {$ENDIF TYPED_OBJECT_LIST_TEMPLATE} {$IFDEF TYPED_OBJECT_LIST_TEMPLATE_SECOND_PASS} { _OBJECT_LIST_ITEM_ } function _OBJECT_LIST_.Add(aObject: _OBJECT_LIST_ITEM_): Integer; begin RESULT := inherited Add(aObject); end; function _OBJECT_LIST_.Extract(Item: _OBJECT_LIST_ITEM_): _OBJECT_LIST_ITEM_; begin RESULT := _OBJECT_LIST_ITEM_(inherited Extract(Item)); end; function _OBJECT_LIST_.First: _OBJECT_LIST_ITEM_; begin RESULT := _OBJECT_LIST_ITEM_(inherited First()); end; function _OBJECT_LIST_.GetItem(Index: Integer): _OBJECT_LIST_ITEM_; begin RESULT := _OBJECT_LIST_ITEM_(inherited Items[Index]); end; function _OBJECT_LIST_.IndexOf(aObject: _OBJECT_LIST_ITEM_): Integer; begin RESULT := inherited IndexOf(aObject); end; procedure _OBJECT_LIST_.Insert(Index: Integer; aObject: _OBJECT_LIST_ITEM_); begin inherited Insert(Index, aObject); end; function _OBJECT_LIST_.Last: _OBJECT_LIST_ITEM_; begin RESULT := _OBJECT_LIST_ITEM_(inherited Last()); end; function _OBJECT_LIST_.Remove(aObject: _OBJECT_LIST_ITEM_): Integer; begin RESULT := inherited Remove(aObject); end; procedure _OBJECT_LIST_.SetItem(Index: Integer; const Value: _OBJECT_LIST_ITEM_); begin inherited Items[Index] := Value; end; {$IFDEF COMPILER9_UP} function _OBJECT_LIST_.GetEnumerator: _OBJECT_LIST_ENUM_; begin RESULT := _OBJECT_LIST_ENUM_.Create(self); end; function _OBJECT_LIST_.GetIEnumerator: _OBJECT_LIST_IENUM_; begin RESULT := GetEnumerator(); end; {$ELSE} function _OBJECT_LIST_.GetIEnumerator: _OBJECT_LIST_IENUM_; begin RESULT := _OBJECT_LIST_ENUM_.Create(self); end; {$ENDIF COMPILER9_UP} constructor _OBJECT_LIST_ENUM_.Create(List: _OBJECT_LIST_); begin fIndex := -1; fCollection := List; end; function _OBJECT_LIST_ENUM_.GetCurrent: _OBJECT_LIST_ITEM_; begin RESULT := fCollection.GetItem(fIndex); end; function _OBJECT_LIST_ENUM_.MoveNext: Boolean; begin inc(fIndex); RESULT := (fIndex > -1) and (fIndex < fCollection.Count); end; {$WARNINGS off} {$IFNDEF TYPED_OBJECT_LIST_TEMPLATE} end. {$ENDIF TYPED_OBJECT_LIST_TEMPLATE} {$ENDIF TYPED_OBJECT_LIST_TEMPLATE_SECOND_PASS} {$DEFINE TYPED_OBJECT_LIST_TEMPLATE_SECOND_PASS}
Delphi-Quellcode:
direkt angewand könnte man vor D2005 so durch sie laufen:
interface
uses Contnrs; /// <- wichtig! type TSomeClass = class private fSomeProperty: Integer; public property SomeProperty: Integer read fSomeProperty write fSomeProperty; end; {$DEFINE TYPED_OBJECT_LIST_TEMPLATE} type _OBJECT_LIST_ITEM_ = TSomeClass; {$INCLUDE TypedObjectList_template.pas} TSomeClassList = _OBJECT_LIST_; implementation {$INCLUDE TypedObjectList_template.pas} end.
Delphi-Quellcode:
In D2005 geht nun auch gleich das hier:
with SomeClassList.GetIEnumerator() do
while MoveNext() do WriteLn(Current.SomeProperty);
Delphi-Quellcode:
var
SomeInstance :TSomeClass; begin for SomeInstance in SomeClassList do WriteLn(SomeInstance.SomeProperty); |
Re: Array of TStringList erzeugen
Wenn das nicht einfach ist - abgesehen davon, dass es hässlich aussieht - dann weiss ich auch nicht!
|
Re: Array of TStringList erzeugen
Zitat:
Nur noch benutzen! :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 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