![]() |
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... ;) |
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.
|
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 |
Re: TStringList: Arbeiten ohne Add-Methode
Zitat:
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: |
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 ;) |
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:
|
Re: TStringList: Arbeiten ohne Add-Methode
Zitat:
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) ;) |
Re: TStringList: Arbeiten ohne Add-Methode
Hallo Calvin,
ich würde sagen, poste doch mal einen Codeauszug... :-D Gruß, Marco |
Re: TStringList: Arbeiten ohne Add-Methode
Zitat:
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; |
Re: TStringList: Arbeiten ohne Add-Methode
Zitat:
Die Stringliste speichert seinen Inhalt in einem Array von TStringItem, dass sich wie folgt zusammen setzt:
Delphi-Quellcode:
Interessanterweise es sich dabei um einen Pointer auf ein statisches Array von 0 bis MaxInt-Sechzehntel von TStringItem.
TStringItem = record
FString: string; FObject: TObject; end; Genug kluggeschissen für heute. :mrgreen: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 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