Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TRichEdit - Lines.Add kein Zeilenumbruch hinzufügen


Biarchiv - Do 12.05.11 17:01
Titel: TRichEdit - Lines.Add kein Zeilenumbruch hinzufügen
Hallo,

bei TRichEdit. Gibt es da einen Befehl das ich Text am Ende hinzufügen kann ohne Zeilenumbruch?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
RichEdit1.Lines.Add('1');
RichEdit1.Lines.Add('2');
RichEdit1.Lines.Add('3');

Resultat:
1
2
3



Delphi-Quelltext
1:
2:
3:
4:
5:
RichEdit1.Lines.???('1');
RichEdit1.Lines.???('2');
RichEdit1.Lines.???('3');

Resultat: 123


jaenicke - Do 12.05.11 17:07


Delphi-Quelltext
1:
2:
3:
RichEdit1.Text := RichEdit1.Text + '1' + '2' + '3';

Resultat: 123
:mrgreen:


Biarchiv - Do 12.05.11 17:09

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
RichEdit1.Text := RichEdit1.Text + '1' + '2' + '3';

Resultat: 123
:mrgreen:


Hallo,

ich muss es am Ende von einem Text hinzufügen. Allerdings werden verschiedene Werte zeit versetzt abgefragt. Somit ginge das nicht.


jaenicke - Do 12.05.11 17:31

user profile iconBiarchiv hat folgendes geschrieben Zum zitierten Posting springen:
ich muss es am Ende von einem Text hinzufügen. Allerdings werden verschiedene Werte zeit versetzt abgefragt. Somit ginge das nicht.
Warum nicht? Ich dachte du willst einfach ans Ende des aktuellen Textes einen weiteren hinzufügen. Das geht genau so. :nixweiss:


Biarchiv - Do 12.05.11 18:09

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBiarchiv hat folgendes geschrieben Zum zitierten Posting springen:
ich muss es am Ende von einem Text hinzufügen. Allerdings werden verschiedene Werte zeit versetzt abgefragt. Somit ginge das nicht.
Warum nicht? Ich dachte du willst einfach ans Ende des aktuellen Textes einen weiteren hinzufügen. Das geht genau so. :nixweiss:


Hallo,

SORRY. Geht doch, war mein Fehler. Danke für den TIPP.


Lannes - Do 12.05.11 18:31

Hallo,

schneller dürfte das sein:


Delphi-Quelltext
1:
2:
3:
4:
RichEdit.SelStart := MAXINT; //einmalig setzen
RichEdit.SelText := '1';
RichEdit.SelText := '2';
RichEdit.SelText := '3';


so wird nicht jedesmal der komplette Text des RichEdit bearbeitet, SelStart wird automatisch weitergeschoben.


jaenicke - Do 12.05.11 18:51

Findest du den Code intuitiv verständlich?

Was die Geschwindigkeit angeht: Die dürfte hier nachrangig sein. Aber warum du meinst, dass es schneller ist, wenn das RichEdit erst feststellen muss wo der Text eingefügt werden muss, um dann den Text vorher und nachher (hier eben leer) damit zusammenzusetzen, ist mir nicht klar. :gruebel:


Lannes - Fr 13.05.11 14:36

Ich finde ihn verständlich, an der Position des Cursors wird Text eingefügt.

Die Vorgehensweise mit Text := Text + 'string' ist bei einem RichEdit außerdem falsch, es bewirkt ein Löschen eventuell gesetzter Formatierungen. Habe ich keinen formatierten Text ist das RichEdit überdimensioniert, dann ist ein Memo passender. Aus diesem Grund und weil das setzen von Text bei SelStart das schnellste ist nutze ich das eigentlich nur noch.

Ob die Geschwindigkeit nachrangig ist kann nur der Threadstarter sagen.

Was nun genau im RichEdit abläuft, wenn bei SelStart Text eingefügt wird, entzieht sich meiner Kenntnis. Ich kenne die internen Vorgänge(rich*.dll) nicht.
Fakt ist das mit Text := Text + 'string' jedesmal der gesamte Text im RichEdit ausgetauscht wird. Es muss ja erst ein String aus dem RichEdit geholt/zusammengesetzt und dann wieder eingefügt werden.

Mit Sicherheit wird nicht der gesamte String(Text) neu zusammengesetzt/erweitert, wenn Text bei SelStart eingefügt wird, diese Aussage kann ich aus den ermittelten Geschwindigkeiten ableiten.

Hab mal eine Testumgebung erstellt in der in einem RichEdit vorab 500 Zeilen mit je 100 Zeichen angelegt werden.
Eine anschließend ausgeführte Schleife mit 1000 Durchgängen ergab folgende Werte:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Code                                                     | Millisekunden  
-------------------------------------------------------------------------
RichEdit.Text := RichEdit.Text + 'Y';                    |    11800  
-------------------------------------------------------------------------
s := RichEdit.Lines[Pred(RichEdit.Lines.Count)];         |      313
RichEdit.Lines[Pred(RichEdit.Lines.Count)] := s + 'Y';   |
-------------------------------------------------------------------------
RichEdit.SelText := 'Y';                                 |       78 
-------------------------------------------------------------------------
s := s + 'Y';                                            |        0
RichEdit.Lines.Add(s);                                   |
-------------------------------------------------------------------------

Die Variante RichEdit.SelText := 'Y' hat den Vorteil das man während des Einfügens Formatierungen setzen kann.

Um das ganze auf die Spitze zu treiben noch die Variante mit Lines.Add geändert und es wird noch schneller.


Delphi-Quelltext
1:
2:
s := s + 'Y';
RichEdit.SelText := s + #13#10;

Das Hinzufügen von Zeilen auf diese Art ist ca. 3x schneller als Add().