![]() |
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:
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.
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; 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? |
Re: Probleme mit key=VK_LEFT,VK_RIGHT,...
Zitat:
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 ? |
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:
[ot]
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; wo lernt ihr eigentlich alle dieses =true?
Code:
dem Verantwortlichen würd ich gern mal ein paar auf die Finger geben
If Radiobutton1.Checked[color=#ff0000]=true[/color]
[/ot] |
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
|
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.
|
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: |
Re: Probleme mit key=VK_LEFT,VK_RIGHT,...
True:
Zitat:
|
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... |
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 |
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:
HTH Frankprocedure CMDialogKey(var msg: TCMDialogKey); message CM_DIALOGKEY; ... procedure TForm_DFMInspector.CMDialogKey(var msg: TCMDialogKey); begin if msg.CharCode = VK_TAB then ... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 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