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 Array of TStringList erzeugen (https://www.delphipraxis.net/45195-array-tstringlist-erzeugen.html)

malo 1. Mai 2005 18:51


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:
Tokens[0] := TStringList.Create
Wie kann ich denn aber sonst mit einem Stringlisten-array arbeiten? :?

malo 1. Mai 2005 19:07

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:
constructor TTokenizer.Create;
begin
  Tokens[0] := TStringList.Create;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  Tokenizer := TTokenizer.Create;
end;
Und einmal die Klassendeklaration von TTokenizer und var-Abschnitt:

Delphi-Quellcode:
type
  TTokenizer = class(TObject)
    private

    public
      Tokens: array of TStrings;

      constructor Create;
    end;

var
  Form2: TForm2;
  Tokenizer: TTokenizer;
  Parse: TParse;
Das bringt mir eine Speicher-Zugriffsverletzung... :?

Nils_13 1. Mai 2005 19:10

Re: Array of TStringList erzeugen
 
Hi,

der Code läuft zwar nicht könnte dir aber evtl. weiterhelfen

Delphi-Quellcode:
  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;
Der Codeschnipsel schon, du musst dir halt noch gedanken darüber machen wie du den Parser aufrufst.

malo 1. Mai 2005 19:26

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.

Christian Seehase 1. Mai 2005 19:30

Re: Array of TStringList erzeugen
 
Moin Malo,

ich denke mal, der Fehler liegt hier:

Delphi-Quellcode:
Tokens: array of TStrings;
TStrings ist eine abstrakte Klasse, von der man keine Instanzen bilden sollte.
Nimm TStringList.

alcaeus 1. Mai 2005 19:32

Re: Array of TStringList erzeugen
 
Zitat:

Zitat von Christian Seehase
Moin Malo,

ich denke mal, der Fehler liegt hier:

Delphi-Quellcode:
Tokens: array of TStrings;
TStrings ist eine abstrakte Klasse, von der man keine Instanzen bilden sollte.
Nimm TStringList.

Nein. Er erstellt keine Instanz von TStrings, sondern von TStringList. Allerdings kann man aufgrund des OOP-Prinzips einer TStrings-Variable auch ein TStringList-Objekt zuweisen.
Aber einen versuch waere es wert.

Greetz
alcaeus

malo 1. Mai 2005 19:33

Re: Array of TStringList erzeugen
 
Zitat:

Zitat von Christian Seehase
Moin Malo,

ich denke mal, der Fehler liegt hier:

Delphi-Quellcode:
Tokens: array of TStrings;
TStrings ist eine abstrakte Klasse, von der man keine Instanzen bilden sollte.
Nimm TStringList.

Wie alcaeus bereits sagte, erzeuge ich eine Instanz von TStringList. Funktioniert aber trotzdem nicht... :(

//edit: Es liegt aber am Array. Wenn ich eine einfache Instanz von TStringList erzeuge, funktioniert es wunderbar ;)

Christian Seehase 1. Mai 2005 19:35

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

malo 1. Mai 2005 19:36

Re: Array of TStringList erzeugen
 
:wall: Hab ich auch grade rausgefunden. Hab mich nämlich an ein ähnliches Array-Problem vorher erinnert... funktioniert jetzt :)

Muetze1 1. Mai 2005 21:59

Re: Array of TStringList erzeugen
 
Moin!

Und warum nicht einfacher mit einer TObjectList aus der Contnrs.pas anstatt einem dynamischen Arrays?

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:18 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