![]() |
TRichedit und Hideselection
Liste der Anhänge anzeigen (Anzahl: 2)
In meiner Anwendung habe ich 2 Richedits. In beiden soll jeweils die Zeile unter dem Mauscursor markiert werden. Das funktioniert, da bei beiden Richedits 'HideSelection' auf 'False' gestzt ist.
Delphi-Quellcode:
Anschließend sollen nach einer Aktion des Programmes die Markierungen entfernt und die bis dahin markierten Zeilen rot dargestellt werden.procedure TGL4Mainform.RichEditMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var XR:TExRichedit; Line, Offset, Hpos, len:Integer; P:TPointL; begin XR:= sender as TRichedit; If (button = mbleft) and (XR.Lines.Count > 0) Then with XR do begin p.x := x; p.y := y; Offset := Perform(EM_CHARFROMPOS, 0, Integer(@p)); Line := Perform(EM_LINEFROMCHAR, Offset, 0); HPos := Perform(EM_LINEINDEX, Line, 0); len:= perform(EM_LINELENGTH,Hpos,0); selstart := Hpos + len; sellength := -len; end; end; Das funktioniert auch mit der folgenden Sequenz:
Delphi-Quellcode:
Das Ganze wird bei beiden Richedits durchgeführt und sieht zunächst aus wie gewünscht (s. Screenshots). Anschließend ist es aber leider nicht mehr möglich, in beiden Richedits Zeilen zu markieren, ganz so, als ob 'HideSelection' auf 'True' gesetzt wäre, was aber laut Debugger definitiv nicht der Fall ist. Auch ein erneutes Setzten von HideSelection auf 'False' bringt nichts.Procedure SetLineColor(ARichEdit: TRichEdit; lineNr: Integer; AColor: TColor); begin with ARichEdit do begin selstart := perform(EM_LINEINDEX,lineNr,0); sellength := perform(EM_LINELENGTH,selstart,0); selattributes.color := AColor; end; end; [...] richedit1.Perform(EM_HIDESELECTION,1, 0); setlinecolor(richedit1,line1,clred); [...] Was mache ich falsch? Gruß LP Edit: Mittlerweile habe ich eine Lösung gefunden, die überraschend einfach ist: Einfach Sellength auf 0 setzten. Das hatte ich natürlich schon gestern als erstes probiert. Die Folge war allerdings, dass die Zeile zwar rot gefärbt wurde, aber die Markierung bestehen blieb. Daraufhin kam ich auf die Idee mit der EM_HIDESELECTION Message, was ja auch zunächst zu funktionieren schien. Nun habe einfach ich die Reihenfolge umgekehrt: Zuerst die Zeile rot und erst danach Sellength auf 0:
Delphi-Quellcode:
Nun klappt's wie gewünscht. Manchmal sieht man eben den Wald vor lauter Bäumen nicht!
Procedure SetLineColor(ARichEdit: TRichEdit; lineNr: Integer; AColor: TColor);
begin with ARichEdit do begin selstart := perform(EM_LINEINDEX,lineNr,0); sellength := perform(EM_LINELENGTH,selstart,0); selattributes.color := AColor; end; end; [...] setlinecolor(richedit1,line1,clred); richedit1.Sellength := 0; [...] Gruß LP |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03: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