AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit key=VK_LEFT,VK_RIGHT,...

Ein Thema von MiKeNNtKoiNer · begonnen am 11. Feb 2009 · letzter Beitrag vom 12. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
MiKeNNtKoiNer

Registriert seit: 27. Jan 2009
18 Beiträge
 
#1

Probleme mit key=VK_LEFT,VK_RIGHT,...

  Alt 11. Feb 2009, 18:02
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?
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#2

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

  Alt 11. Feb 2009, 18:08
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 ?
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 11. Feb 2009, 18:10
[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

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]
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
MiKeNNtKoiNer

Registriert seit: 27. Jan 2009
18 Beiträge
 
#4

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

  Alt 11. Feb 2009, 18:22
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

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

  Alt 11. Feb 2009, 18:28
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MiKeNNtKoiNer

Registriert seit: 27. Jan 2009
18 Beiträge
 
#6

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

  Alt 11. Feb 2009, 18:31
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 11. Feb 2009, 18:33
True:
Zitat:
Windows/C-BOOL = -1 bzw $ffffffff
Delphi-Boolean = 1
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#8

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

  Alt 11. Feb 2009, 18:34
Man prüft einfach nicht auf true.
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...
Man kann einen Barbier definieren als einen, der alle diejenigen rasiert, und nur diejenigen, die sich nicht selbst rasieren.
Rasiert sich der Barbier?
  Mit Zitat antworten Zitat
WerkstattBoss

Registriert seit: 17. Sep 2006
Ort: Bremerhaven
8 Beiträge
 
Delphi XE2 Enterprise
 
#9

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

  Alt 12. Feb 2009, 16:54
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
Mach alles so einfach wie nötig, nicht einfacher (Einstein)
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#10

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

  Alt 12. Feb 2009, 19:12
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr.
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