tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
1364
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    HarryXVI HarryXVI ist offline Mitglied Gold
    Registriert seit
    Apr 2008
    Beiträge
    108
    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?
     

  2. #2
    Registriert seit
    Mar 2004
    Beiträge
    441
    Zitat Zitat von HarryXVI Beitrag anzeigen
    Wie kann ich es machen, dass die Buttons nicht "eingedrückt" sind und ich somit Zugriff auf das Image habe?
    Lies die Bitmap über den Buttonhandle aus, bevor das Ereignis des "Button als gedrückt markieren"-Ereignisses eintritt.

    Genauere Informationen kann ich dir leider nicht geben, da ich nicht die leiseste Ahnung habe, wie dein Source aussieht.
     

  3. #3
    HarryXVI HarryXVI ist offline Mitglied Gold
    Registriert seit
    Apr 2008
    Beiträge
    108
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    
    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?
     

  4. #4
    Registriert seit
    Mar 2004
    Beiträge
    441
    Zitat Zitat von HarryXVI Beitrag anzeigen
    Was mache ich falsch? Wie könnte ich das Problem beheben?
    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?
     

  5. #5
    HarryXVI HarryXVI ist offline Mitglied Gold
    Registriert seit
    Apr 2008
    Beiträge
    108
    Zitat Zitat von CSANecromancer Beitrag anzeigen
    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?
    Geändert von HarryXVI (11.02.09 um 18:36 Uhr)
     

  6. #6
    Registriert seit
    Mar 2004
    Beiträge
    441
    Zitat Zitat von HarryXVI Beitrag anzeigen
    Brauche ich Refresh dann noch?
    Ja. Evtl. sogar noch mehr.

    Zitat Zitat von HarryXVI Beitrag anzeigen
    Was soll das anstellen?
    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.


    Zitat Zitat von HarryXVI Beitrag anzeigen
    Wie soll ich den Tastaturcode löschen?
    Nach Abarbeitung
    Code :
    1
    
    Key := 0;
    ausführen.
     

  7. #7
    HarryXVI HarryXVI ist offline Mitglied Gold
    Registriert seit
    Apr 2008
    Beiträge
    108
    ü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?
     

  8. #8
    HarryXVI HarryXVI ist offline Mitglied Gold
    Registriert seit
    Apr 2008
    Beiträge
    108
    Code :
    1
    2
    3
    4
    5
    6
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    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. #9
    Registriert seit
    Mar 2004
    Beiträge
    441
    Zitat Zitat von HarryXVI Beitrag anzeigen
    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.

    Zitat Zitat von HarryXVI Beitrag anzeigen
    Code :
    1
    2
    3
    4
    5
    6
    7
    
     
    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.

    Zitat Zitat von HarryXVI Beitrag anzeigen
    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.
     

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 06.06.06, 21:32
  2. SDK Auswahl
    Von realpk im Forum .NET Archiv
    Antworten: 2
    Letzter Beitrag: 01.03.05, 19:13
  3. auswahl
    Von flashdragon im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 1
    Letzter Beitrag: 25.02.05, 16:31
  4. Normale Auswahl -> Pfad Auswahl
    Von C4T im Forum Photoshop
    Antworten: 4
    Letzter Beitrag: 10.08.04, 13:23
  5. auswahl
    Von flake im Forum Photoshop
    Antworten: 1
    Letzter Beitrag: 08.07.02, 19:58