Autor Beitrag
user32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 5



BeitragVerfasst: Sa 30.05.15 23:50 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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:

ausblenden 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;

  {if  msg.message = WM_KEYDOWN then
  begin
    if msg.wParam = vk_return then
       showmessage('halllllloo');
  end;
  }


end;


Dann kommt Form1 OnKeyDown

ausblenden 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');

    // //inc(mode);
    // if mode=4 then mode:=0;
  end;
end;


Diese Showmessage wird niemals aufgerufen....

Mit Handled hab ich auch schon rumprobiert, False oder True, es ändert scheinbar nichts.
Hmm
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 5



BeitragVerfasst: So 31.05.15 00:39 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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. :roll:

Ohhhh man :roll:

Ich wusste ja von Anfang an, dass es sowas bescheuertes ist und ich zu blind bin es zu merken :mrgreen:

Naja jetzt läuft alles 8)
Danke für deine Hilfe :!:
user32 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 5



BeitragVerfasst: 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 :shock:

Ich habs jetzt so gemacht:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 174
Erhaltene Danke: 43



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 5



BeitragVerfasst: Di 02.06.15 00:16 
user profile iconBlup hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 02.06.15 06:26 
user profile iconuser32 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 5



BeitragVerfasst: Di 02.06.15 15:47 
Achso ok. Dann probier ich das gleich aus.

Edit: Das mit KeyPreview funktioniert. Super danke!