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:
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;
Anschließend sollen nach einer Aktion des Programmes die Markierungen entfernt und die bis dahin markierten Zeilen rot dargestellt werden.
Das funktioniert auch mit der folgenden Sequenz:
Delphi-Quellcode:
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);
[...]
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.
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:
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;
[...]
Nun klappt's wie gewünscht. Manchmal sieht man eben den Wald vor lauter Bäumen nicht!
Gruß LP