Autor |
Beitrag |
user32
      
Beiträge: 55
Erhaltene Danke: 5
|
Verfasst: Sa 30.05.15 23:10
Ich sitze gerade schon viel zu lange an einem Problemchen, das bestimmt richtig lächerlich ist, aber stehe da auf dem Schlauch.
Ich benutze ein ApplicationEvents um eine Message (WM_MOUSEWHEEL) abzufangen.
Komischerweise, reagiert dann FormKeyDown überhaupt nicht mehr.
Wenn ich das auch über ApplicationEvents mache, geht es.
Also Zitat: | Msg.message = WM_KEYDOWN |
Aber FormKeyDown geht nicht?
Äh?
Hab ich was vergessen?
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 30.05.15 23:23
Das kann ich nicht reproduzieren.
Setzt du vielleicht in dem OnMessage aus Versehen Handled bei Nachrichten wie dieser auch auf True?
Oder hast du ein kleines Beispielprojekt, das du anhängen kannst?
|
|
user32 
      
Beiträge: 55
Erhaltene Danke: 5
|
Verfasst: Sa 30.05.15 23:50
jaenicke hat folgendes geschrieben : | Das kann ich nicht reproduzieren.
Setzt du vielleicht in dem OnMessage aus Versehen Handled bei Nachrichten wie dieser auch auf True?
Oder hast du ein kleines Beispielprojekt, das du anhängen kannst? |
Klar, also ApplicationEvents hat nur diesen kleinen Abschnitt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); begin if Msg.message = WM_MOUSEWHEEL then begin wheel := HIWORD(Msg.wParam);
if wheel<32768 then light_z := light_z + 30 else if wheel>32767 then light_z := light_z - 30; Form1.caption := 'light z=' + format('%f', [light_z]) + ', mode=' +inttostr(mode) ; end;
end; |
Dann kommt Form1 OnKeyDown
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key=vk_RETURN then begin
showmessage('Hallo');
end; end; |
Diese Showmessage wird niemals aufgerufen....
Mit Handled hab ich auch schon rumprobiert, False oder True, es ändert scheinbar nichts.
Hmm
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 31.05.15 00:22
Das funktioniert bei mir so. Ein echtes Beispielprojekt als .zip wäre sinnvoller, damit sich das Problem reproduzieren lässt.
Kann es sein, dass das Enter von einer anderen Komponente geschluckt wird? Steht KeyPreview deines Formulars auf True?
|
|
user32 
      
Beiträge: 55
Erhaltene Danke: 5
|
Verfasst: So 31.05.15 00:39
jaenicke hat folgendes geschrieben : | dass das Enter von einer anderen Komponente geschluckt wird? |
Jap.....
Habs jetzt gefunden.
Ich hatte einen BUTTON, der ständig im Fokus war, logischerweise hat er sich den Tastendruck gekrallt, da er ja sein eigenes OnKeyDown hat.
Ohhhh man
Ich wusste ja von Anfang an, dass es sowas bescheuertes ist und ich zu blind bin es zu merken
Naja jetzt läuft alles
Danke für deine Hilfe 
|
|
user32 
      
Beiträge: 55
Erhaltene Danke: 5
|
Verfasst: Mo 01.06.15 11:42
Allerdings frag ich mich jetzt, wie man das verhindert.
Der Knackpunkt ist, ich will halt mehrere aktive Elemente auf der Form, aber bei OnKeyDown soll trotzdem Form1 ansprechen...
Ich hab schon mit GroupBoxes rumprobiert und beim jeweils anderen dann SetFocus aber das Ergebnis war nicht zufriedenstellen.
Komme mir gerade vor wie ein Anfänger
Ich habs jetzt so gemacht:
Delphi-Quelltext 1:
| SendMessage(Form1, WM_KEYDOWN, Key, 0); |
bei jedem anderen Element in das OnKeyDown.
Allerdings ist das, wahrscheinlich, ziemlich unsauberer Programmierstil. (oder?)
Also wie geht es besser?
|
|
Blup
      
Beiträge: 174
Erhaltene Danke: 43
|
Verfasst: Mo 01.06.15 12:52
Du bist auf diese Frage nicht eingegangen:
Zitat: | Steht KeyPreview deines Formulars auf True? |
Ansonsten kann man auch einen Keyboard-Hook installieren, der für die gesamte Anwendung gilt.
Damit bekommt man diese Ereignisse definitiv vor irgendwelchen Steuerelementen, egal welches Fenster den Fokus hat.
|
|
user32 
      
Beiträge: 55
Erhaltene Danke: 5
|
Verfasst: Di 02.06.15 00:16
Blup hat folgendes geschrieben : | Du bist auf diese Frage nicht eingegangen:
Zitat: | Steht KeyPreview deines Formulars auf True? |
|
Nein, es war nicht auf True, aber ich habe ja rausgefunden was das Problem war, wie oben beschrieben.
Jetzt gilt es darum, wie man diese Sache elegant löst, dass andere Bedienelemente mir die KeyDown Message von der Form1 wegschnappen. Ein Hook erscheint mir jetzt etwas Overkill, zudem der ja auch systemweit wirkt , soweit ich weiß? Das muss jetzt nicht unbedingt sein.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 02.06.15 06:26
user32 hat folgendes geschrieben : | Nein, es war nicht auf True, aber ich habe ja rausgefunden was das Problem war, wie oben beschrieben. |
KeyPreview sorgt dafür, dass Tastatur- und Mausereignisse auch beim Formular ankommen, obwohl sie für eine Komponente darauf bestimmt sind. Das ist genau was du möchtest, allerdings bin ich mir nicht sicher, ob das auch beim Enter wirkt.
|
|
user32 
      
Beiträge: 55
Erhaltene Danke: 5
|
Verfasst: Di 02.06.15 15:47
Achso ok. Dann probier ich das gleich aus.
Edit: Das mit KeyPreview funktioniert. Super danke!
|
|