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 Doppelklick in TStringGrid (https://www.delphipraxis.net/61916-doppelklick-tstringgrid.html)

Hobby-Programmierer 27. Jan 2006 23:16


Doppelklick in TStringGrid
 
Moin :) ...,
wie kann ich in einem StringGrid einen Doppelklick abfangen und auswerten?
Im Moment stehe ich ziemlich auf dem Schlauch und weiss nimmer weiter :?
Folgendes habe ich probiert
Delphi-Quellcode:
procedure TForm_Jahresanzeige.JahresGridDblClick(Sender: TObject);
var P: TPoint;
    aCol, aRow: Integer;
begin
  GetCursorPos(P);
  JahresGrid.MouseToCell(P.X, P.Y, aCol, aRow);

  ShowMessage(inttostr(aCol)+':'+ inttostr(aRow));
end;
bringt aber nur -1 :(
Selbst GridCoord bringt keine Ergebnisse.

Hoffe das jemand Hilfe oder Vorschläge für mich hat.
Gruss Mario :dancer:

Lannes 27. Jan 2006 23:22

Re: Doppeklick in TStringGrid
 
Hallo,

schau Dir mal ScreenToClient an, oder war es ClientToScreen :gruebel: (ist schon spät)
damit kannst Du die Mauskoordinaten umrechnen.

Hobby-Programmierer 28. Jan 2006 00:13

Re: Doppeklick in TStringGrid
 
:thumb: Super hat geholfen auch wenns schon Spät ist :lol:
für alle die es interessiert:
Delphi-Quellcode:
var
  MousePos: TPoint;
  iCol, iRow: integer;
begin
  MousePos:= StringGrid.ScreenToClient(Mouse.CursorPos);
  Stringgrid.MouseToCell(MousePos.X, MousePos.Y, iCol, iRow);
  ShowMessage(IntToStr(iCol)+ ':'+ IntToStr(iRow));
end;
Gruss Mario :dancer:

Parre1950 2. Feb 2012 16:24

AW: Doppelklick in TStringGrid
 
Sie sind ein Engel!
Wie lange tüfftel ich schon daran herum.
Danke

Kann man Ihnen mal was Gutes tun?
(wir produzieren alkoholische Getränke)
MfG
Dr. Robert Bauer

shmia 2. Feb 2012 16:37

AW: Doppelklick in TStringGrid
 
Zitat:

Zitat von Parre1950 (Beitrag 1148926)
Kann man Ihnen mal was Gutes tun?
(wir produzieren alkoholische Getränke)

:-D
Kann ich Dir (Anrede Du ist hier im Forum üblich) mal was Gutes tun?
Ich bin Fan von alkoholischen Getränken! :-D

haentschman 2. Feb 2012 18:43

AW: Doppelklick in TStringGrid
 
...wie wäre es denn mit einem vollen Bierlaster zu den nächsten Delphitagen ? :stupid: Oder macht ihr was härteres ?

DeddyH 2. Feb 2012 18:45

AW: Doppelklick in TStringGrid
 
Was? Bier? Wo? *Hechel* :mrgreen: :cheers:

himitsu 2. Feb 2012 19:22

AW: Doppelklick in TStringGrid
 
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
Delphi-Quellcode:
Sleep(750);
bei einem Interval von 1000. (oder besser noch länger)
Wenn man jetzt doppelt klickt und dannach die Maus schnell wegbewegt, dann ..........


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