![]() |
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:
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:
procedure TForm1.RadioButton1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin RadioButton1.Checked:=true; end;
Delphi-Quellcode:
RadioButton5 ist der Radiobutton ohne Funktion (Caption: Nichts).
procedure TForm1.RadioButton1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState); begin RadioButton5.Checked:=true; end; 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 |
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:
hinter deine Befehle für die RadioButtons.
Application.ProcessMessages
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. |
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 . . . |
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; |
AW: Radiobutton per Taste auslösen?
Zitat:
Danke schon mal an die recht schnellen Antworten :) Zitat:
|
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; |
AW: Radiobutton per Taste auslösen?
Zitat:
|
AW: Radiobutton per Taste auslösen?
Binde mal die Unit LCLType mit ein.
Delphi-Quellcode:
uses ..., LCLType;
|
AW: Radiobutton per Taste auslösen?
Zitat:
![]() ob die in Lazarus / FreePascal bekannt bzw. so verwendbar sind, weiß ich leider nicht - in Delphi funktioniert's. . . . siehe Post #8 |
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 05:57 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