Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringList: Arbeiten ohne Add-Methode (https://www.delphipraxis.net/47112-tstringlist-arbeiten-ohne-add-methode.html)

malo 6. Jun 2005 21:03


TStringList: Arbeiten ohne Add-Methode
 
Hi!

Ich nutze in einem Projekt eine TStringList. Allerdings muss ich einen Text Zeichen für Zeichen durchgehen, um sie dann in die StringListe einzulesen (jedenfalls nach meiner momentanen Planung). Da ich jedoch Probleme hätte, dort mit der Add-Methode zu arbeiten, will ich dort einfach nur auf den nächsten Index der StringListe zugreifen. Meine Frage dazu:

Muss ich dabei für die StringListe Speicher reservieren via SetLength, oder ist das nicht nötig? Oder kann ich vielleicht eine Add-Methode aufrufen, und einen leeren String übergeben, bevor ich den Index bearbeite? (wenn letzteres ohne Probleme funktionieren würde, wär die Sache auch schon erledigt) ;)

Nachtrag: Letztere Methode ist eher eine theoretische Frage, ob es damit keine Schwierigkeiten gibt... ;)

alzaimar 6. Jun 2005 21:07

Re: TStringList: Arbeiten ohne Add-Methode
 
Intern werden in einer TStringlist die Zeilen als ein String abgelegt. Die Zeilen sind durch CRLF voneinander getrennt. Du kannst erstens 10000x Add('') aufrufen, oder 100000xCRLF hinereinander in die Property'Text' schreiben, wie's beliebt. Aber ich versteh nicht, was Du gegen 'Add' hast.

Pr0g 6. Jun 2005 21:08

Re: TStringList: Arbeiten ohne Add-Methode
 
Genau verstanden wo dein Problem ist, habe ich nicht. Aber wenn du einen Text zeichenweise in die StringList packen willst, dann kannst du ihn doch in eine normale Stringvariable packen und diese dann per Add() einfügen, oder was meinst du?

MfG Pr0g

Robert_G 6. Jun 2005 21:27

Re: TStringList: Arbeiten ohne Add-Methode
 
Zitat:

Zitat von alzaimar
Intern werden in einer TStringlist die Zeilen als ein String abgelegt. Die Zeilen sind durch CRLF voneinander getrennt. Du kannst erstens 10000x Add('') aufrufen, oder 100000xCRLF hinereinander in die Property'Text' schreiben, wie's beliebt. Aber ich versteh nicht, was Du gegen 'Add' hast.

Nene du... ;)
Text ist eine Property, die aus den einzelnen Strings zusammengestzt wird.
Ein bestzen von Text bewirkt ein Zerpflücken in einzelne Strings, die wiederrum eingefügt werden.
als Tlist Descendant ist TStringList nix weiter als eine komfortable Kapselung eines PPointerArrays, spezialisiert um Strings zu halten. ;)
100.000-mal Text zu besetzen könnte ziemlich hart auf den Magen des Lesers oder die Performance schlagen. Wohl eher beides. :mrgreen:

malo 6. Jun 2005 21:30

Re: TStringList: Arbeiten ohne Add-Methode
 
Naja... das ganze ist so:

Ich habe einen String, der aufgesplittet werden soll. Ich will den in ein 2dimensionales Array reinschreiben, in meinem Fall also ein Array of TStringList (bzw. mit TObjectList gelöst).

Das ganze ist für eine "Mini-Programmiersprache", die ich grade entwickle. Wenn ich beispielsweise folgenden "Code" hab:

[code]a + b = c;
x + y = z;[/delphi]

Dann geh ich per Schleife durch. Das "a" kommt in den ersten Eintrag der Stringlist, das + in den zweiten, das b in den 3. etc. Beim ";" springe ich in die nächste StringListe.

Ich prüfe anhand von verschiedenen Regeln, ob ein neuer eintrag in die Stringliste gemacht wird, oder nicht. Bisher hab ich da immer nur die Index-Variable (die den aktuellen Index der StringListe ausgibt) um 1 erhöht. Meine Frage war jedoch, ob ich in irgendeiner Weise dafür noch Speicher reservieren muss. Normalerweise reserviert Add() imho den Speicher. Aber da ich bisher immer auf Add verzichtet hab (einfach nur die Indexvariable erhöhen war einfacher), weiß ich nicht, ob ich nun den Speicher manuell reservieren muss oder ob das automatisch geht ;)


PS: Kommentare über meine allgemeine Vorgehensweise nicht erbeten. Ich hab jetzt so angefangen und zieh das auch durch ;)

Robert_G 6. Jun 2005 21:32

Re: TStringList: Arbeiten ohne Add-Methode
 
Dein Problem kapiere ich beim besten Willen nicht. Ist doch viel lesbarer und simpler einfach immer etwas anzufügen... :gruebel:

malo 7. Jun 2005 15:35

Re: TStringList: Arbeiten ohne Add-Methode
 
Zitat:

Zitat von Robert_G
Dein Problem kapiere ich beim besten Willen nicht. Ist doch viel lesbarer und simpler einfach immer etwas anzufügen... :gruebel:

Aber nicht, wenn man nur EIN ZEICHEN anhängen muss und dann noch diesen Index der StringListe bearbeiten muss. Ich weiß nämlich nicht, wann ein Teil-String anfängt, sondern nur, wann er endet (da, wo ich die Indexvariable erhöhe).

Liegt ein wenig daran, wie ich das ganze programmiert hab.


Meine Frage wurde jedoch imho noch nicht klar beantwortet. Ich wollte nämlich nur wissen, ob es so in Ordnung ist, wenn ich es auf einem der oben beschriebenen Wege mach (bzw. ob ich Speicher mit Setlength reservieren muss) ;)

Marphy 7. Jun 2005 15:54

Re: TStringList: Arbeiten ohne Add-Methode
 
Hallo Calvin,
ich würde sagen, poste doch mal einen Codeauszug... :-D

Gruß, Marco

alzaimar 7. Jun 2005 16:02

Re: TStringList: Arbeiten ohne Add-Methode
 
Zitat:

Meine Frage wurde jedoch imho noch nicht klar beantwortet. Ich wollte nämlich nur wissen, ob es so in Ordnung ist, wenn ich es auf einem der oben beschriebenen Wege mach (bzw. ob ich Speicher mit Setlength reservieren muss)
1. mit Add('') und dann aList[aList.count - 1] := aList[aList.count - 1] + aNewChar gehts.
2. Für SetLength sehe ich keine Möglichkeit.

Warum nicht so:
Delphi-Quellcode:
Procedure LineToStrings (aInput : String; aSrc : TStringList);
Var
  aStart, i, n : Integer;
  aLine : String;

Begin
  aSrc.Clear;
  aStart := 1; // Index auf das erste Zeichen der aktuellen Zeile
  aInput := aInput + ccEOF; // sicherstellen, das auch die LETZTE Zeile erkannt wird.
  For i:=1 To Length (aInput) do
    If aInput[i] in [';', ccEOF] then Begin   // Zeilenende erreicht?
      // Die Zeile ist zwischen aStart und i-1
      aLine := Trim (Copy (aInput, aStart, i - aStart));
      If aLine<>'' Then aSrc.Add (aLine);
      aStart := i + 1;
      End;
End;

Sanchez 7. Jun 2005 20:56

Re: TStringList: Arbeiten ohne Add-Methode
 
Zitat:

Zitat von Robert_G
...als Tlist Descendant ist TStringList nix weiter als eine komfortable Kapselung eines PPointerArrays,...

:warn: TStringList ist ein Nachfahre von TStrings, was wiederum ein Nachfahre von TPersistent ist.
Die Stringliste speichert seinen Inhalt in einem Array von TStringItem, dass sich wie folgt zusammen setzt:

Delphi-Quellcode:
  TStringItem = record
    FString: string;
    FObject: TObject;
  end;
Interessanterweise es sich dabei um einen Pointer auf ein statisches Array von 0 bis MaxInt-Sechzehntel von TStringItem.

Genug kluggeschissen für heute. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 Uhr.
Seite 1 von 2  1 2      

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