AGB  ·  Datenschutz  ·  Impressum  







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

Doppelklick in TStringGrid

Ein Thema von Hobby-Programmierer · begonnen am 27. Jan 2006 · letzter Beitrag vom 2. Feb 2012
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: Doppelklick in TStringGrid

  Alt 2. Feb 2012, 19: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 ..........
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 2. Feb 2012 um 19:50 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 18:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz