Einzelnen Beitrag anzeigen

TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Click(-Event) auf linken RichEdit-Rand?

  Alt 11. Apr 2004, 07:03
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;
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat