Discussion:
TStringList fuer Spezialisten
(zu alt für eine Antwort)
Nicole Wagner
2010-09-08 16:08:44 UTC
Permalink
Hallo User,

ich habe ein TStringList, das ich immer wieder ergaenze mit
StringList.Add('...');

Die Zeilen des SLs zeigen, was ich hineingeschrieben habe.
Jedoch
StringList.text
zeigt mir mehr, als ich erwarte.
Und zwar lese ich im Vorschaufenster (und auch sonst in div. Konnex):
'mein_Eintrag+'#$D#$A

Dieses #$D#$A taucht auf, sobald ich ".Add" ausgefuehrt habe.
Also auch bei .Add('').
Bevor die Funktion .Add aufgerufen wird, bleibt
StringList.text auf dem Wert ''
danach haengt hinten ein #$D#$A

Hat jemand eine Idee, wie ich die Zeichen in StringList.text
kontrollieren kann?
Kann mir jemand sagen, wofür es steht? Ist das nur ein Zeilenumbruch,
wie ich ihn nicht kenne? Wenn ja, wie geht er weg?

Ich benutze Delphi 2010.
Danke fuer Tipps!

Nicole
Jens-Erich Lange
2010-09-08 16:36:12 UTC
Permalink
Ja es ist der Zeilenumbruch, also keine Panik! Alles in Ordnung :-)
#$D steht für den Character von $0D aka CR (Carrige Return)
#$A steht für den Character von $0A aka LF (Line Feed)

Unter Windows ist die Zeichenfolge CR/LF der Standard-Zeilenumbruch.
Christian Gudrian
2010-09-08 16:46:17 UTC
Permalink
Post by Nicole Wagner
Ist das nur ein Zeilenumbruch,
Ja.
Post by Nicole Wagner
wie ich ihn nicht kenne?
Welchen kennst Du denn?
Post by Nicole Wagner
Wenn ja, wie geht er weg?
SL.LineBreak := '';

Ich weiß aber nicht, seit wann das geht.

Christian
Nicole Wagner
2010-09-08 18:47:04 UTC
Permalink
Post by Christian Gudrian
SL.LineBreak := '';
ah danke!
Das hatte ich jetzt ueberlesen,

Ich habe nur ein Problem:
Wenn ich Einträge habe, dann moechte ich den Zeilenumbruch durchaus
drin haben. Ich will ihn nur nicht, wenn ich NUR leere Zeilen
gespeichert habe.
Muss ich jeden Eintrage mit if.. then.. add schreiben? ;-(
Oder gibt es da noch etwas anderes?

"Text ohne Steuerzeichen" ist es, was ich will.


Nicole
Günter Kieninger
2010-09-09 06:03:24 UTC
Permalink
Post by Nicole Wagner
Wenn ich Einträge habe, dann moechte ich den Zeilenumbruch durchaus
drin haben. Ich will ihn nur nicht, wenn ich NUR leere Zeilen
gespeichert habe.
Muss ich jeden Eintrage mit if.. then.. add schreiben? ;-(
Oder gibt es da noch etwas anderes?
Klar, gibt es da was:

TMeineStringListDieTutWasIchWill = class(TStringlist)
public
procedure SuperAdd(const value : String);
end;


procedure TMeineStringListDieTutWasIchWill.SuperAdd(const value :
String);
begin
if Value <> '' then Add(Value);
end;

Anwendung dann

var
sl : TMeineStringListDieTutWasIchWill;
begin
sl := TMeineStringListDieTutWasIchWill.Create;
try
sl.SuperAdd(''); // Nix wird gemacht
sl.SuperAdd('EineZeile'); // Wird dazu gehängt.
finally
sl.Free;
end;

end;


Gruß aus den Bergen
Günter
Nicole Wagner
2010-09-08 18:42:44 UTC
Permalink
Nicole Wagner wrote:


danke fuer Eure Antworten.
Und wie bekomme ich den Zeilenumbruch weg?

Ich wollte gerne fragen:
if SL.text <> '' then....



Ich kenne als Zeilenumbruch irgendwas mit der Raute:
#10#13 oder so. Ich muss immer nachschlagen, wenn ich es benoetige.


Nicole
Gerd-Ulrich Meyer
2010-09-08 18:58:28 UTC
Permalink
Hallo,
Post by Nicole Wagner
danke fuer Eure Antworten.
Und wie bekomme ich den Zeilenumbruch weg?
Evtl. nützt dir die Property CommaText etwas? Aus der OH:

Die Eigenschaft CommaText bietet beim Schreiben oder Lesen die
Möglichkeit, sämtliche Listeneinträge eines Objekts von TStrings wie
einen einzigen, durch Kommas getrennten String zu behandeln.

Ist natürlich nur sinnvoll, wenn du nicht zufällig auch noch Kommata in
deinen Strings hast.
Post by Nicole Wagner
if SL.text<> '' then....
Was willst du hinterher damit anfangen?
Post by Nicole Wagner
#10#13 oder so. Ich muss immer nachschlagen, wenn ich es benoetige.
Wenn du mal ein bischen rechnest bekommst du für:
#10 (dezimal 10) --> $A (hexadezimal) --> LF (ASCII)
#13 (dezimal 13) --> $D (hexadezimal) --> CR (ASCII)
Post by Nicole Wagner
Nicole
Gruss

Gerd-Ulrich Meyer
Nicole Wagner
2010-09-09 08:47:08 UTC
Permalink
Gerd-Ulrich Meyer wrote:



danke fuer alle Antworten.
Post by Gerd-Ulrich Meyer
Was willst du hinterher damit anfangen?
Es sind Grafik-Labels.
Gibt es zu einem Punkt in der Grafik was zu sagen, schreibt die
jeweilige Methode es in das StringList.
Beim Zeichnen am Ende wird dann das StringList ausgekippt und der
Inhalt ober den richtigen Punkt gekritzelt.

D.h. ich brauche gut formatierten Text und nur soviel als noetig.
Gerade die Zeilenumbrueche des SLs sind fuer die Formatierung recht
nuetzlich.


Nicole

Arno Garrels
2010-09-08 19:08:47 UTC
Permalink
Post by Nicole Wagner
if SL.text <> '' then....
Dann frage doch einfach SL.Count ab, falls du wissen willst,
ob die Liste leer ist oder nicht.
--
Arno Garrels
Hans-Peter Diettrich
2010-09-08 20:53:03 UTC
Permalink
Post by Nicole Wagner
Die Zeilen des SLs zeigen, was ich hineingeschrieben habe.
Jedoch
StringList.text
zeigt mir mehr, als ich erwarte.
'mein_Eintrag+'#$D#$A
Klar, die Zeilenumbrüche werden von GetText eingefügt, wenn die einzeln
gespeicherten Strings in einen einzigen großen String kopiert werden.

Da die Abfrage von StringList.Text wegen der Kopiererei sehr "teuer"
ist, sollte man ggf. auf andere Komponenten umsteigen (TMemo?), bei
denen der Text schon intern "am Stück" gespeichert ist, und nicht in
einzelnen Zeilen. Kommt drauf an, ob öfters mit einzelnen Zeilen oder
mit dem ganzen Text gearbeitet wird.

Daneben kann man noch eine eigene Stringliste von TStrings ableiten, die
intern so funktioniert, wie das für die jeweilige Anwendung am besten ist.

DoDi
Loading...