Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TRichedit und Hideselection (https://www.delphipraxis.net/198486-trichedit-und-hideselection.html)

Maekkelrajter 6. Nov 2018 22:32


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:

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz