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 Frame schluckt WM_KEYDOWN-Message (https://www.delphipraxis.net/52824-frame-schluckt-wm_keydown-message.html)

tigerman33 4. Sep 2005 21:34


Frame schluckt WM_KEYDOWN-Message
 
Hallo an alle,

wenn ich ein Frame auf eine Form setze und dem OnKeyDown oder OnKeyUp-Event des Forms eine Handling-Methode zuweise, scheint das Frame die entsprechenden Messages irgendwie zu "verschlucken".

Ich habe dazu auch schon probiert, die WndProc des Frames zu überschreiben und die Nachricht quasi manuell an das Form weiterzuleiten. Ergebnis: Wenn ich die Weiterleitung mit SendMessage oder PostMessage mache funktioniert es nicht (d.h. der Eventhandler des Forms wird nicht aufgerufen), mache ich das stattdessen über die Methode Perform (die ja direkt die WindowProc des Forms aufruft ohne den Umweg über die Windows Message Queue) geht alles einwandfrei.

Jemand eine Ahnung woran das liegen könnte?

Falls es einen Unterschied machen sollte: Ich nutze Delphi 2005 Professional.

Danke im Voraus!

PS: Hmmm, bin mir nicht ganz sicher ob das hier das richtige Forum ist. Wenn nicht, verschiebts bitte. (Z.B. in die Kategorie Bug Reports :wink: )

tigerman33 6. Sep 2005 08:00

Re: Frame schluckt WM_KEYDOWN-Message
 
Hab noch mal ein wenig weiter damit experimentiert.

Das Frame schluckt nicht nur Keyboard messages, sondern auch z.B. eine WM_LBUTTONDOWN und andere Mouse-Messages.

Daraufhin hab ich dem ganzen jetzt einen eigenen Eventhandler für WM_KEYUP und WM_KEYDOWN verpasst (protected Methoden KeyUp und KeyDown überschrieben), und zack, es klappt. Meistens. Denn wenn ich die Tasten Pfeiltaste hoch oder Pfeiltaste runter drücke, springt er gar nicht in die Methode rein. Bei anderen Tasten aber schon. Und Windows feuert definitiv eine Message ab (das habe ich nachgesehen).

Und jetzt der Clou:
Ich habe ein TApplicationEvents auf mein Form gepackt und in OnMessage diesen Code geschrieben:
Delphi-Quellcode:
if Msg.message = WM_KEYDOWN then
  SendMessage(Frame1.Handle, WM_KEYDOWN, VK_UP, 0);
Jetzt springt er dann tatsächlich in den entsprechenden Eventhandler. Obwohl ich ja nichts gemacht hab, als einfach nochmal eine Message zu senden.

Warum macht er das?!?! Was ist denn daran jetzt anders, wenn ich selbst eine Message verschick als wenn Windows das macht? Und warum ignoriert er das WM_KEYDOWN nur bei bestimmten Parametern in der Message-Struktur. :wall:

tigerman33 9. Sep 2005 17:21

Re: Frame schluckt WM_KEYDOWN-Message
 
*push*

Hab jetzt alle Updates installiert und eigentlich gehofft damit würde sich das Problem geben. Falsch gedacht. :cry:

Wenn hier nicht jemand eine :idea: hat, werde ich das ganze wohl demnächst als bug reporten... :(

Neutral General 9. Sep 2005 17:56

Re: Frame schluckt WM_KEYDOWN-Message
 
Hat die Frame denn kein OnKeyDown - Event ?
Dann schreib deinen Quelltext da rein, dann müsste es gehen.
Das mit dem KeyDown, KeyUp und KeyPress funktioniert sogar auch nicht wenn ein Button auf der Form ist weil die Message dann irgendwie auf andere Kontroll gerichtet ist..

tigerman33 10. Sep 2005 08:37

Re: Frame schluckt WM_KEYDOWN-Message
 
Nee, das event gibts leider nicht. Außerdem hab ich ja auch direkt die Message abgefangen, und das geht ja auch nicht. Manche Messages kommen ja auch an. WM_KEYDOWN mit PageUp z.B. geht durch, WM_KEYDOWN mit Pfeiltaste runter wird ignoriert. Komisch.

SirThornberry 10. Sep 2005 10:22

Re: Frame schluckt WM_KEYDOWN-Message
 
Der Frame schluckt da gar nix. Wenn du einen Button auf dem Form hast und dieser den Focus hat dürftest du auch die Mousemessages nicht auf dem Form erhalten weil diese eben nicht an die Form sondern an den Button gehen. Hast du es schon mit TApplicaitonEvents versucht (oder TAppEvents, weiß nicht genau wie das heißt).

tigerman33 11. Sep 2005 09:53

Re: Frame schluckt WM_KEYDOWN-Message
 
Also:

-ein Button ist nicht auf dem Form, und auch nicht auf dem Frame. Den Frame nutze ich quasi als "Komponente" im groben Stile einer Listview, auf dem ich zur Laufzeit "Items" aus Shapes, Labels und Images erstelle.
-ApplicationEvents habe ich schon ausprobiert. Hab da die Message abgefangen und mal analysiert. Die geht schon ans richtige Handle (nämlich das des Frames, der btw auch Screen.ActiveControl--oder ist das Application.ActiveControl?--ist).
-Manche WM_KEYDOWN messages gehen ja auch durch. Wenn ich z.B. PageUp oder PageDown drücke kommt die Message an, bei den Pfeiltasten nicht.
-Ursprünglich hatte ich den EventHandler ja auch im Ereignis des Forms. D.h. der Frame hätte die Message bekommen, nicht verarbeitet und nach oben weitergereicht.

Das Ding treibt mich nochmal zum Wahnsinn. Unter D7 hat's ja auch funktioniert. :wall:

tigerman33 14. Sep 2005 10:35

Re: Frame schluckt WM_KEYDOWN-Message
 
Die OH sagt dazu bei TForm.KeyPreview folgendes:

Zitat:

Zitat von OH
Diese Einstellung wirkt sich nicht auf Navigationstasten (Pfeiltasten, TAB usw.) aus, da diese keine Tastaturereignisse auslösen

Was soll mir das denn jetzt sagen? It's not a bug, it's a feature?

Wobei ganz nebenbei ebendiese OH dann zum Thema "Tastaturbotschaften" eben genau diese Abfrage macht! Also

Delphi-Quellcode:
If Key in [VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT,VK_NEXT] etc etc
Und früher gings ja auch. Passiert dieser Fehler eigentlich nur bei mir, oder könnt ihr den reproduzieren?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz