OnMouseDown wird nicht erkannt
OnMouseDown wird nicht erkannt
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?
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.
-
- 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
Warum machst du es nicht so wie ich es dir empfohlen habe. Es funktioniert doch wunderbar. Hier ich habe sogar ein Beispiel gemacht.
- 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
Hi!
Ist Dir schon mal aufgefallen, dass Mäuse keine Keys haben??
Das Event, dass Du suchst, heisst OnMouseDown.
Versuchs doch mal damit.
Winni
Ist Dir schon mal aufgefallen, dass Mäuse keine Keys haben??
Das Event, dass Du suchst, heisst OnMouseDown.
Versuchs doch mal damit.
Winni
-
- 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
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.
Ich finde Winnis Lösung besser, nimm seine Lösung, weil in der Schleife keine Ständige API-Abfragen statt findet.
Re: FormKeyDown wird nicht erkannt
Ups ich meine natürlich FormMouseDown ^^
- 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
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
Re: OnMouseDown wird nicht erkannt
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:
Allerdings ändert es nichts
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;
- 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
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
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
- 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
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.
Winni
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
-
- 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
Coole Funktion, die einem sicher mal weiter hilft.
Ich verwende Linux 64Bit, vielleicht liegt es an dem.
Bei mir gehen alle Maustasten und auch die Tastatur.Im Moment reagiert er nur auf die linke Maustaste bei Down.
Ich verwende Linux 64Bit, vielleicht liegt es an dem.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- 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
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.
Re: OnMouseDown wird nicht erkannt
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:
Diesen Code habe ich mit in den Gameloop gepackt. Das Erfassen der Maus geht, allerdings wird jetzt wieder die FormKeyUp nicht erfasst.
WAAAARUUUUMMMM?
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;
WAAAARUUUUMMMM?
-
- 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
@Aloxen
Was verwendest du für ein OpenGL Context ?
Ich habe immer den TOpenglContext von Lazarus verwendet. Dort hat meine Maus funktioniert.
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
Mit Java und C/C++ sehe ich rot
-
- 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
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.
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
Mit Java und C/C++ sehe ich rot