Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Radiobutton per Taste auslösen? (https://www.delphipraxis.net/172322-radiobutton-per-taste-ausloesen.html)

Astobix 26. Dez 2012 16:23


Radiobutton per Taste auslösen?
 
Hallo,

Erstmal möchte ich mich entschuldigen für diese "Noob - Frage" :) Ich bin ziemlich neu im Programmierbereich ( habe vor 3-4 Tagen damit angefangen.) Aktuell benutze ich Lazarus, da ich erstmal in das Programmieren reinschnuppern wollte ohne direkt (viel) Geld dafür auszugeben. Soviel zu meinem "Hintergrund", kommen wir jetzt zu dem Grund für diesen Thread.

Ich wollte ein Spiel programmieren, wo ich etwas per WASD / Pfeiltasten steuern kann. Als ganz simplen Anfang hatte ich mir gedacht, das ich per Canvas einen Kreis zeichne den ich dann eben mit den Tasten steuern kann. Man müsste dann irgendwelchen Dingen ausweichen oder irgendwas in die Richtung. Doch da hab ich schon das Problem: Ich weiß nicht wie ich einen Befehl machen kann, durch den eine Sache passiert wenn eine gewisse Taste gedrückt ist.

Meine Idee war, 5 Radiobuttons zu machen (Caption: &w, &a, &s, &d, Nichts). Ich hab irgendwo gelesen oder gehört, dass man mit dem & - Zeichen den Radiobuttons Tasten zuweisen kann.
Danach habe ich bei folgende Prozedur geschrieben:
Delphi-Quellcode:
procedure TForm1.RadioButton1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  RadioButton1.Checked:=true;
end;
Radiobutton1 ist in dem Fall "&w". Das habe ich ebenso bei "&a","&s","&d" gemacht. Anschließend habe ich eine OnKeyUp Prozedur für alle geschrieben:
Delphi-Quellcode:
procedure TForm1.RadioButton1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  RadioButton5.Checked:=true;
end;
RadioButton5 ist der Radiobutton ohne Funktion (Caption: Nichts).
Was ich mir jetzt gedacht habe, war folgendes:
Immer wenn ich eine Taste jetzt drücke, Wird der Radiobutton der zu der Taste gehört aktiviert. Lasse ich sie wieder los, wird der "neutrale" Radiobutton aktiviert.

Tatsächlich aber beginnt das Programm verrückt zu spielen. Erst 1-2 Sekunden nachdem ich W gedrückt habe, wird der Radiobutton1 aktiviert. Wenn ich die Taste loslasse aktiviert er sofort zu Radiobutton5 (gut!) und danach hat es den Anschein dass es funktioniert (drückt man nochmal W aktiviert er sofort Radiobutton1). Doch wenn ich jetzt z.b. A drücke, aktiviert er zuerst Radiobutton1 erneut und etwas später erst Radiobutton2. Das ganze bewirkt, dass mein "Spiel" nicht möglich wäre, weil die Steuerung nicht ordentlich funktioniert.

Jetzt die Fragen an euch:
1. Warum passiert das? (Würde meinem Verständniss weiterhelfen :))
2. Wie kann ich es ändern?
3. Gibt es andere Möglichkeiten ohne Radiobuttons die sinnvoller sind?

Ich bitte euch, bei euren Antworten darauf zuachten, dass ich noch ganz am Anfang bin. Ich würde mich wirklich sehr über einige Hilfe freuen, weil ich selber nichts gefunden habe, dass mein Problem löst :)

Gruß,
Astobix

haentschman 26. Dez 2012 17:02

AW: Radiobutton per Taste auslösen?
 
Hallo und herzlich willkommen hier... :dp:

Im Prinzip ist deine Logik richtig. Das du die Veränderungen an den Radiobuttons verzögert siehst, liegt mit hoher Wahrscheinlichkeit daran, daß die Neuzeichnen Message (im Windows) nicht abgearbeitet wird wenn du es vermutest.
Schreibe mal ein beherztes
Delphi-Quellcode:
Application.ProcessMessages
hinter deine Befehle für die RadioButtons.
Soviel zum Problem. Davon unabhängig ist es nicht gut, visuelle Controls, welche noch für Eingaben dienen, zur Datenhaltung oder als Statusanzeigen zu benutzen. Das verwirrt den User.
Vorschlag: Schau mal nach StatusBar. Dort kann man dann diverse "Statusinformationen" unterbringen.

markus5766h 26. Dez 2012 17:02

AW: Radiobutton per Taste auslösen?
 
Hallo,

warum nicht direkt auf der Form die virtuellen Keys abfragen
(im Ereignis OnKeyDown)
z.B. vk_Left, vk_Right, vk_Down, vk_Up für die Pfeiltasten . . .

Bummi 26. Dez 2012 17:13

AW: Radiobutton per Taste auslösen?
 
Ich würde keine Radiobuttons verwenden, sondern den Zustand in einem "NichtWincontrol" darstellen. Bei Dir dürften die automatischen &x selectionen kollidieren mit mit den KeyDownroutinen des Elementes welches gerade den Focus hat und dessen welches durch &x gewählt wird. Wenn Du bei RadioButtons bleiben willst würde ich die &'s aus den Captions entfernen und den Code eindampfen auf:

Delphi-Quellcode:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
    RadioButton1.Checked := key='w';
    RadioButton2.Checked := key='a';
    RadioButton3.Checked := key='s';
    RadioButton4.Checked := key='d';
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
   RadioButton5.Checked :=true;
end;

Astobix 26. Dez 2012 17:22

AW: Radiobutton per Taste auslösen?
 
Zitat:

Zitat von markus5766h (Beitrag 1196755)
Hallo,

warum nicht direkt auf der Form die virtuellen Keys abfragen
(im Ereignis OnKeyDown)
z.B. vk_Left, vk_Right, vk_Down, vk_Up für die Pfeiltasten . . .

Was genau müsste ich da denn machen? Also welchen Quellcode müsste ich im Ereignis OnKeyDown schreiben? Und muss ich vorher vk_Left irgendwo als Variable/Taste oder so angeben?

Danke schon mal an die recht schnellen Antworten :)



Zitat:

Zitat von Bummi (Beitrag 1196757)
Ich würde keine Radiobuttons verwenden, sondern den Zustand in einem "NichtWincontrol" darstellen. Bei Dir dürften die automatischen &x selectionen kollidieren mit mit den KeyDownroutinen des Elementes welches gerade den Focus hat und dessen welches durch &x gewählt wird. Wenn Du bei RadioButtons bleiben willst würde ich die &'s aus den Captions entfernen und den Code eindampfen auf:

Delphi-Quellcode:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
    RadioButton1.Checked := key='w';
    RadioButton2.Checked := key='a';
    RadioButton3.Checked := key='s';
    RadioButton4.Checked := key='d';
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
   RadioButton5.Checked :=true;
end;

Wow, genau dass was ich suchte! Danke :) Aber ich bin neugierig geworden von dem oberen Beitrag mit den Virtuellen Keys. Kann mir das einer noch erklären? :)

Bummi 26. Dez 2012 18:15

AW: Radiobutton per Taste auslösen?
 
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_DOWN: Caption := 'Down';
    VK_UP: Caption := 'Up';
    VK_LEFT: Caption := 'Left';
    VK_RIGHT: Caption := 'Right';
  end;
end;

Astobix 26. Dez 2012 18:50

AW: Radiobutton per Taste auslösen?
 
Zitat:

Zitat von Bummi (Beitrag 1196761)
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_DOWN: Caption := 'Down';
    VK_UP: Caption := 'Up';
    VK_LEFT: Caption := 'Left';
    VK_RIGHT: Caption := 'Right';
  end;
end;

Der kennt VK_DOWN etc. aber nicht :S Wo muss man denn angeben, was VK_DOWN ist? :)

DeddyH 26. Dez 2012 19:09

AW: Radiobutton per Taste auslösen?
 
Binde mal die Unit LCLType mit ein.
Delphi-Quellcode:
uses ..., LCLType;

markus5766h 26. Dez 2012 19:11

AW: Radiobutton per Taste auslösen?
 
Zitat:

Zitat von Astobix (Beitrag 1196767)
Der kennt VK_DOWN etc. aber nicht :S Wo muss man denn angeben, was VK_DOWN ist? :)

virtuelle Tastaturcodes : http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

ob die in Lazarus / FreePascal bekannt bzw. so verwendbar sind, weiß ich leider nicht -
in Delphi funktioniert's.
. . . siehe Post #8

Astobix 26. Dez 2012 20:14

AW: Radiobutton per Taste auslösen?
 
Okay, vielen Dank für eure antworten :)
Das hier kann meinetwegen geschlossen werden :)

Gruß
Astobix


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:13 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