Auswahl BitButtons


HarryXVI

Erfahrenes Mitglied
#1
Ich habe in meinem Formular die OnKeyDown-Methode verwendet. Wenn Pfeil nach links gedrückt wird, soll sich ein Image nach links bewegen. Das klappt. Wenn ich das Programm starte, ist ein BitButton ausgewählt (eingedrückt) und wenn ich dann Pfeiltasten drücke, wechselt die Auswahl der BitButtons (habe 5 stück im formular). Wie kann ich es machen, dass die Buttons nicht "eingedrückt" sind und ich somit Zugriff auf das Image habe?
 

HarryXVI

Erfahrenes Mitglied
#3
Ich hab auf Buttons gewechselt, das war einfacher. Ein Screenshot:

Screenshot vom Formular

Nun sieht man links einen Smiley (ImSpieler), der mit den Pfeiltasten bewegt werden soll (KeyDown-Ereignis). Beim Start ist auf dem Formular der Button "1" markiert/eingedrückt (im Screen zu sehen). Wenn ich die Pfeiltasten drücke, wechselt die Markierung der Buttons, nicht jedoch die Position des Smileys.


Code:
procedure TSpielfeld.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key = VK_LEFT then ImSpieler.Left := ImSpieler.Left -3;
if Key = VK_RIGHT then ImSpieler.Left := ImSpieler.Left +3;
if Key = VK_UP then ImSpieler.Top := ImSpieler.Top -3;
if Key = VK_DOWN then ImSpieler.Top := ImSpieler.Top +3;
end;
Was mache ich falsch? Wie könnte ich das Problem beheben?
 

HarryXVI

Erfahrenes Mitglied
#5
Wie zeichnest du den Smily? Machst du nach dem KeyDown und der Neupositionierung des Smilies auch einen Refresh auf den darstellenden Canvas, damit die Positionsänderung angezeigt werden kann? Hast du KeyPreview des Formulars auf true? Löscht du nach dem KeyDown den Tastaturcode?
Smiley ist ein Image, das bei Programmstart Visible := true hat (ist also sofort sichtbar).
Brauche ich Refresh dann noch? Was soll das anstellen?
KeyPreview ist jetzt auf true.
Wie soll ich den Tastaturcode löschen?
 
Zuletzt bearbeitet:
#6
Brauche ich Refresh dann noch?
Ja. Evtl. sogar noch mehr.

Deine Smily-Bewegung zeichnen. Und so lange du dich weiter ausschweigst über deinen Source, z.B. über so unwichtige Kleinigkeiten wie WO und WANN dein Smily gezeichnet wird, kann ich dir wohl auch nicht mehr weiterhelfen.


Wie soll ich den Tastaturcode löschen?
Nach Abarbeitung
Code:
Key := 0;
ausführen.
 

HarryXVI

Erfahrenes Mitglied
#7
über so unwichtige Kleinigkeiten wie WO und WANN dein Smily gezeichnet wird
Der Smiley wird nicht gezeichnet, sondern ist eine Komponente vom Typ TImage im Formular. Im Objektinspektor steht die Eigenschaft Visible auf true. Ich könnte natürlich extra in der FormCreate-Methode ImSpieler.Visible := true machen, aber warum? Hilft dir das jetzt weiter?
 

HarryXVI

Erfahrenes Mitglied
#8
Code:
procedure TSpielfeld.FormCreate(Sender: TObject);
begin
...
Station1.Enabled := false; Station2.Enabled := false;
Station3.Enabled := false; Station4.Enabled := false
end;
Die Buttons werden zum Programmstart deaktivert, somit können sie auch nicht ausgewählt / "eingedrückt" sein.

Code:
procedure TSpielfeld.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case Key of
  VK_LEFT : ImSpieler.Left := ImSpieler.Left -4;
  VK_RIGHT : ImSpieler.Left := ImSpieler.Left +4;
  VK_UP : ImSpieler.Top := ImSpieler.Top -4;
  VK_DOWN : ImSpieler.Top := ImSpieler.Top +4;
  end;
Key := 0;
...
end;
Jetzt kann der Smiley (ImSpieler) perfekt bewegt werden. Wenn er bestimmte Positionen erreicht, werden die Buttons aktiviert, ein externes Fenster wird geöffnet. Wenn dies geschlossen wird, wird der Button wieder deaktivert und ich kann weiter mit den Pfeiltasten arbeiten.
 
#9
Der Smiley wird nicht gezeichnet, sondern ist eine Komponente vom Typ TImage im Formular. Im Objektinspektor steht die Eigenschaft Visible auf true. Ich könnte natürlich extra in der FormCreate-Methode ImSpieler.Visible := true machen, aber warum? Hilft dir das jetzt weiter?
Ja, hilft mir etwas weiter. Da war ich wohl wieder etwas zu ungenau. Dein Smily wird doch gezeichnet, denn iregendwie müssen ja die Pixel deines Monitors die entsprechenden Farben annehmen. In diesem Fall ist es so, daß eben das TImage (oder noch genauer: Der Inhalt des TImage) auf das Formular gezeichnet wird. Und zwar von Windows selbst. Das ist wieder eine Vereinfachung, sollte aber für den Anfang genügen.
Wenn du Visible auf true setzt, dann sagst du deinem Formular einfach nur: Da ist an TImage auf X/Y, das soll angezeigt werden. Und es wird angezeigt. Nicht mehr und nicht weniger.

Code:
procedure TSpielfeld.FormCreate(Sender: TObject);
begin
...
Station1.Enabled := false; Station2.Enabled := false;
Station3.Enabled := false; Station4.Enabled := false
...
Jetzt wird mir auch klarer, was der Smily bewirken soll.

Jetzt kann der Smiley (ImSpieler) perfekt bewegt werden.
Heisst das, dass dein Programm jetzt funktioniert? Dann Glückwunsch, aber es wundert mich doch etwas, weil es meiner Erfahrung mit dem Bewegen von Bitmaps auf einem Formular widerspricht. Aber wenn's klappt - dann will ich weder gegenargumentieren noch meckern. Never change a running system. :)