Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Tastaturabfrage


wayneschlegel - Sa 06.08.11 17:31
Titel: Tastaturabfrage
Hey !
ich möchte ein onkeypress Ereignis auf ein Objekt erstellen. Es soll allerdings nur stattfinden wenn beim doppelklick zusätzlich strg+alt gedrückt wird.
das kann für die profis hier nicht so schwierig sein. bei mir haperts an der syntax...hat vielleicht jemand ein paar stückchen code für mich ? :-)
vielen dank !
M.


Delphi-Laie - Sa 06.08.11 18:44

user profile iconwayneschlegel hat folgendes geschrieben Zum zitierten Posting springen:
ich möchte ein onkeypress Ereignis auf ein Objekt erstellen. Es soll allerdings nur stattfinden wenn beim doppelklick zusätzlich strg+alt gedrückt wird.


OnKeyPress findet bei einem Tastaturdruckereignis statt, der Doppelklick ist hingegen ein Mausereignis (OnDblClick). Beides sind getrennte Ereignisse, die sich m.E. nicht so ohne weiteres "mischen" bzw. "vereinen" lassen.


jaenicke - Sa 06.08.11 18:47

user profile iconwayneschlegel hat folgendes geschrieben Zum zitierten Posting springen:
ich möchte ein onkeypress Ereignis auf ein Objekt erstellen. Es soll allerdings nur stattfinden wenn beim doppelklick zusätzlich strg+alt gedrückt wird.
Also du willst ein OnKeyPress benutzen, aber einen Doppelklick abfangen, wenn andere Tasten unten sind? Wie jetzt? :eyecrazy: :nut:

Also mal zur Klarstellung:
OnKeyPress dient zur Reaktion auf einen Tastendruck mit der Tastatur.
OnDblClick dient zur Reaktion auf einen Doppelklick mit der Maus.

So, dann zum Problem:
Du kannst in OnKeyDown auf die Tastendrücke von Strg + Alt reagieren und dir deren Status merken und zurücksetzen, wenn sie in OnKeyUp wieder losgelassen werden. Dann kannst du im Doppeklick Ereignis einfach diesen Status abfragen.

Eine andere Möglichkeit wäre die Abfrage des Tastenstatus mit GetAsyncKeyState, aber das hat den Nachteil, dass eine Verzögerung bei der Doppelklickbehandlung dazu führen kann, dass die Tasten dann schon wieder losgelassen sind. Dafür hat es den Vorteil, dass es auch klappt, wenn beim Drücken der Tasten das Fenster noch nicht den Eingabefokus hatte.


wayneschlegel - Sa 06.08.11 20:39

ja genau ! Nur wenn die beiden Tasten shift und crtl zusammen gedrückt sind, dann soll das Ereignis stattfinden.
Das muss doch irgendwie gehen oder? Auf jeden Fall doch mit einer Abfrage beim Doppelklickereignis oder habe ich einen Denkfehler ?

Beipiel:
formKeydown...
if (shift = ([ssCtrl, ssShift]) + blabla then
begin
...
end;

was denkt Ihr ?
M.


jaenicke - Sa 06.08.11 21:28

Wie ich schon sagte:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst in OnKeyDown auf die Tastendrücke von Strg + Alt reagieren und dir deren Status merken und zurücksetzen, wenn sie in OnKeyUp wieder losgelassen werden. Dann kannst du im Doppeklick Ereignis einfach diesen Status abfragen.
Shift abfragen ist da schon eine gute Idee, nur musst du auch den Status speichern usw.


wayneschlegel - Sa 06.08.11 22:35

cool ! hast du evtl. nen demo code oder sowas ?
ein beispiel ?`was glaubst du wohl was ich alles ausprobiert habe... :-(
M.


jaenicke - Sa 06.08.11 22:43

So schwer ist das eigentlich nun wirklich nicht. :gruebel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
  TFormX = ...
  public
    FKeysPressed: Boolean;

// ...

procedure TFormX.FormDblClick(Sender: TObject);
begin
  if FKeysPressed then
  begin
    FKeysPressed := False; 
      // nötig, wenn wie hier in DblClick etwas passiert, das bewirkt, dass KeyUp nicht ankommt
    ShowMessage('Doppelklick angekommen');
  end;
end;

procedure TFormX.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  FKeysPressed := (ssCtrl in Shift) and (ssAlt in Shift);
end;

procedure TFormX.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  FKeysPressed := FKeysPressed and not ((ssCtrl in Shift) and (ssAlt in Shift));
end;


wayneschlegel - So 07.08.11 00:28

hm...und das soll funktionieren ? probier ich gleich morgen mal aus aber ich bin da eher skeptisch ehrlich gesagt.
M.


elundril - So 07.08.11 00:37

wäre es nicht eventuell einfach einfach GetAsyncKeystate in der DoubleClick-Procedure abzufragen?

lg elundril


jaenicke - So 07.08.11 08:23

user profile iconwayneschlegel hat folgendes geschrieben Zum zitierten Posting springen:
hm...und das soll funktionieren ? probier ich gleich morgen mal aus aber ich bin da eher skeptisch ehrlich gesagt.
Ich habe es ausprobiert. ;-)

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
wäre es nicht eventuell einfach einfach GetAsyncKeystate in der DoubleClick-Procedure abzufragen?
Es hat beides Vor- und Nachteile, das habe ich ja oben schon geschrieben. :D


wayneschlegel - Do 11.08.11 21:47

Stimmt ! Hat super hingehauen !
Vielen Dank für die Hilfe !!!!