Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 13, 2025 03:28

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Key Down problem-..
BeitragVerfasst: Do Nov 27, 2008 14:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 18, 2008 11:10
Beiträge: 23
Wohnort: Hamburg
Hey,
also ich hab ein Problem mit on Key Press und on Key down.-..

eigentlich geht das auch immer. z.b. wenn ich mit der 'w' tate auf der x-achse entlangfahren will etc.

Allerdings funktioniert das nicht mehr, wenn ich ein Panel , Button oder sowas mit in die Form einbaue...

Kann mir jemand weiterhelfen,..??


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2008 14:35 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Das On-Key wird auf das aktive Element gesendet. Und das wird in deinem Fällen dann eben das Panel/Button sein.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2008 15:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 18, 2008 11:10
Beiträge: 23
Wohnort: Hamburg
und wie kann ich das verhindern bzw wie kann ich die Form wieder als aktiv setzen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 27, 2008 16:48 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

dazu musst du die .KeyPreview Eigenschaft der Komponente auf True stellen.

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 28, 2008 15:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 18, 2008 11:10
Beiträge: 23
Wohnort: Hamburg
Okay keyprewiev der Form ist true aber es geht immer noch nicht... ???

ähm... zusatzt angaben: es geht die tasteneingabe bei einem TImage (da gibts aber kein Key-Preview...)


Hier mal zusätzlich der Quellcode,( den ich eigentlich gar nicht selbst geschrieben habe sonder als Tutorial dient...)
(handelt sich um ein Snake spiel)
Code:
  1.  
  2. type snake = record
  3. x,y:integer;
  4. end;
  5.  
  6. type TFutter = record
  7. x,y,interval : integer;
  8. end;
  9.  
  10. type
  11.   TForm6 = class(TForm)
  12.     Image1: TImage;
  13.     Timer1: TTimer;
  14.     Label1: TLabel;
  15.     Button1: TButton;
  16.     procedure Timer1Timer(Sender: TObject);
  17.     procedure FormCreate(Sender: TObject);
  18.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  19.       Shift: TShiftState);
  20.       procedure verloren;
  21.       procedure futter_setzen;
  22.     procedure Button1Click(Sender: TObject);
  23. //    function loser : boolean ;
  24.   private
  25.     { Private-Deklarationen }
  26.   public
  27.     { Public-Deklarationen }
  28.   end;
  29.  
  30. var
  31.   Form6 : TForm6;
  32.   linie : array of snake;
  33.   Yrichtung,Xrichtung:integer;
  34.   taste_gedr:Boolean;
  35.   loser : Boolean;
  36.   time : integer;
  37.   futter :TFutter;
  38. implementation
  39.  
  40. {$R *.dfm}
  41.  
  42. procedure TForm6.futter_setzen;
  43. var i:integer;
  44.     erfolg :Boolean;
  45. begin
  46. erfolg := true;
  47. repeat
  48. for i := 0 to high(linie) do
  49. if (futter.x = linie[i].x) and (futter.y = linie[i].y) then
  50. begin
  51. futter.x := (Random(480 Div 20) + 1) * 20;
  52. futter.y := (Random(380 Div 20) + 1) * 20;
  53. erfolg := false;
  54. end;
  55. until erfolg;
  56. Label1.Caption := 'Punkte : ' + inttostr ((High(linie) - 3) * 10);
  57. end;
  58.  
  59. procedure TForm6.verloren;
  60. var i :integer;
  61. begin
  62.  
  63. if (linie[0].x = futter.x) and  (linie[0].y = futter.y) then
  64. begin
  65. futter.x := (Random(480 Div 20) + 1) * 20;
  66. futter.y := (Random(380 Div 20) + 1) * 20;
  67. time := 0;
  68. SetLength(linie,High(linie)+2);
  69. futter_setzen;
  70. end;
  71.  
  72. if (linie[0].x <= 10) or (linie[0].y <= 10) or (linie[0].x >= 500) or (linie[0].y >= 400) then
  73. loser := true;
  74.  
  75. for i:= 1 to High(linie) do
  76.  if (linie[0].x = linie[i].x) and (linie[0].y  = linie[i].y) then
  77.  loser := true;
  78.  
  79. end;
  80.  
  81. procedure TForm6.Timer1Timer(Sender: TObject);
  82. var i,rep:integer;
  83. begin
  84. inc(time);
  85.  
  86. if time > futter.interval then begin
  87. futter.x := (Random(480 Div 20) + 1) * 20;
  88. futter.y := (Random(380 Div 20) + 1) * 20;
  89. time := 0;
  90. futter_setzen;
  91. end;
  92.  
  93. for i := high(linie) downto 1 do
  94. linie[i] := linie[i-1];
  95.  
  96.  with Image1.Canvas do
  97.  begin
  98.  Brush.Color := clBlack;
  99. Rectangle(0,0,Image1.Width,Image1.Height);
  100.  Pen.Width := 10;
  101.  pen.Color := clred;
  102.  MoveTo(futter.x,futter.y);
  103.  Lineto(futter.x,futter.y);
  104.  pen.Color := clred;
  105.  inc(linie[0].x,Xrichtung);
  106.  inc(linie[0].y,Yrichtung);
  107.  
  108.  
  109.  
  110. verloren;
  111. if loser = true then
  112. begin
  113. Timer1.Enabled := false;
  114. Label1.Caption:='Haha Verloren, Trottel';
  115. //rep := Application.MessageBox('Sie haben verloren!','Looser!',MB_ICONINFORMATION + MB_RETRYCANCEL);
  116. //if rep = ID_Retry then FormCreate(sender);
  117. exit;
  118. end;
  119.  
  120.  
  121.   for i:= 1 to High(linie)-1 do
  122.   begin
  123.   pen.Width := 10;
  124.   pen.Color := clred;
  125.   Rectangle(linie[i].x -5,linie[i].y -5,linie[i].x +5,linie[i].y +5);
  126.   pen.Color := clblack;
  127.   Pixels[0,0] := clblack;
  128.   Rectangle(linie[i].x -3,linie[i].y -3,linie[i].x +3,linie[i].y +3);
  129.   end;
  130.   pen.Color := clred;
  131.   Ellipse(linie[0].x -6,linie[0].y -6,linie[0].x +6,linie[0].y +6);
  132.   Rectangle(linie[0].x -4,linie[0].y -4,linie[0].x +4,linie[0].y +4);
  133.  
  134.  
  135.   end;
  136. taste_gedr:=false;
  137. Image1.Canvas.Pixels[0,0]:= clred;
  138. end;
  139.  
  140. procedure TForm6.FormCreate(Sender: TObject);
  141. begin
  142.  
  143. With image1.Canvas do begin
  144. pen.Width := 10;
  145. pen.Style := psSolid;
  146. brush.Style := bsSolid;
  147. pen.Color := clred;
  148. Rectangle(0,0,Image1.Width,Image1.Height);
  149.  
  150. Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.Height);
  151. end;
  152.  
  153.  
  154.  
  155. //Am Anfang Richtung: nach rechts
  156. Yrichtung:=0;
  157. Xrichtung:=-20;
  158. futter.interval := 40;
  159. time :=2000;
  160. loser:=false;
  161. Randomize;
  162.  
  163.  
  164.  
  165. SetLength(linie,4);
  166.  
  167. //Anfangsposition
  168. linie[0].x := 220;
  169. linie[0].y := 200;
  170. linie[1].x := 240;
  171. linie[1].y := 200;
  172. linie[2].x := 260;
  173. linie[2].y := 200;
  174. linie[3].x := 280;
  175. linie[3].y := 200;
  176.  
  177. timer1.Enabled := false;
  178. timer1.Enabled:=true;
  179. taste_gedr:=false;
  180. end;
  181.  
  182.  
  183.  
  184. procedure TForm6.FormKeyDown(Sender: TObject; var Key: Word;
  185.   Shift: TShiftState);
  186. begin
  187.  if taste_gedr = false then
  188. begin
  189.  if (key = vk_up) and (Yrichtung <= 0) then
  190.   begin
  191.     Yrichtung:= -20;
  192.     Xrichtung:= 0;
  193.     taste_gedr:=true;
  194.   end;
  195.  
  196.  if (key = vk_left) and (Xrichtung <= 0) then
  197.   begin
  198.     Yrichtung:= 0;
  199.     Xrichtung:= -20;
  200.     taste_gedr:=true;
  201.   end;
  202.  
  203.  if (key = vk_space) then
  204.   begin
  205.     Yrichtung:= 0;
  206.     Xrichtung:= 0;
  207.     taste_gedr:=true;
  208.   end;
  209.  
  210.  if (key = vk_right) and (Xrichtung >= 0) then
  211.     begin
  212.     Yrichtung:= 0;
  213.     Xrichtung:= 20;
  214.     taste_gedr:=true;
  215.   end;
  216.  
  217.  if (key = vk_down) and (Yrichtung >= 0) then
  218.     begin
  219.     Yrichtung:= 20;
  220.     Xrichtung:= 0;
  221.     taste_gedr:=true;
  222.   end;
  223. end;
  224. end;
  225.  
  226. procedure TForm6.Button1Click(Sender: TObject);
  227. begin
  228. //Timer1.Enabled := true;
  229. FormCreate(sender);
  230. end;
  231.  
  232. end.


Danke für Hilfe...

Edit by i0n0s:
Pascal-Tags sowie Code im Anhang.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 08, 2008 23:51 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
für tasten abfragen verwende ich nen Code in der form:

Code:
  1.  
  2.   if getasynckeystate(VK_UP) <> 0
  3.   then top:= top + fps*128;
  4.  


dieser code wird unabhängig vom focus ausgeführt (wenn man nicht aufpasst sogar, wenn nichteinmal das Programm
aktiv ist, was zur folge hat, dass zB. das Schreiben in ICQ auch die events auslöst).
Funktionieren tut es dafür zuverlässig in den meisten Fällen. mit einem Array[0..255] of boolean, kann man dann
den zustand speichern, ob die taste noch gedrückt ist. dafür verwende ich dann diesen code:

Code:
  1.  
  2.   var keylist:array[0..255] of boolean;
  3.  
  4.   if getasynckeystate(VK_UP) <> 0
  5.   then begin
  6.       if (keylist[VK_UP]=false)
  7.       then aktionausfuehren;
  8.       keylist[VK_UP]:= true;
  9.   end
  10.   else keylist[VK_UP]:= false;
  11.  


auf diese weiße kann man eine aktion nur einmal pro tastendruck ausführen. Ist zwar zum herum fahren auf tastendruck
unnötig, aber bei anderen Sachen wider nützlich.
Allerdings weiß ich nicht, ob diese Lösung so sauber ist, wie sie mir rüberkommt.

grüße!

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]