Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wiederholung bei gedrückter taste (https://www.delphipraxis.net/87755-wiederholung-bei-gedrueckter-taste.html)

schrimm 5. Mär 2007 19:00


Wiederholung bei gedrückter taste
 
Also ich bin es schon wieder^^
und schon wiweder mit onkeydown :mrgreen:
Folgendes Prob:
Mein "Spiel"(eigentlich ein einziges versuchsfeld) funktioniert so schon mehr oder weniger, nun steuere ich das männel mit den pfeiltasten und bei onkeydown gibt es den effekt, dass es ert 1 Impuls und danach nach einer kurzen pause erst die Impulse in reihe gibt, kann man diese Pause irgendwie verhindern?
falls jemand nicht weis, was ich meine, das ist im Windows ist genau so, wenn man mmmmmmmmmm schreibt, oder so dann kommt erst 1 m und danach dann die vielen hintereinander.
Hoffe es ist verständluich und vor allem zu lösen :sharkylinchen:

sirius 5. Mär 2007 19:08

Re: Wiederholung bei gedrückter taste
 
Das macht der Tastaturcontroler so (also der in der Tastatur). Der schickt genau auf diese Weise, die Kommandos, das die Taste gedrückt wurde. Und er schickt einmal ein Kommando, wen die Taste losgelassen wird. Man kann die Zeiten bis der nächste Klick kommt auch umprogrammieren (zumindest ging das früher, soweit ich mich erinnere) Und wahrscheinlich geht es heute über den Tastaturtreiber. Brauchst du aber alles nicht. Denn dir reicht ja mitzubekommen, wann eine Taste gedrückt wird und wann sie wieder losgelassen wird.

Also kannst du onkeydown und onkeyup verwenden. Dann wiest du wann die Taste unten (gedrückt) und wann sie oben ist (nicht gedrückt)

Es gibt dann noch Ereignisunabhängig den Befehl GetAsyncKeyState

schrimm 5. Mär 2007 19:14

Re: Wiederholung bei gedrückter taste
 
das was du gesagt hast hab ich alles schon rausgefunden, es geht jetzt darum: wenn ich nun ne Pfeiltaste drücke, dann macht das männel einen schritt und dann nach der Pause läuft es weiter, dass wollte ich verhindern, scheint aber schwer zu werden.

dominikkv 5. Mär 2007 19:20

Re: Wiederholung bei gedrückter taste
 
sirius hat schon recht
Delphi-Quellcode:
var
   weiter, SchonGedrückt: Boolean;

procedure bewegen;
begin
  repeat
    //bewegen
  until weiter;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if not SchonGedrückt then
    begin
      weiter := false;
      schonGedrückt := true;
      bewegen;
    end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  weiter := True;
  schonGedrückt := false;
end;
oder du schaust über einen timer ob die tase gedrückt ist und bewegst dann

sirius 5. Mär 2007 19:35

Re: Wiederholung bei gedrückter taste
 
Zitat:

Zitat von dominikkv
oder du schaust über einen timer ob die tase gedrückt ist und bewegst dann

Das sollte man dringend zeitgesteuert machen (am einfachsten über einen Timer). Wie denn auch sonst?

schrimm 5. Mär 2007 19:39

Re: Wiederholung bei gedrückter taste
 
also bewegen tut sich da schon alles, das problem ist nur , dass es am anfang durch diese Eigenschaft der Tastatur ert nur 1 macht, dann den rest.
erklärung: ani gibt an, welche animation ablaufen soll, 11 ist laufen rechts
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if ani in [11..14] then
begin
 Twait.enabled:=false;
 Tani.enabled:=true;
 case key of
  vk_right:
   begin
    ani:=11;// 1=gehen 1=rechts
   end;
 end;
end;

procedure TForm1.TaniTimer(Sender: TObject);
begin
 case ani of
  11:
   begin
    Ilaufr.left:=Ilaufr.left+5;
   end;
 end;
end;
also nur mal auf das minimale begrenzt

dominikkv 5. Mär 2007 19:50

Re: Wiederholung bei gedrückter taste
 
warum machst du dir es so kompliziert?^^
Delphi-Quellcode:
var
  Speed: Integer;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case key of
    vk_right: speed := 5;
    vk_left: speed := -5;
  end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  speed := 0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Ilaufr.left:=Ilaufr.left+Speed;
end;

Norbert987 6. Mär 2007 01:17

Re: Wiederholung bei gedrückter taste
 
Also wenn ich das richtig verstanden habe, dann möchte er gerade dass das Männchen nur einen Schritt macht, auch wenn die Taste weitere Signale sendet. Ich würde es so machen:

Delphi-Quellcode:
var
  down : boolean;

[..]

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if down then exit;

  if ani in [11..14] then
    case key of
      vk_right: ani:=11;// 1=gehen 1=rechts
    end;
  down := true;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  down := false;
end;
Du musst halt "down := false;" noch zu beginn des Programmes eintragen. Den Timer brachst du nicht mehr und KeyUp muss halt wie KeyDown eingetragen werden.

schrimm 7. Mär 2007 15:49

Re: Wiederholung bei gedrückter taste
 
Zitat:

Zitat von Norbert987
Also wenn ich das richtig verstanden habe, dann möchte er gerade dass das Männchen nur einen Schritt macht, auch wenn die Taste weitere Signale sendet.

Genau im gegenteil.
das männel bewegt sich wenn man drauf bleibt weiter und das ist auch so gewollt, aber es gibt den effekt, dass, wenn man lange auf einer taste bleibt es etwa siesen zeitlichen ablauf hat:
m mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
_^diese Pause, bevor da die anderen kommen will ich irgendwie umgehen, falls es geht

TonyR 7. Mär 2007 15:58

Re: Wiederholung bei gedrückter taste
 
Eigentlich nimmt man für sowas (so denke ich auf jeden Fall) die Funktion, die im Beitrag #2 von Sirius erwähnt wurde!
getasynckeystate()

Diese Funktion gibt zurück, ob eine bestimmte Taste zur Abfrage-Zeit gedrückt wurde!
Also muss man in einen Timer folgendes schreiben:
Delphi-Quellcode:
if getasynckeystate(vk_right)<>0 then männel.xwert:=männel.xwert+5;
Musst halt noch auf deine Bedürfnisse anpassen!

Edit: Und das läuft dann natürlich ohne die von dir angesprochenen Pausen ab!


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 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-2025 by Thomas Breitkreuz