![]() |
Delphi-Version: XE3
Markierung verschiebt sich in jeder Zeile
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
heute mal eher eine Grundlagenfrage: Ich habe ein Richedit. Ich füge mit einer Funktion Zeilen hinzu, welche aus einer "Überschrift" und einem dazu gehörenden Text bestehen. Die Überschrift wird dann Fett formatiert und der andere Text normal.
Code:
Jetzt rufe ich die Funktion ein paar mal auf und der bearbeitete Text verschiebt sich in jeder Zeile einen weiter nach rechts (Bild mit dem Resultat im Anhang):
procedure TForm1.addZeile(sUeberschrift, sText: String);
begin memoMessage.Lines.Add(sUeberschrift + sText); if sUeberschrift <> '' then begin memoMessage.SelStart := Pos (sUeberschrift, memoMessage.Text)-1; memoMessage.SelLength := Length (sUeberschrift); memoMessage.SelAttributes.Style:=[fsBold]; memoMessage.SelLength := 0; end; if sText <> '' then begin memoMessage.SelStart := Pos (sText, memoMessage.Text)-1; memoMessage.SelLength := Length (sText); memoMessage.SelAttributes.Style:=[]; memoMessage.SelLength := 0; end; end;
Code:
Was kann ich tun, um diese Verschiebung zu verhindern?
Form1.addZeile('erste ', 'Zeile');
Form1.addZeile('zweite ', 'Zeile'); Form1.addZeile('dritte ', 'Zeile'); Form1.addZeile('vierte ', 'Zeile'); Form1.addZeile('fünfte ', 'Zeile'); |
AW: Markierung verschiebt sich in jeder Zeile
Du darfst nicht Pos nehmen, sondern "solltest" die SuchFunktion (Find) des RichEdits verwenden, da sie im internen Speicher sucht, ohne diese fahrlässige Manipulation von Delphi.
Embarcadero war bei deiner Implementation extrem doof und wandelt den intenen Zeilenumbruch #10 des RichEdits in #13#10 um, aber nicht beim Zugriff aus SelStart und SelLength. Und trotz mehrerer QC-Einträge wird das seit vielen, vielen, vielen Jahren nicht repariert. Oder du mußt den ausgelesenen Text wieder zurückumwandeln, also #13#10 > #10. |
AW: Markierung verschiebt sich in jeder Zeile
Vielen Dank für die Antwort.
Ich hab dem Form nun eine private Integer Variable gegeben, die ich beim Create auf 0 setze. Jedes mal wenn ich die AddZeile Prozedur aufrufe, erhöhe ich als erstes diesen Wert um 1. und anschließend ziehe ich ihn nun anstelle der 1 vom Pos ab, um die SelStart zu erhalten. Das war wenig Aufwand und klappt :) |
AW: Markierung verschiebt sich in jeder Zeile
Vielleicht auch einfach so (schnell heruntergetippelt, Komponenten nicht einmal umbenannt):
Delphi-Quellcode:
procedure TForm6.AddZeile(sHeader, sText: string);
var TotalLength: integer; begin TotalLength := Length(sHeader) + Length(sText); RichEdit1.Lines.Add(sHeader + sText); RichEdit1.SelStart := RichEdit1.SelStart - Succ(TotalLength); RichEdit1.SelLength := Length(sHeader); RichEdit1.SelAttributes.Style := RichEdit1.SelAttributes.Style + [fsBold]; RichEdit1.SelStart := RichEdit1.SelStart + TotalLength; RichEdit1.SelAttributes.Style := RichEdit1.SelAttributes.Style - [fsBold]; end; |
AW: Markierung verschiebt sich in jeder Zeile
Davon ausgehend, das Selstart genau den Punkt zeigt, an dem man in ein RichEdit einfügt, kann man ohne große Rechnerei auch folgendes machen:
Delphi-Quellcode:
procedure TForm1.addZeile(sUeberschrift, sText: String);
begin memoMessage.SelAttributes.Style := [fsBold]; memoMessage.SelText := sUeberschrift + ' '; memoMessage.SelAttributes.Style := []; memoMessage.SelText := sText + #13; end; |
AW: Markierung verschiebt sich in jeder Zeile
Zitat:
|
AW: Markierung verschiebt sich in jeder Zeile
Zitat:
Meinem Versändis nach wird alles aktuell Markierte so durch die sUeberschrift überschreiben und der sText überschreibt/löscht danach auch nochmal die sUeberschrift. |
AW: Markierung verschiebt sich in jeder Zeile
Bin mir nicht sicher, aber wenn SelText leer ist, so gilt das gemachte quasi ab Cursorposition.
Also ungefähr so:
Delphi-Quellcode:
Ist SelText nicht leer, ergibt sich ein vollkommen anderes Verhalten.
procedure TForm1.addZeile(sUeberschrift, sText: String);
begin // ab der aktuellen Curosrposition wird alles Fett. memoMessage.SelAttributes.Style := [fsBold]; // sUeberschrift an der Cursorposition einfügen, // der Cursor wandert entsprechend weiter. memoMessage.SelText := sUeberschrift + ' '; // ab der aktuellen Cursorposition, die sich nun hinter // dem sUeberschrift folgenden Leerzeichen befindet, // Text ohne besondere Formatierung. memoMessage.SelAttributes.Style := []; // Und nun hinter o. g. Leerzeichen sText einfügen und // 'nen Zeilenumbruch dranhängen. memoMessage.SelText := sText + #13; end; |
AW: Markierung verschiebt sich in jeder Zeile
Jupp, WENN SelText vorher leer ist
und beim Zuweisen von sText ist SelText nicht leer, da dort ja noch sUeberschrift selektiert ist. |
AW: Markierung verschiebt sich in jeder Zeile
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 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