AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Aktion auslösen, solange Taste gedrückt wird?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Marco Steinebach · begonnen am 7. Okt 2009 · letzter Beitrag vom 9. Okt 2009
Antwort Antwort
Seite 1 von 2  1 2      
Marco Steinebach

Registriert seit: 4. Aug 2006
491 Beiträge
 
Delphi 5 Enterprise
 
#1

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

  Alt 7. Okt 2009, 22:20
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
Marco Steinebach
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#2

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

  Alt 7. Okt 2009, 22:32
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

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

  Alt 7. Okt 2009, 22:41
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#4

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

  Alt 7. Okt 2009, 23:08
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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
491 Beiträge
 
Delphi 5 Enterprise
 
#5

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

  Alt 7. Okt 2009, 23:34
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
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 7. Okt 2009, 23:47
Also bei mir wird OnKeyUp nur ausgelöst, wenn ich die Taste loslassen

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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
491 Beiträge
 
Delphi 5 Enterprise
 
#7

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

  Alt 8. Okt 2009, 06:13
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
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
491 Beiträge
 
Delphi 5 Enterprise
 
#8

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

  Alt 8. Okt 2009, 22:08
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
Marco Steinebach
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#9

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

  Alt 9. Okt 2009, 07:02
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
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
491 Beiträge
 
Delphi 5 Enterprise
 
#10

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

  Alt 9. Okt 2009, 19:02
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
Marco Steinebach
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz