Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Aktion auslösen, solange Taste gedrückt wird? (https://www.delphipraxis.net/141366-aktion-ausloesen-solange-taste-gedrueckt-wird.html)

Marco Steinebach 7. Okt 2009 23:20


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

EarlyBird 7. Okt 2009 23:32

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

Neutral General 7. Okt 2009 23:41

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;
Delphi-Referenz durchsuchenGetAsyncKeyState wäre dazu noch interessant.

Gruß
Neutral General

turboPASCAL 8. Okt 2009 00:08

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.

Marco Steinebach 8. Okt 2009 00:34

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

himitsu 8. Okt 2009 00:47

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:
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;
kann es denn sein, daß es an irgendeiner Komponente (auf deiner Form) liegt?

Marco Steinebach 8. Okt 2009 07:13

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

Marco Steinebach 8. Okt 2009 23:08

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:
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;
Vielen Dank und viele Grüße
Marco

Hobby-Programmierer 9. Okt 2009 08:02

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:
// 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;
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.
[edit] jetzt sollte es passen :vernupft:

Marco Steinebach 9. Okt 2009 20:02

Re: Aktion auslösen, solange Taste gedrückt wird?
 
Zitat:

Zitat von Hobby-Programmierer
Ich weiss zwar net wofür du das brauchst,...

Weil ein freund von mir durch lange MP3-Dateien spuhlen will, wie bei einem Kassettenrekorder.
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.
Seite 1 von 2  1 2      

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