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/)
-   -   Delphi Click(-Event) auf linken RichEdit-Rand? (https://www.delphipraxis.net/19911-click-event-auf-linken-richedit-rand.html)

TStringlist 10. Apr 2004 19:25


Click(-Event) auf linken RichEdit-Rand?
 
Hallo zusammen,

hoffe meine Frage ist nicht zu speziell. Also, nachdem ich meinem RichEdit-Control mit den folgenden Zeilen...

Delphi-Quellcode:
(var rcWork : TRect;)

  with Richedit1 do begin
    SendMessage(Handle,EM_GETRECT,0,LongInt(@PageRect));
    rcWork.Left  := PageRect.Left + 5;
    rcWork.Right := PageRect.Right;
    rcWork.Top   := PageRect.Top;
    rcWork.Bottom := PageRect.Bottom;
    PageRect     := rcWork;
    SendMessage(Handle,EM_SETRECT,0,LongInt(@PageRect));
  end;
... einen kleinen zusätzlichen linken Rand verpasst habe, würde ich jetzt ganz gerne auch noch etwas die Reaktionen beim Daraufclicken auf eben diesen Rand abändern. Die normale Reaktion ist hier ja bei 1*Click: Markieren der Zeile (+ Aufspannmöglichkeit der Markierung über mehrere Zeilen); bei 2*Click: Markieren aller Zeilen.

Ich würde diese Ereignisse jetzt also gerne ändern und zwar bei 1*Click in: nur Positionieren des Cursors am Anfang der jeweiligen Zeile; bei 2*Click in: so wie bisher bei 1*Click; und bei 3*Click in: so wie bisher bei 2*Click.

Frage also: Gibt es für diesen Bereich vielleicht einen extra Eventhandler (+Pointer dazu) der dafür zuständig ist? (Mit OnMouseDown kann ich zwar feststellen, dass ich auf diesen Bereich geclickt habe, aber wie dann die Reaktionsweisen ändern?) Oder gibt es dafür sonst irgendwie eine Methode mit der man dieses einstellen kann?

Thx schonmal vorneweg.

TStringlist 10. Apr 2004 22:18

Re: Click(-Event) auf linken RichEdit-Rand?
 
Ok, Frage hat sich erledigt. Ich hatte mir das Ganze davor nicht exakt genug angeguckt und wohl etwas zu spontan gefragt. Die normalen Reaktionsweisen sind nämlich etwas anders als ich sie im ersten post beschrieb. Beim ersten normalen Click und beim Doppel-Click sind die Effekte nämlich exakt identisch. Also habe ich beim Doppel- und Trippel-Click damit schon normal das Ergebnis, was ich eigentlich auch nur wollte. Nur beim ersten Click auf diesen Rand markiert er leider schon gleich die Zeile anstatt den Cursor nur auf den jeweiligen Zeilenanfang zu setzen. Wenn ich hier (also beim nur ersten Click) RichEdit1.SelLength dann auf 0 setze, so habe ich danach auch in dieser Situation das von mir gewünschte Ergebnis.

Trotzdem, Thx for Aufmerksamkeit.

[edit]hatte einen Buchstaben vergessen *g*[/edit]

TStringlist 11. Apr 2004 07:03

Re: Click(-Event) auf linken RichEdit-Rand?
 
Also da ich mich des nächtens mal wieder etwas gelangweilt habe *g*, hier dann doch nochmal die wohl korrekte Lösung (jedenfalls funktioniert sie ohne die geringsten Probs oder Störungen):

Das Resultat funktioniert über eine eigene WndProc des RichEdit Controls und 'lenkt' einen normalen Click auf diesen besagten linken extra-Rand einfach auf die Character-Position des ersten Characters in dieser Zeile um. Ergebnis: Der Cursor wird nur am Zeilenanfang positioniert ohne irgendwelche Markierungen.

Da der Effekt von Click und Double-Click im ursprünglichen TRichEdit exakt identisch ist, lasse ich dann für das Markieren der gesamten Zeile den nächsten Click (= Doppel-Click) bzw. dessen WM_LBUTTONDBLCLK - Message einfach nur passieren ...nicht jedoch ohne zuerst noch eine Variable mit dem aktuellen TickCount geladen zu haben.

...denn der Trippel-Click kommt nämlich jetzt wieder als einfacher Click und benötigt zu seiner Identifizierung als Trippel-Click einen TickCount den ich davor während des Double-Clicks protokolliert habe. Ist die Zeitdifferenz zum aktuellen TickCount > GetDoubleClickTime dann wird's wieder nur ein normaler einfacher Click, wenn aber nicht bleibt die Message unverändert und wirkt im TRichEdit als Trippel-Click.

Hier nochmal die diesbezügliche eigene RichEdit - WndProc:

Delphi-Quellcode:
(const LeftBorderWidth = 10; // intern also von 0 bis 9)
(var   LastMouseTick : Longword;)

...

  FOldREWindowProc := RichEdit1.WindowProc;
  RichEdit1.WindowProc := ownREWndProc;
  lastMouseTick := 0;

...

procedure TForm2.ownREWndProc(var Message: TMessage);
begin
  if Message.Msg = WM_LBUTTONDOWN then
    if Message.LParamLo < LeftBorderWidth then begin
      if GetTickCount - LastMouseTick > GetDoubleClickTime then
        Message.LParamLo := LeftBorderWidth;
      LastMouseTick := 0;
    end;

  if Message.Msg = WM_LBUTTONDBLCLK then
    if Message.LParamLo < LeftBorderWidth then LastMouseTick := GetTickCount;

  fOldREWindowProc(Message);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:53 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