OnMouseDown wird nicht erkannt

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

OnMouseDown wird nicht erkannt

Beitrag von Aloxen »

Hallo Pascal Freunde,
ich habe mal wieder ein kleines Problem. Kleinen 3D Spiel, woran ich gerade arbeite, funktioniert die FormMouseDown nicht wenn ich die Maus betätige.
Ich hatte mit der Tastatureingabe ein ähnliches Problem und die Formeinstellung KeyPreview hat dieses gelöst. Damit wurden die KeyUp/Down etc. erkannt. Nun möchte ich natürlich auch platzieren und zerstören von Blöcken umsetzten und brauche dafür das FormMouseDown Event.
Probieren mit dem Debugger ergibt, dass das FormMouseDown Event nicht erkannt wird. Die procedure wird nichtmal aufgerufen.

Ich habe gegoogelt und es gibt kein äquivalent zu KeyPreview für die Maus. ChatGPT hat mir iwas mit PopUpMode empfohlen, allerdings hat das auch nichts genützt.

Vllt. ist es noch wichtig zu erwähnen, dass auf dem Form unterschiedliche Panel (Optionsmenu etc.) sind, die jedoch visible = false haben. Wenn ich PanelMouseDown mit dem Debugger abfrage, tritt das event erst ein, wenn das Panel sichtbar ist, also nehme ich mal an, dass es daran nicht liegen wird.

Weiß jemand warum das Event nicht erkannt bzw nicht ans Form weitergeleitet wird? Wie kann ich das umgehen?
Zuletzt geändert von Aloxen am Mi 18. Jan 2023, 13:02, insgesamt 1-mal geändert.

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: FormKeyDown wird nicht erkannt

Beitrag von Soner »

Warum machst du es nicht so wie ich es dir empfohlen habe. Es funktioniert doch wunderbar. Hier ich habe sogar ein Beispiel gemacht.
SchleifeInLCL.zip
repeat-until-Schleife in LCL-App mit Tastenabfrage
(69.49 KiB) 50-mal heruntergeladen

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: FormKeyDown wird nicht erkannt

Beitrag von Winni »

Hi!

Ist Dir schon mal aufgefallen, dass Mäuse keine Keys haben??

Das Event, dass Du suchst, heisst OnMouseDown.

Versuchs doch mal damit.

Winni

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: FormKeyDown wird nicht erkannt

Beitrag von Soner »

Sorry, ich habe das Maus-Problem nicht gesehen.
Ich finde Winnis Lösung besser, nimm seine Lösung, weil in der Schleife keine Ständige API-Abfragen statt findet.

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: FormKeyDown wird nicht erkannt

Beitrag von Aloxen »

Ups ich meine natürlich FormMouseDown ^^

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: FormKeyDown wird nicht erkannt

Beitrag von Aloxen »

Winni hat geschrieben:
Di 17. Jan 2023, 22:24
Hi!

Ist Dir schon mal aufgefallen, dass Mäuse keine Keys haben??

Das Event, dass Du suchst, heisst OnMouseDown.

Versuchs doch mal damit.

Winni
Ich habe jetzt denText und den Betreff überarbeitet. (Peinliche xD)

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: FormKeyDown wird nicht erkannt

Beitrag von Winni »

Aloxen hat geschrieben:
Mi 18. Jan 2023, 10:19
Ups ich meine natürlich FormMouseDown ^^
Hi!

FormMouseDown wird natürlich nur ausgelöst, wenn Du auf die Form klickst.

Wenn Du auf eine darüberliegende Komponente klickst, z.B. ein Image, dann
wird natürlich Image1.OnMouseDown ausgelöst.

Vielleicht ist das ja Dein Problem.

Winni

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: OnMouseDown wird nicht erkannt

Beitrag von Aloxen »

Ja das hab ich mir schon gedacht. Deswegen hatte ich ja zu einem pardon für "KeyPreview" gefragt, also eine Funktion, die alle Mouse Events erst ans Form weiter leitet, denn ich habe einen ogcContext über dem Form. Ich kann für den Context keine Mouse Events abfragen, da es von OpenGl erstellt wurde und somehow dieses Event nicht hat. Alle anderen Komponenten in der Scene sind unsichtbar. D.h. Das Event was bei OnMouseDown ausgelöst ist kommt nicht vom Form. Ich möchte aber dass genau das Objektunabhängig ist. Egal wo ich mich im Programm befinde sollte FormMouseDown aufgerufen werden, wenn ich die Maustasten betätige.

Um zu sehen ob es am Kontext liegt habe ich nach dem Erstellen des Kontext am anfang folgendes geschrieben:

Code: Alles auswählen

  ogc := TContext.Create(Self);
  ogc.OnClick:=Form1.OnClick;   
Allerdings ändert es nichts

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: OnMouseDown wird nicht erkannt

Beitrag von Winni »

Hi!

Ich hab keine fertige Lösung, aber den Weg.

Du kannst per Code für die Application neue Handler erstellen, also auch einen MouseHandler.

Der gilt dann für die ganze Application.

Sieh Dir mal de Definition von TApplication (und seinen Eltern) in der Unit Forms an.

Winni

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: OnMouseDown wird nicht erkannt

Beitrag von Winni »

Hi!

So, der Hook für die Mouse ist mir wieder eingefallen.
Und wie man ihn in die Application einbaut.

Im Moment reagiert er nur auf die linke Maustaste bei Down.
Und schreibt dann die Koordinaten in Label1.

Code: Alles auswählen

uses
  .., LMessages;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.AddOnUserInputHandler(@MouseHook);
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Application.RemoveOnUserInputHandler(@MouseHook);
end;

procedure TForm1.MouseHook(Sender: TObject; Msg: Cardinal);
var p : TPoint;
begin
    if Msg= LM_LBUTTONDOWN then
      begin
      P := Mouse.CursorPos;
      label1.caption := 'Click at '+IntToStr(P.x)+'/'+IntToStr(P.y);
      end;
end;


Winni

Mathias
Beiträge: 6196
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: OnMouseDown wird nicht erkannt

Beitrag von Mathias »

Coole Funktion, die einem sicher mal weiter hilft.
Im Moment reagiert er nur auf die linke Maustaste bei Down.
Bei mir gehen alle Maustasten und auch die Tastatur.
Ich verwende Linux 64Bit, vielleicht liegt es an dem.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: OnMouseDown wird nicht erkannt

Beitrag von Winni »

Mathias hat geschrieben:
Do 19. Jan 2023, 17:35
Coole Funktion, die einem sicher mal weiter hilft.
Im Moment reagiert er nur auf die linke Maustaste bei Down.
Bei mir gehen alle Maustasten und auch die Tastatur.
Ich verwende Linux 64Bit, vielleicht liegt es an dem.
Hi!

Dann läuft irgendwas schief bei Dir.

Bei mir reagiert er nur auf die Linke Maustaste.

Linux Suse Tumblweed, gtk2

Winni
Zuletzt geändert von Winni am Do 19. Jan 2023, 19:44, insgesamt 1-mal geändert.

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: OnMouseDown wird nicht erkannt

Beitrag von Aloxen »

Hallo Winni,
einen Maushook habe ich auch probiert und obwohl es jetzt super funktioniert mit dem erfassen von den Clicks, kann ich keinen Hook verwenden. Irgendwas ändert der Hook daran, wie sich die Maus bewegt, denn der Spieler dreht sich jetzt auf eine sehr ungenaue und unzuverlässige weise. Das macht mein Problem nicht besser sondern eher schlechter.

In weiteren Foren ist von TApplicationEvents.OnMessage die Rede, aber wenn ich das richtig verstanden habe, gibt es das in Lazarus nicht.

Man soll über einen sehr umständlichen Weg mit PeekMessage(), TranslateMessage() und DispatchMessage(), aber ich habe keine Ahnung was ich damit Anfangen soll.

Die letzte Lösung die ich im Kopf hatte war es mit GetKeyState zu versuchen. Das habe ich wie folgt probiert:

Code: Alles auswählen

if GetKeyState(VK_RBUTTON) and $8000 <> 0 then
   begin
     showmessage('Right Mousebutton');
     end;   
Diesen Code habe ich mit in den Gameloop gepackt. Das Erfassen der Maus geht, allerdings wird jetzt wieder die FormKeyUp nicht erfasst.

WAAAARUUUUMMMM?

Mathias
Beiträge: 6196
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: OnMouseDown wird nicht erkannt

Beitrag von Mathias »

@Aloxen
Was verwendest du für ein OpenGL Context ?
Ich habe immer den TOpenglContext von Lazarus verwendet. Dort hat meine Maus funktioniert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6196
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: OnMouseDown wird nicht erkannt

Beitrag von Mathias »

Hast du dies auch schon probiert ?
Panel.Enabled := false.
Dann werden dort Mausaktionen ingnoriert uns somit reagiert die Parent Komponente auf die Mausereignisse.

Edit: Probiert mit Lazarus 2.2.4.
Zuletzt geändert von Mathias am Do 19. Jan 2023, 20:42, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten