AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TRichedit und Hideselection

Ein Thema von Maekkelrajter · begonnen am 6. Nov 2018
Antwort Antwort
Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
156 Beiträge
 
Delphi 12 Athens
 
#1

TRichedit und Hideselection

  Alt 6. Nov 2018, 23:32
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
Miniaturansicht angehängter Grafiken
zeilenmarkiert.jpg   zeilenrot.jpg  

Geändert von Maekkelrajter ( 7. Nov 2018 um 13:29 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:31 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