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/)
-   -   Probleme mit key=VK_LEFT,VK_RIGHT,... (https://www.delphipraxis.net/129046-probleme-mit-key%3Dvk_left-vk_right.html)

MiKeNNtKoiNer 11. Feb 2009 17:02


Probleme mit key=VK_LEFT,VK_RIGHT,...
 
Hallo Leute

Danke erstmal, dass ihr euch überhaupt mit meinem Problem beschäftigt.

Ich habe ein Spiel programmiert in dem ein Panel ein anderes Panel jagt. Das Panel, das gejagt wird, wird durch Zufallsvariabeln gelenkt. Das Panel, das vom Spieler gelenkt wird, wird bisher durch Buttons gelenkt oder mit w;a;s;d gelenkt. Nun wollte ich auch die Pfeiltasten einbeziehen. Hierfür mein Quelltext:

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
If (key = VK_UP)
Then
  Begin
    Timer1.Enabled:=true;
    Timer19.Enabled:=true;
      If Radiobutton1.Checked=true
      Then
        Begin
          Timer2.Enabled:=true;
          Timer3.Enabled:=false;
          Timer4.Enabled:=false;
          Timer5.Enabled:=false;
        End;
      If Radiobutton2.Checked=true
      Then
        Begin
          Timer7.Enabled:=true;
          Timer8.Enabled:=false;
          Timer9.Enabled:=false;
          Timer10.Enabled:=false;
        End;
      If Radiobutton3.Checked=true
      Then
        Begin
          Timer11.Enabled:=true;
          Timer12.Enabled:=false;
          Timer13.Enabled:=false;
          Timer14.Enabled:=false;
        End;
      If Radiobutton4.Checked=true
      Then
        Begin
          Timer15.Enabled:=true;
          Timer16.Enabled:=false;
          Timer17.Enabled:=false;
          Timer18.Enabled:=false;
        End;
  End;
If (key = VK_DOWN)
Then
  Begin
    Timer1.Enabled:=true;
    Timer19.Enabled:=true;
      If Radiobutton1.Checked=true
      Then
        Begin
          Timer3.Enabled:=true;
          Timer2.Enabled:=false;
          Timer4.Enabled:=false;
          Timer5.Enabled:=false;
        End;
      If Radiobutton2.Checked=true
      Then
        Begin
          Timer8.Enabled:=true;
          Timer7.Enabled:=false;
          Timer9.Enabled:=false;
          Timer10.Enabled:=false;
        End;
      If Radiobutton3.Checked=true
      Then
        Begin
          Timer12.Enabled:=true;
          Timer11.Enabled:=false;
          Timer13.Enabled:=false;
          Timer14.Enabled:=false;
        End;
      If Radiobutton4.Checked=true
      Then
        Begin
          Timer16.Enabled:=true;
          Timer15.Enabled:=false;
          Timer17.Enabled:=false;
          Timer18.Enabled:=false;
        End;
  End;
If (key = VK_LEFT)
Then
  Begin
    Timer1.Enabled:=true;
    Timer19.Enabled:=true;
      If Radiobutton1.Checked=true
      Then
        Begin
          Timer4.Enabled:=true;
          Timer2.Enabled:=false;
          Timer3.Enabled:=false;
          Timer5.Enabled:=false;
        End;
      If Radiobutton2.Checked=true
      Then
        Begin
          Timer9.Enabled:=true;
          Timer7.Enabled:=false;
          Timer8.Enabled:=false;
          Timer10.Enabled:=false;
        End;
      If Radiobutton3.Checked=true
      Then
        Begin
          Timer13.Enabled:=true;
          Timer11.Enabled:=false;
          Timer12.Enabled:=false;
          Timer14.Enabled:=false;
        End;
      If Radiobutton4.Checked=true
      Then
        Begin
          Timer17.Enabled:=true;
          Timer16.Enabled:=false;
          Timer15.Enabled:=false;
          Timer18.Enabled:=false;
      End;
  End;
If (key = VK_RIGHT)
Then
  Begin
    Timer1.Enabled:=true;
    Timer19.Enabled:=true;
      If Radiobutton1.Checked=true
      Then
        Begin
          Timer5.Enabled:=true;
          Timer2.Enabled:=false;
          Timer3.Enabled:=false;
          Timer4.Enabled:=false;
        End;
      If Radiobutton2.Checked=true
      Then
        Begin
          Timer10.Enabled:=true;
          Timer7.Enabled:=false;
          Timer8.Enabled:=false;
          Timer9.Enabled:=false;
        End;
      If Radiobutton3.Checked=true
      Then
        Begin
          Timer14.Enabled:=true;
          Timer11.Enabled:=false;
          Timer12.Enabled:=false;
          Timer13.Enabled:=false;
        End;
      If Radiobutton4.Checked=true
      Then
        Begin
          Timer18.Enabled:=true;
          Timer16.Enabled:=false;
          Timer15.Enabled:=false;
          Timer17.Enabled:=false;
      End;
  End;
If (key = VK_SPACE)
Then
  Begin
      Timer1.Enabled:=false;
      Timer2.Enabled:=false;
      Timer3.Enabled:=false;
      Timer4.Enabled:=false;
      Timer5.Enabled:=false;
      Timer7.Enabled:=false;
      Timer8.Enabled:=false;
      Timer9.Enabled:=false;
      Timer10.Enabled:=false;
      Timer11.Enabled:=false;
      Timer12.Enabled:=false;
      Timer13.Enabled:=false;
      Timer14.Enabled:=false;
      Timer18.Enabled:=false;
      Timer16.Enabled:=false;
      Timer17.Enabled:=false;
      Timer15.Enabled:=false;
      Timer19.Enabled:=false;
  End;
end;
Bitte keine Kommentare zu den vielen Timern ich hätte es zwar auch mit If und Then und Else machen können, aber so schien es mir zunächst übersichtlicher. Was sich jedoch wie man sieht als falsch herausstellte.

Nun zu meinem eigentlichen Problem:
Wenn ich mein Spiel starte und im Hauptmenü einen Schwierigkeitsgrad auswähle, dann den Start-Button drücke reagiert das Panel nicht sofort auf die Pfeiltasten, sondern erst wenn ich durch das beständige einschlagen auf die Pfeiltasten die Auswahl; die nach dem Startklick natürlich auf dem Start-Button ist; auf das Edit-Feld meiner Stoppuhr ändere. Selbst wenn ich Strg oder Shift gedückt halte muss Die auswahl zunächst auf das Edit-Feld springen.
Weiß irgendjemand wie ich dieses Problem beheben kann?

Mfg
Hagen

P.S.: Kann man verhindern, dass etwas in ein Edit-Feld eingegeben kann oder muss ich dafür eine Listbox beispielsweis benutzen?

mimi 11. Feb 2009 17:08

Re: Probleme mit key=VK_LEFT,VK_RIGHT,...
 
Zitat:

P.S.: Kann man verhindern, dass etwas in ein Edit-Feld eingegeben kann oder muss ich dafür eine Listbox beispielsweis benutzen?
Ich weiß zwar nicht was du mit dem Edit Feld vor hast aber es gibt zwei Wege:
01 - Im OI: ReadOnly auf True stellen(Ich glaube diese Eigenschaft müsste es geben)
02 - Im OnKeyDown/OnKeyPress Event z.b. einfach key:=#0 setzten(Hier bin ich mir sicher das es geht)

Was machst du eigentlich mit den vielen Timer ? Ich weiß zwar nicht was du mit den Vielen Timer vor hast, aber es gibt bestimmt einen besseren Weg. Wenn du uns erklären könntest was du genau vor hast, können wir die evlt. einen anderen besseren Weg zeigen. Wie ich aus den Soruce-code gesehen habe ist immer nur ein Timer aktiv ist das richtig ?

himitsu 11. Feb 2009 17:10

Re: Probleme mit key=VK_LEFT,VK_RIGHT,...
 
[in diesen thread reinkopier]

Schonmal Form.KeyPreview ausprobiert?

Du kannst auch notfalls im Startbutton-Ereignis einem anderen Control den Focus verpassen ( Control.SetFocus; )

Ja und wegen der vielen Timer .. warum? *tschuldschung, aber das konnt ich mir nicht verkneifen :oops:

Aber zumindestens könntest du das Ganze übersichtlicher gestalten ... z.B.
Delphi-Quellcode:
Procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
Begin
  If Key in [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_SPACE] Then
  Begin
    Timer1.Enabled := Key <> VK_SPACE;
    Timer2.Enabled := (Key = VK_UP)  and Radiobutton1.Checked;
    Timer3.Enabled := (Key = VK_DOWN) and Radiobutton1.Checked;
    ...
  End;
End;
[ot]
wo lernt ihr eigentlich alle dieses =true?
Code:
If Radiobutton1.Checked[color=#ff0000]=true[/color]
dem Verantwortlichen würd ich gern mal ein paar auf die Finger geben
[/ot]

MiKeNNtKoiNer 11. Feb 2009 17:22

Re: Probleme mit key=VK_LEFT,VK_RIGHT,...
 
also warum =true ist doch klar If is ja ne bedingung und die muss = sein true muss nich t umbedingt sein aber warum nich ich kann ja true oder 1 benutzen ist im endeffekt egal

Luckie 11. Feb 2009 17:28

Re: Probleme mit key=VK_LEFT,VK_RIGHT,...
 
Nicht unbedingt. False ist als 0 definiert, True demzufolge als alles andere und nicht zwingend als 1. Es kann also durchaus passieren, dass Funktionen einen Wert ungleich eins als True zurückgibt. Testest du jetzt explizit auf True (=1), kann dieser Vergleich gegebenenfalls False ergeben, obwohl er True ergeben sollte.

MiKeNNtKoiNer 11. Feb 2009 17:31

Re: Probleme mit key=VK_LEFT,VK_RIGHT,...
 
schon möglich aber ich seh 1 als true und 0 als false an schließlich is es soweit ich weiß auch bei der maschinensprache so 0 ist aus und 1 ist an
:bouncing4: :bouncing4: :bouncing4: :bouncing4: :bouncing4: :bouncing4:

himitsu 11. Feb 2009 17:33

Re: Probleme mit key=VK_LEFT,VK_RIGHT,...
 
True:
Zitat:

Windows/C-BOOL = -1 bzw $ffffffff
Delphi-Boolean = 1

Cyf 11. Feb 2009 17:34

Re: Probleme mit key=VK_LEFT,VK_RIGHT,...
 
Man prüft einfach nicht auf true. :wink:
Spätestens wenn du mal eine API-Funktion benutzt die in Delphi einen boolschen Wert zurückliefert, der aber intern -1 ist und nicht 1, wirst du merken warum.
Und ein x = y liefert so gesehen, auch nur einen Boolean zurück, somit ist es überflüssig eine zusätzliche Überprüfung einzubauen die aus einem Boolean einen Boolean generiert, der immer wahr ist (sein soll).
Weiteres zu dem Thema liefert die Suche, ist schon einige Male diskutiert worden.

[Edit]Ja, ok, die rote Box war da, aber ich habs jetzt trotzdem noch geschrieben...

WerkstattBoss 12. Feb 2009 15:54

Re: Probleme mit key=VK_LEFT,VK_RIGHT,...
 
Hallo,
wenn ich mit virtuellen Tastencodes arbeite (vk_xyz) setze ich im entsprechenden Zweig (if oder case) key := 0.
Scheint so, dass die Abfrage den Tastaturpuffer nicht von sich aus löscht.
Da virtuelle Tastencodes numerisch sind, ist es wenigstens "gefühlt" eleganter mit "case of" zu arbeiten. Ob das performanter ist oder nicht ???


Vielleicht hilfts ja.

Gruß
Rolf

_frank_ 12. Feb 2009 18:12

Re: Probleme mit key=VK_LEFT,VK_RIGHT,...
 
imho kann man bestimmte Tasten nicht über das standard-OnKey*-Event abfangen. dazu gehören die Tasten, die wichtig für Dialoge sind, also die Pfeiltasten, tab, enter, escape,...

um diese zu bekommen kann man die Message CM_DIALOGKEY abfangen.

Delphi-Quellcode:

procedure CMDialogKey(var msg: TCMDialogKey); message CM_DIALOGKEY;
...
procedure TForm_DFMInspector.CMDialogKey(var msg: TCMDialogKey);
begin
  if msg.CharCode = VK_TAB then ...
end;
HTH Frank


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