Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#8

AW: Doppelklick in TStringGrid

  Alt 2. Feb 2012, 20:22
Wobei die Button-Click- und DoubleClick-Ereignisse eigentlich die Mausposition direkt mitliefern, nur werden diese Information innerhalb der VCL nicht weitergereich.
Aber man könnte diese Ereignisse auch selber abfangen.

Dafür müßte man aber die gewünschte Komponente ableiten
oder sich an Application.OnMessage dranhängen (hier muß man aber auch noch die Message mit der Komponente in Verbindung bringen).


Ein Nachteil an Delphi-Referenz durchsuchenTMouse.CursorPos / MSDN-Library durchsuchenGetCursorPos ist, daß diese Position nicht wirklich die Klickposition zurückgeben muß.
Denn zwischen dem Klick und dem Auslesen der Position kann durchaus etwas Zeit liegen, in welcher sich die MausPosition geändert haben könnte. Vorallem wenn die Anwendung oder der PC etwas ausgelastet ist.

[edit]
Ich hab es jetzt nicht ausprobiert, aber über MSDN-Library durchsuchenGetMessagePos und MSDN-Library durchsuchenGetMessageTime könnte man, innerhalb der ButtonClick-Methode, eventuell nachträglich an die Informationen rankommen, welche z.B. von MSDN-Library durchsuchenWM_LBUTTONDBLCLK eigentlich geliefert werden.


[edit2]
Delphi-Quellcode:
type
  TComponentButtonHelper = class helper for TObject{TControl}
    function GetEventMousePos: TPoint;
    function GetEventTimeOffset: Integer;
  end;

function TComponentButtonHelper.GetEventMousePos: TPoint;
var
  MousePos: DWORD;
begin
  MousePos := GetMessagePos;
  Result.X := TSmallPoint(MousePos).x;
  Result.Y := TSmallPoint(MousePos).y;
  if Self is TControl then
    Result := TControl(Self).ScreenToClient(Result);
end;

function TComponentButtonHelper.GetEventTimeOffset: Integer;
begin
  Result := Integer(GetTickCount) - GetMessageTime;
end;



procedure TForm1.Memo1DblClick(Sender: TObject);
begin
  Memo1.Lines.Add(Format('X=%d, Y=%d, T=%d | X=%d, Y=%d', [
    Sender.GetEventMousePos.X, Sender.GetEventMousePos.Y, Sender.GetEventTimeOffset,
    (Sender as TControl).ScreenToClient(Mouse.CursorPos).X, (Sender as TControl).ScreenToClient(Mouse.CursorPos).Y]));
end;
Und nun nur noch einen Timer auf die Form, z.B. mit Sleep(750); bei einem Interval von 1000. (oder besser noch länger)
Wenn man jetzt doppelt klickt und dannach die Maus schnell wegbewegt, dann ..........
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 2. Feb 2012 um 20:50 Uhr)
  Mit Zitat antworten Zitat