Delphi-PRAXiS
Seite 2 von 3     12 3      

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/)
-   -   Tastendruck abfrage (https://www.delphipraxis.net/114507-tastendruck-abfrage.html)

Fabbe 26. Mai 2008 16:51

Re: Tastendruck abfrage
 
Na ja in dem Timer-Zyklus will ich ja abfragen was für eine Taste gedrückt wird.
Darum gehts ja

Wie setzt man das um? >.<

Klaus01 26. Mai 2008 16:56

Re: Tastendruck abfrage
 
..nun , dann mußt Du aber Glück haben wenn Du den TimerZyklus erwischt.
Das Tastendruck Event wird immer dann ausgelöst wenn eine Taste gedrückt wird.
Unabhängig ob ein Timer aktiv ist oder nicht.

Du kannst ja hier:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if ((spielaktiv > 0) or (not(spielaktiv > 0) and (key <> 27))) then exit;
      case key of
       {Escape} VK_ESCAPE: close;
       {left}   VK_LEFT : ;
       {up}     VK_UP : ;
       {right}  VK_RIGHT : ;
       {bottom} VK_DOWN : ;
               end;
end;
bestimmte Marker setzen die im TimerZyklus abgefragt werden.
Sozusage ein TempSpeicher für Tastendrücke.

Grüße
Klaus

Fabbe 26. Mai 2008 17:06

Re: Tastendruck abfrage
 
Also unterbricht das tastendruck-ereignis den TimerZyklus?
Außerdem ist mein Problem, dass trotz keiner gedrückten Taste der Timer2 seine Befehle nichts ausführt, aus welchem Grund auch immer :pale:

bluesbear 26. Mai 2008 17:07

Re: Tastendruck abfrage
 
Oder im Timer GetKeyState abfragen, und das mit dem FormKeyDown weglassen.

Fabbe 26. Mai 2008 17:11

Re: Tastendruck abfrage
 
Wie würde dass dann aussehen? Wie gesagt kenn mich nicht grade gut aus :(

bluesbear 26. Mai 2008 17:18

Re: Tastendruck abfrage
 
Zu GetKeyState könntest du mal in der Delphi-Hilfe nachgucken, und hier im Forum suchen.

Deinen Timer2 solltest du im Debugger durchlaufen, und gucken, wo es hängt.
Z.B. wenn zblock1 = 0 ist, tut sich da gar nichts, aber das ist von hier aus schlecht feststellbar.

DeddyH 26. Mai 2008 17:26

Re: Tastendruck abfrage
 
Noch eine Möglichkeit: einen Typen definieren und bei Tastendruck setzen.
Delphi-Quellcode:
type TTaste = (ttNone,ttLeft,ttRight,ttDown,ttTurn);

...
//privates Feld vom Typ TTaste im Form definieren und mit ttNone initialisieren
...

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if ((spielaktiv > 0) or (not(spielaktiv > 0) and (key <> 27))) then exit;
      case key of
       {Escape} VK_ESCAPE: close;
       {left}   VK_LEFT : FTaste := ttLeft;
       {up}     VK_UP : FTaste := ttTurn;
       {right}  VK_RIGHT : FTaste := ttRight;
       {bottom} VK_DOWN : FTaste := ttDown;
               end;
end;
Im Timer-Event wertest Du nun FTaste aus und bewegst den Stein entsprechend. Anschließend FTaste wieder auf ttNone setzen.

Fabbe 26. Mai 2008 18:48

Re: Tastendruck abfrage
 
Ich glaub ich bin immernoch zu doof dazu
also ich hab nun folgendes:

Delphi-Quellcode:
case zblock1 of

        1:begin             {langes}
          with canvas do
            begin
              x:=114;
              x1:=234;
              y:=-10+(runter-1)*30;
              y1:=-10+(runter)*30;
              y2:=21+(runter-1)*30;
              y3:=20+(runter)*30;
              Brush.color:=clblack;
              if runter=1 then else
              rectangle(x,y,x1,y2);
              Brush.color:=clmaroon;
              rectangle(x,y1,x1,y3);
              If Ftaste=ttdown then
              begin
              Brush.color:=clblack;
              y2:=y2+30;
              if runter=1 then else

              rectangle(x,y,x1,y2);
              Brush.color:=clmaroon;
              y1:=y1+30;
              y3:=y3+30;
              rectangle(x,y1,x1,y3);
              Ftaste:=ttnone;
              runter:=runter+1;
              end;
            end;
         end;
und den anderen Block hab ich übernommen:

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if ((spielaktiv > 0) or (not(spielaktiv > 0) and (key <> 27))) then exit;
      case key of
       {Escape} VK_ESCAPE: close;
       {left}   VK_LEFT : FTaste:=ttLeft;
       {up}     VK_UP : FTaste:=ttTurn;
       {right}  VK_RIGHT : FTaste:=ttRight;
       {bottom} VK_DOWN : FTaste:=ttDown;
               end;
end;
Am anfang der Unit hab ich auch daran gedacht

Delphi-Quellcode:
...

type
  TTaste = (ttNone,ttLeft,ttRight,ttDown,ttTurn);
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Hauptmenue: TMenuItem;
    Neu: TMenuItem;

...
und hab auch darab gedacht:

Delphi-Quellcode:
var
FTaste:Ttaste;
...
aber der Stein geht dann einfach nicht schneller runter, bzw. geht einfach nicht einmal mehr runter
hat da jemand einen Vorschlag, bitte?

DeddyH 26. Mai 2008 19:17

Re: Tastendruck abfrage
 
Das hier versteh ich überhaupt nicht:
Zitat:

Delphi-Quellcode:
if runter=1 then else
              rectangle(x,y,x1,y2);
              Brush.color:=clmaroon;
              rectangle(x,y1,x1,y3);


Fabbe 26. Mai 2008 19:22

Re: Tastendruck abfrage
 
Delphi-Quellcode:
if runter=1 then {nichts, da es in dem ersten durchlauf nichts zu löschen gibt} else rectangle(x,y,x1,y2); {löschen des voherigen Blockes, also der vorherigen Position}
              Brush.color:=clmaroon; {ändern der Farbe}
              rectangle(x,y1,x1,y3);{neue Position}
Ich werd bald wahnsinnig...
wenn diese doofe Tastenerkennung gehen würde wäre der rest schon viel einfacher


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:24 Uhr.
Seite 2 von 3     12 3      

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