![]() |
Fokus auf Paintbox/Image setzen
Hi,
ich habe ein kleines Problem: Ich bin gerade dabei, Snake zu programmieren und wollte eigentlich noch Buttons hinzufügen, die das Spiel stoppen, usw. Das Problem ist nur, dass man ja auf ein Image keinen Fokus legen kann. Bei der Paintbox sieht es ja leider genau so aus. Das heißt, dass, wenn ich einen Button auf Enabled true setze, ist der Fokus automatisch auf diesem und das Spiel funktioniert nicht. Kann mir vielleicht einer von euch weiterhelfen? Gruß MaKa117 |
AW: Fokus auf Paintbox/Image setzen
Es kommt erst mal drauf an, wie du die Pfeiltasten erkennst und damit die Schlange bewegst. Setzt du bei einer Form KeyPreview auf true, dann kannst du mit OnKeyPress die Tasten global für die Form abfangen und abfragen, egal ob der Fokus auf einem Button oder in einem Edit liegt.
|
AW: Fokus auf Paintbox/Image setzen
Ich rufe das ganze per FormKeyDown ab. wenn ich jetzt im FormCreate KeyPreview := true ergänze, klappt das ganze trotzdem nicht.
|
AW: Fokus auf Paintbox/Image setzen
Zeig doch mal die wichtigen Stellen, wie du das ganze denn überhaupt machst.
|
AW: Fokus auf Paintbox/Image setzen
Also: hier das FormKeyDown
Code:
das wird dann in der Unit Steuerung so umgesetzt:
procedure TF_Snake.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin case Key of vk_Space: begin Timer1.Enabled := not Timer1.Enabled; if Timer1.Enabled = false then F_Snake.Caption := 'Snake - Um zu starten, drücke Leertaste'; if Timer1.Enabled = true then F_Snake.Caption := 'Snake - Um zu pausieren, drücke Leertaste'; end; vk_Up : step := 1; vk_Right : step := 2; vk_Left : step := -2; vk_Down : step := -1; end; end;
Code:
und dann hier in der Unit Snake
procedure TSteuerung.BewegeSnake(move: integer);
var XKopf, YKopf, XApfel, YApfel: integer; begin Spielfeld.LadeBild; step := move; Snake.Bewegen(move); Treffer := Snake.Kollision; xKopf := Snake.GetXPosition(0); YKopf := Snake.GetYPosition(0); XApfel := Apfel.GetXPosition; YApfel := Apfel.GetYPosition; if (xKopf = xApfel) and (YKopf = YApfel) then begin Snake.Wachsen; inc(Score); Panel1.Caption := 'Score: ' + IntToStr(Score); SetzeApfel; Apfel.Zeigen; end; Snake.Zeigen; Apfel.Zeigen; end;
Code:
procedure TSnake.Bewegungsvorgang;
begin case Step of 1: Teile[0].SetXYPosition(Teile[0].GetXPosition,Teile[0].GetYPosition-20); 2: Teile[0].SetXYPosition(Teile[0].GetXPosition+20,Teile[0].GetYPosition); -2: Teile[0].SetXYPosition(Teile[0].GetXPosition-20,Teile[0].GetYPosition); -1: Teile[0].SetXYPosition(Teile[0].GetXPosition,Teile[0].GetYPosition+20); end; if Teile[0].GetXPosition = Breite then Teile[0].SetXYPosition(0,Teile[0].GetYPosition); if Teile[0].GetXPosition < 0 then Teile[0].SetXYPosition(Breite-20,Teile[0].GetYPosition); if Teile[0].GetYPosition = Hoehe then Teile[0].SetXYPosition(Teile[0].GetXPosition,0); if Teile[0].GetYPosition < 0 then Teile[0].SetXYPosition(Teile[0].GetXPosition,Hoehe-20); end; |
AW: Fokus auf Paintbox/Image setzen
Oha, da hab ich mich wohl geirrt, das kommt aus der Delphi-Hilfe:
Zitat:
|
AW: Fokus auf Paintbox/Image setzen
Oder ich würde es auf W-A-S-D setzen. Oder?
|
AW: Fokus auf Paintbox/Image setzen
Die einfachste Lösung ist wenn Du statt des Buttons einen Speedbutton nimmst, und bei Key=13 diese auslöst.
|
AW: Fokus auf Paintbox/Image setzen
Ah, so klappts.
Jetzt noch eine Frage: Kann man so etwas auch für ComboBoxes und ScrollBars einrichten? |
AW: Fokus auf Paintbox/Image setzen
Wenn Du Wincontrols benötigst dann kanst Du Dir hiermit behelfen....
Delphi-Quellcode:
Du kannst dann auch Buttons nehmen und wertest OnKeyDown nicht mehr aus...
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean); begin if msg.message=wm_keyDown then begin MeineAktionMit(msg.wParam); handled := true; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 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