![]() |
Aktion auslösen, solange Taste gedrückt wird?
Hallo zusammen,
wie kann ich folgendes Problem lösen: Pseudocode: solange TasteGedrückt i := i + 1 EndSolange Wenn Taste losgelassen, i := 0 EndPseudocode Ich hab's schon mit Keydown und Keyup probiert, Problem ist, wenn ich die Taste gedrückt halte, wird jedesmal ein keydown-keyup ausgelöst, und mein i zählt niemals hoch. Das muß man doch irgendwie lösen können? Hiiiiilfe! Viele Grüße Marco |
Re: Aktion auslösen, solange Taste gedrückt wird?
Hallo Marco,
das kannst Du mit TTimer machen. KeyDown startet den Timer KeyUp beendet den Timer Im OnTimer führst Du deinen Code aus. Gruß Edgar |
Re: Aktion auslösen, solange Taste gedrückt wird?
Hi,
Jo mit nem Timer würde es z.B. gehen.. Pseudocode:
Delphi-Quellcode:
if TasteGedrückt then
begin Timer.Ausschalten; i := 0; while TasteGedrückt do begin inc(i); Form1.Caption := IntToStr(i); // z.B. Form1.Repaint; end; i := 0; Timer.Anschalten; end; ![]() Gruß Neutral General |
Re: Aktion auslösen, solange Taste gedrückt wird?
Wenn es sich um eine Animation handelt und es noch andere Tasten geben soll,
ist es ewt. sinnvoller diese Tasten im Timer mit GetAsyncKeyState direkt zu verarbeiten. |
Re: Aktion auslösen, solange Taste gedrückt wird?
Hallo,
und herzlichen Dank für eure Antworten. Okay, dann zieh ich mir GetAsyncKeyState mal rein, dazu sollte es ja hier und in der Hilfe einiges zu finden geben. Verstehe ich es richtig, daß die Funktion ignoriert, daß die Taste beim halten mehrmals durch's System losgelassen und wieder gedrückt wird? Viele Grüße Marco |
Re: Aktion auslösen, solange Taste gedrückt wird?
Also bei mir wird OnKeyUp nur ausgelöst, wenn ich die Taste loslassen :gruebel:
diese beiden Varianten funktionieren ohne Probleme (klar, es werden jetzt zwar keine Tasten unterschieden, aber es kommt definitiv OnKeyUp nur an,wenn ich die Taste loslasse und sonst nicht)
Delphi-Quellcode:
type
TForm1 = class(TForm) Timer1: TTimer; ... private b: Boolean; i: Integer; end; procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin b := False; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin b := True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if b then i := i + 1; end;
Delphi-Quellcode:
kann es denn sein, daß es an irgendeiner Komponente (auf deiner Form) liegt?
type
TForm1 = class(TForm) ... private i: Integer; end; procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin i := 0; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin i := i + 1; end; |
Re: Aktion auslösen, solange Taste gedrückt wird?
Hallo Himitsu,
tja, genau so hatte ich mir das auch vorgestellt, und bei mir funktioniert es auch, also ist mein Delphi nicht kaput! ;-) Bleibt nur noch herauszufinden, warums in meinem Prog nicht geht... Ich meld mich, wenn ich's weiß! Viele Grüße und vielen Dank Marco |
Re: Aktion auslösen, solange Taste gedrückt wird?
Hallo again,
Himitsu's Beispiel funktioniert, aaaaaber, ;-), nicht wenn man Pfeil links oder Pfeil rechts benutzt. Deshalb dachte ich, ich könnte die WndProc überschreiben, und wäre alle sorgen los. Die nachfolgende Prozedur tut aber mal gar nix! Kann mir jemand sagen, warum?
Delphi-Quellcode:
Vielen Dank und viele Grüße
procedure TForm1.WndProc(var Msg: TMessage);
begin case msg.msg of wm_KEYDOWN: begin i := i + 1; statictext1.Caption := format('Zahl: %d', [i]); end; WM_KEYUP: begin i := 0; statictext1.Caption := format('Zahl: %d', [i]); end; end; inherited; end; Marco |
Re: Aktion auslösen, solange Taste gedrückt wird?
Ich weiss zwar net wofür du das brauchst, aber versuchs mal mit nem einfachen Keyboardhook.
Delphi-Quellcode:
Aber bedenke das der Hook Programmübergreifend ist. Wenn du die Tasten nur innerhalb deines Programms auwerten möchtest, musst du prüfen ob dein Programm aktuell den Focus hat.
// Keyboard Hook
const WH_KEYBOARD_LL = 13; var HOOK: HHOOK; function LLKeyboardProc(nCode: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin Result:= CallNextHookEx(HOOK, nCode, wParam, lParam); case wParam of WM_KEYDOWN, WM_SYSKEYDOWN: begin Form1.i:= Form1.i + 1; Form1.statictext1.Caption:= format('Zahl: %d', [Form1.i]); end; WM_KEYUP : begin Form1.i:= 0; Form1.statictext1.Caption:= format('Zahl: %d', [Form1.i]); end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin HOOK:= SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyboardProc, hinstance, 0); end; procedure TForm1.FormDestroy(Sender: TObject); begin if HOOK <> 0 then UnhookWindowsHookEx(HOOK); end; [edit] jetzt sollte es passen :vernupft: |
Re: Aktion auslösen, solange Taste gedrückt wird?
Zitat:
Die Pfeiltasten machen mich noch wahnsinnig. Mit allen anderen Tasten geht's, da wird, egal wie lange man die Taste festhält, am Ende nur ein WM_KEYUP gesendet. Bei den Pfeiltasten sendet er dauernd welche. Es ist auch egal, wo man die Message-Behandlung implementiert, ob im OnMessage eines , in der WNDProc der Form, oder schlicht im OnKeyDown und OnKeyUp. Also zieh ich mir jetzt mal deinen Keyboard-Hook rein... so. hab ich jetzt. Schade, es ist genau das selbe. Bei allen anderen Tasten gibt's mehrere WM_KEYDOWN und nur einen WM_KEYUP, so wie im Microsoft MSDN beschrieben, nur bei den Pfeiltasten nicht. Gibt's dafür denn gar keine lösung? *grummel! Für Hilfe wäre ich dankbar, ich würde nicht gerne andere Tasten dafür nehmen wollen. Viele Grüße Marco |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz