Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi solange taste gedrücktt tue! ??? (https://www.delphipraxis.net/84837-solange-taste-gedruecktt-tue.html)

flori-da 22. Jan 2007 20:12

Re: solange taste gedrücktt tue! ???
 
Also so langsam versteh ich gar nix mehr..aber egal

Mein Programm sieht jetzt folgendermaßen aus:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if GetAsyncKeyState(vk_left) <0 then
     walk(1);
  if GetAsyncKeyState(vk_right)<0 then
     walk(3);
end;
was für mich auch eigentlich logisch ist und eigentlich funktionieren müsste.
Ich verstehe es so:
die procedure checkt (jetzt alle 100 ms)ob eine pfeiltaste (links oder rechts) gerade gedrückt wird und wenn ja , dasnn soll sich die figur entsprechend bewegen.
Das ende vom lied ist, das die scheiß procedure gar nix macht!!
das heißt: schon wieder ein logischer fehler in meinen / unserem plan :?
enabled ist auch auf true gesetzt.
gruß der flo

bitsetter 22. Jan 2007 20:23

Re: solange taste gedrücktt tue! ???
 
Versuche mal meinen Code, er kommt auch ohne Timer aus.
Delphi-Quellcode:
var
  ImagePos: integer;
const
  verschieben= 5;//je größer um so schneller verschieben

procedure TForm1.FormCreate(Sender: TObject);
begin
  ImagePos:= Image1.Left;
  Image1.Parent.DoubleBuffered:= true;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    vk_Left:
      begin
      dec(ImagePos, verschieben);
      Image1.Left:= ImagePos;
      end;
    VK_RIGHT:
      begin
      inc(ImagePos, verschieben);
      Image1.Left:= ImagePos;
      end;
  end;
end;

sirius 22. Jan 2007 20:28

Re: solange taste gedrücktt tue! ???
 
Zitat:

Zitat von bitsetter
Versuche mal meinen Code, er kommt auch ohne Timer aus.

Der dürfte nicht ganz den gewünschten Erfolg bringen, da die Tastatur nach dem ersten drücken einer Taste (wenn sie gehalten wird), erstmal eine Weile gar nix sendet und dann am Stück.

flori-da 22. Jan 2007 20:31

Re: solange taste gedrücktt tue! ???
 
die letzte version klapt auf jedenfall ganz gut.
simpel aber wirksam!
Ich weiß zwar noch nicht , ich damit auskommen (weil das alles noch viel komlepxer werden soll;
aber für den anfang reicht es aus! außerdem habe ich für heute genug von dem programm!!
Also vielen Dank für euere Hilf!
:lol:
Bye der flo

inherited 22. Jan 2007 21:47

Re: solange taste gedrücktt tue! ???
 
Außerdem hat die oben ohne Timer auskommende Funktion noch einen Nachteil: Kommt später mal Oben und Unten dazu, kann man nur in eine Richtung gleichzeitig, also zB entweder nach links, oder nach oben. Bei der Timerversion ist das nicht so.

1ceman 22. Jan 2007 23:43

Re: solange taste gedrücktt tue! ???
 
Zitat:

Zitat von inherited
Zitat:

Zitat von 1ceman
mach doch einfach 2 timer, einen für links und einen für rechts.
dann überprüfst du im FormKeyDown ob die linke oder die rechte pfeiltaste gedrückt wird und startest
dann den timer für links oder rechts.

Und was soll das bringen?

äh das die Figuren sich bewegen??? ;)
ob ich nun im Timer prüfe welche taste gedrückt wurde oder vorher ist doch eigentlich egal.
So hat man halt für jede bewegung nen eigenen timer und führt wenn die linke pfeiltaste
gedrückt wurde den timer für die bewegung nach links aus, bis die taste losgelassen wird. Bei
rechter pfeiltaste entsprechend den timer für den rechts-bewegung.
oder hab ich das problem falsch verstanden????

bitsetter 23. Jan 2007 01:19

Re: solange taste gedrücktt tue! ???
 
Inherited hatte recht, wenn man 2 Tasten bei meinem Code drückte, konnte man das Image nur in einer Richtung bewegen. Hier das ganze mit 1 Timer.
Delphi-Quellcode:
var
  ImagePosX, ImagePosY: integer;
const
  verschieben= 5;//je größer um so schneller verschieben

procedure TForm1.FormCreate(Sender: TObject);
begin
  ImagePosX:= Image1.Left;
  ImagePosY:= Image1.Top;
  Image1.Parent.DoubleBuffered:= true;
  Timer1.Interval:= 100;
  Timer1.Enabled:= false;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Timer1.Enabled= false then
  Timer1.Enabled:= true;
  //Timer1Timer(Sender);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if GetAsyncKeyState(VK_LEFT)< 0 then
  begin
  dec(ImagePosX, verschieben);
  Image1.Left:= ImagePosX;
  end;
    if GetAsyncKeyState(VK_RIGHT)< 0 then
    begin
    inc(ImagePosX, verschieben);
    Image1.Left:= ImagePosX;
    end;
      if GetAsyncKeyState(VK_UP)< 0 then
      begin
      dec(ImagePosY, verschieben);
      Image1.Top:= ImagePosY;
      end;
        if GetAsyncKeyState(VK_DOWN)< 0 then
        begin
        inc(ImagePosY, verschieben);
        Image1.Top:= ImagePosY;
        end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Timer1.Enabled:= false;
end;

flori-da 23. Jan 2007 16:41

Re: solange taste gedrücktt tue! ???
 
moin leute

also ich hab heut den vorschlag von bitsetter in die tat umgesetzt.
Und es funktioniert nicht.
Da hab ich mal mit F7 immer nur die einzelnen Anweisungen durchlaufen lassen und hab festgestellt, dass der Timer bei einen Tastendruck nicht angeht.Wenn ich eine Pfeiltaste drücke meldet sich die procedure keydown aber der Timer nicht. genausowenig die procedure KeyUp. Was ist da nur los?

gruß der flo

xZise 23. Jan 2007 17:07

Re: solange taste gedrücktt tue! ???
 
Lass den Timer immer laufen!
Also nicht erst starten o.s.ä. ;)

und dann im Intervall überprüfen ob sich eine Taste gedrückt hat.

inherited 23. Jan 2007 17:21

Re: solange taste gedrücktt tue! ???
 
Genau. Das mit dem OnKeyDown und OnKeyUp ist sinnlos, da im Timer ja eh überprüft wird, ob die Taste gedrückt ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 Uhr.
Seite 3 von 4     123 4      

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