Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Fokus auf Paintbox/Image setzen (https://www.delphipraxis.net/156120-fokus-auf-paintbox-image-setzen.html)

MaKa117 20. Nov 2010 17:22

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

s.h.a.r.k 20. Nov 2010 17:24

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.

MaKa117 20. Nov 2010 17:27

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.

s.h.a.r.k 20. Nov 2010 17:28

AW: Fokus auf Paintbox/Image setzen
 
Zeig doch mal die wichtigen Stellen, wie du das ganze denn überhaupt machst.

MaKa117 20. Nov 2010 17:30

AW: Fokus auf Paintbox/Image setzen
 
Also: hier das FormKeyDown
Code:
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;
das wird dann in der Unit Steuerung so umgesetzt:

Code:
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;
und dann hier in der Unit Snake

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;

s.h.a.r.k 20. Nov 2010 17:37

AW: Fokus auf Paintbox/Image setzen
 
Oha, da hab ich mich wohl geirrt, das kommt aus der Delphi-Hilfe:
Zitat:

Die Einstellung bezieht sich nicht auf Navigationstasten (TAB, Pfeiltasten usw.), da diese keine Tastaturereignisse auslösen. Ähnliches gilt, wenn eine Schaltfläche den Fokus hat oder wenn dessen Eigenschaft Default den Wert true hat. Die Eingabetaste wird von KeyPreview nicht berücksichtigt, da diese kein Tastaturereignis auslöst.
Dann musst wohl auf Windows-Messages ausweichen.

MaKa117 20. Nov 2010 17:38

AW: Fokus auf Paintbox/Image setzen
 
Oder ich würde es auf W-A-S-D setzen. Oder?

Bummi 20. Nov 2010 17:38

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.

MaKa117 20. Nov 2010 17:44

AW: Fokus auf Paintbox/Image setzen
 
Ah, so klappts.
Jetzt noch eine Frage: Kann man so etwas auch für ComboBoxes und ScrollBars einrichten?

Bummi 20. Nov 2010 17:49

AW: Fokus auf Paintbox/Image setzen
 
Wenn Du Wincontrols benötigst dann kanst Du Dir hiermit behelfen....
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if msg.message=wm_keyDown then
      begin
        MeineAktionMit(msg.wParam);
        handled := true;
      end;
end;
Du kannst dann auch Buttons nehmen und wertest OnKeyDown nicht mehr aus...


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 Uhr.
Seite 1 von 2  1 2      

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