AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Radiobutton per Taste auslösen?
Thema durchsuchen
Ansicht
Themen-Optionen

Radiobutton per Taste auslösen?

Ein Thema von Astobix · begonnen am 26. Dez 2012 · letzter Beitrag vom 26. Dez 2012
Antwort Antwort
Astobix

Registriert seit: 26. Dez 2012
26 Beiträge
 
Delphi 6 Personal
 
#1

Radiobutton per Taste auslösen?

  Alt 26. Dez 2012, 17:23
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

Geändert von Astobix (26. Dez 2012 um 17:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#2

AW: Radiobutton per Taste auslösen?

  Alt 26. Dez 2012, 18:02
Hallo und herzlich willkommen hier...

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 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.
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#3

AW: Radiobutton per Taste auslösen?

  Alt 26. Dez 2012, 18:02
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 . . .
Markus H.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Radiobutton per Taste auslösen?

  Alt 26. Dez 2012, 18:13
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Astobix

Registriert seit: 26. Dez 2012
26 Beiträge
 
Delphi 6 Personal
 
#5

AW: Radiobutton per Taste auslösen?

  Alt 26. Dez 2012, 18:22
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



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?
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Radiobutton per Taste auslösen?

  Alt 26. Dez 2012, 19:15
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Astobix

Registriert seit: 26. Dez 2012
26 Beiträge
 
Delphi 6 Personal
 
#7

AW: Radiobutton per Taste auslösen?

  Alt 26. Dez 2012, 19:50
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#8

AW: Radiobutton per Taste auslösen?

  Alt 26. Dez 2012, 20:09
Binde mal die Unit LCLType mit ein.
uses ..., LCLType;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#9

AW: Radiobutton per Taste auslösen?

  Alt 26. Dez 2012, 20:11
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
Markus H.

Geändert von markus5766h (26. Dez 2012 um 20:13 Uhr)
  Mit Zitat antworten Zitat
Astobix

Registriert seit: 26. Dez 2012
26 Beiträge
 
Delphi 6 Personal
 
#10

AW: Radiobutton per Taste auslösen?

  Alt 26. Dez 2012, 21:14
Okay, vielen Dank für eure antworten
Das hier kann meinetwegen geschlossen werden

Gruß
Astobix
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:42 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