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 Buttonklick erkennen (https://www.delphipraxis.net/11302-buttonklick-erkennen.html)

devnull 3. Nov 2003 20:17


Buttonklick erkennen
 
Hi,

wie kann ich erkennen, ob sich der Mauszeiger, über einem während der Laufzeit er- stellten Button, befindet ?


devnull

mirage228 3. Nov 2003 20:19

Re: Buttonklick erkennen
 
Delphi-Quellcode:
function GetObjectAtCursor: String;
{

  Liefert VCL-Klassennamen an
  der aktuellen Mausposition!
  Für Debugzwecke

}
var
  Pos: TPoint;
  Obj: TObject;
begin
  GetCursorPos(Pos);
  Obj := FindVCLWindow(Pos) as TObject;
  if Obj <> NIL then
    Result := Obj.ClassName else // du könntest nach TComponent casten und so an den Namen der Komponente rankommen!
    Result := 'Unknown Object at Cursor Position';
end;
Vielleicht hilft dir das irgendwie weiter...

mfG
mirage228

devnull 3. Nov 2003 20:37

Re: Buttonklick erkennen
 
Hi,

erstmal danke; aber ich bekomm jetzt nur mein eigenes Fenster (Form1) heraus.
nicht den Button !

devnull

Sharky 3. Nov 2003 20:47

Re: Buttonklick erkennen
 
Hai devnull,

suche doch mal im Forum nach MouseOver bzw. MouseEnter.

Dann solltest Du einige Beispiele finden.

Gruss :-D

Niko 3. Nov 2003 20:48

Re: Buttonklick erkennen
 
Du könntest auch das OnMouseOver-Ereignis des Buttons belegen.

EDIT: Mist...

devnull 3. Nov 2003 20:50

Re: Buttonklick erkennen
 
danke für eure geduld, daran hätte ich wohl auch sleber denken können...


:wall: devnull

Basic-Master 3. Nov 2003 20:54

Re: Buttonklick erkennen
 
dashier funzt bei mir :)
Delphi-Quellcode:
function GetObjectAtCursor: String;
var
  Pos: TPoint;
  Obj: TObject;
  Wnd: THandle;
begin
  GetCursorPos(Pos);
  if not assigned(FindVCLWindow(Pos)) then begin
    Result := 'Unknown Object at Cursor Position';
    exit;
  end;
  Wnd := FindVCLWindow(Pos).Handle;
  if Wnd = 0 then begin
    Result := 'Unknown Object at Cursor Position';
    exit;
  end
  else begin
      obj := FindControl(Wnd) as tobject;
    if Obj <> NIL then
      Result := Obj.ClassName
    else
      Result := 'Unknown Object at Cursor Position';
  end;
end;
allerdings funktioniert die funktion nur für das gerade aktive fenster :gruebel:

devnull 3. Nov 2003 21:30

Re: Buttonklick erkennen
 
Problem mit OnMouseEnter:

Das "OnMouseEnter"-Ereignis gibts nicht in der EingabeHilfe.

Delphi-Quellcode:
// SpeedButton !!!
var NewButton: TSpeedButton;
begin
  // Neuen Button auf Form 1 erzeugen:
  NewButton := TSpeedButton.Create(Form1);
  // Eigenschaften des neuen Buttons festlegen:
  with NewButton do begin
    Parent := Form1;
    Caption := 'Test';
    Top := 10;
    Left := 100;
    Height := 10;
    Width := 100;
    // geht nicht, ereignis geht nicht
    @NewButton.OnMouseEnter := @MeinEigenesOnMouseEnter;
    // funktioniert
    @NewButton.OnClick := @MeinEigenesOnClick;
  end;
Kann mir einer helfen ???

devnull

mr2 3. Nov 2003 21:44

Re: Buttonklick erkennen
 
warum willst Du denn mit
Delphi-Quellcode:
  @NewButton.OnMouseEnter := @MeinEigenesOnMouseEnter;
die Adressen einander zuweisen?
schreib einfach
Delphi-Quellcode:
  NewButton.OnMouseEnter := MeinEigenesOnMouseEnter;
das sollte problemlos funktionieren (falls MeinEigenesOnMouseEnter wie folgt deklariert ist):
Delphi-Quellcode:
    procedure MeinEigenesOnMouseEnter(Sender: TObject);
CU mr2

devnull 3. Nov 2003 21:50

Re: Buttonklick erkennen
 
hi,
das Problem is, dass ONMOUSEENTER nicht geht (CompilerFehler: Undefinierter Bezeichner: 'OnMouseEnter').

Ich glaub, das OnMouseEnter nur bei LABELS geht, aber wie krieg ich dann raus, ob der Mauszeiger über einem der Buttons ist ?

devnull

mr2 3. Nov 2003 21:58

Re: Buttonklick erkennen
 
weil es bei TSpeedButton kein OnMouseEnter gibt, nimm doch einfach OnMouseMove dann musst Du die Deklaration allerdings anpassen:
Delphi-Quellcode:
    procedure SpeedButton1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
CU mr2

devnull 3. Nov 2003 22:12

Re: Buttonklick erkennen
 
Habs probiert. Das compilieren geht jetzt, aber sobald ich die Maus über den Speedbutton bewege, bricht das Programm ab mit Fehlermeldung
"Format '%p' ungültig [...]"

Hast du ne Ahnung was das sein könnte ?

devnull

mr2 3. Nov 2003 22:25

Re: Buttonklick erkennen
 
wie sieht denn die Implementierung von MeinEigenesMouseMove aus?
Delphi-Quellcode:
  Format('%p', [Self]); // ergibt 0x.......
wird nur verwendet, um einen Pointer in einen String umzuwandeln.

CU mr2

devnull 3. Nov 2003 22:55

Re: Buttonklick erkennen
 
das sieht in der procedure dann so aus:

Delphi-Quellcode:
var button_name : string;
begin
   button_name := TSpeedButton(Sender).Caption;
   [...]
end;
Der Befehl Format (): wird im gesamten Programm nicht verwendet !!!


devnull

mr2 4. Nov 2003 17:51

Re: Buttonklick erkennen
 
Hallo,

Du solltest vor dem Typecasting immer mittels is prüfen, ob der "Sender" wirklich eine Instanz der Klasse ist:
Delphi-Quellcode:
  if (Sender is TSpeedButton)
  then button_name := (Sender as TSpeedButton).Caption;
Schau mal bei der Exception zur Laufzeit in den Aufrufstack (über Ansicht, Debug-Fenster, Aufruf-Stack oder <STRG><ALT><S>).
Dort siehst Du dann wo die Format-Anweisung herkommt.

CU mr2

Christian Seehase 4. Nov 2003 19:31

Re: Buttonklick erkennen
 
Moin devnull,

such' hier mal nach Hier im Forum suchenCM_MOUSEENTER
Das muss man selber deklarieren.

@mr2:
Zitat:

Zitat von mr2
das sollte problemlos funktionieren (falls MeinEigenesOnMouseEnter wie folgt deklariert ist):
Source:

Delphi-Quellcode:
    procedure MeinEigenesOnMouseEnter(Sender: TObject);

Nein, nur falls es als TNotifyEvent deklariert ist.

Delphi-Quellcode:
type
  TNotifyEvent = procedure(Sender: TObject) of object;
So ist wie Du geschrieben hast, ist es eine reine Prozedur und kann nicht so zugewiesen werden, sondern nur mit Hilfe von @.

mr2 4. Nov 2003 19:39

Re: Buttonklick erkennen
 
Dass es (selbstverständlich) eine Objekt-Methode ist, hab' ich in dem Zusammenhang einfach vorrausgesetzt :)


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