Onkeypress in Procedure

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Moax
Beiträge: 2
Registriert: Do 10. Jun 2010, 17:53

Onkeypress in Procedure

Beitrag von Moax »

Hallo Leute,
Ich will mit Lazarus ein Programm schreiben, dass ähnlich wie Ping Pong ist.
Soweit so gut, habe alles hingekriegt, nur leider kann ich keine Eingabe (Tastatur, Maus) machen, während die Procedure läuft. Diese soll jedoch solange laufen bis halt die Kugel nicht "gefangen" worden ist. Mein Informatik-Lehrer hat mir geraten dass ganze in die OnkeyPress-Procedure zu schreiben, aber leider ist die Variable Key dann ja immer die selbe (aktualisiert sich nicht).
Deshalb meine Frage, gibt es einen Befehl, der wie Onkeypress funktioniert und in einer Procedure die Tasten abfragt?
Schonmal Danke im voraus : )

Benutzeravatar
theo
Beiträge: 11005
Registriert: Mo 11. Sep 2006, 19:01

Re: Onkeypress in Procedure

Beitrag von theo »

Bau in deine Hauptroutine ein Application.Processmessages ein. Dann kannst du auf den Tastendruck reagieren.
Ich würde aber eher OnKeyDown oder OnKeyUp verwenden, denn du willst ja nichts schreiben.

Moax
Beiträge: 2
Registriert: Do 10. Jun 2010, 17:53

Re: Onkeypress in Procedure

Beitrag von Moax »

Ah vielen Dank, das hilft mir schon weiter. Aber wenn ich jetzt eine Taste drücke stoppt er die Procedure Button1.click und führt die andere aus. Gibt es eine Möglichkeit kurz die Procedure Keydown auszuführen und dann mit der Procedure Button... weiterzu machen?
Danke im Voraus

Benutzeravatar
theo
Beiträge: 11005
Registriert: Mo 11. Sep 2006, 19:01

Re: Onkeypress in Procedure

Beitrag von theo »

Moax hat geschrieben:Gibt es eine Möglichkeit kurz die Procedure Keydown auszuführen und dann mit der Procedure Button... weiterzu machen?
Genau das passiert doch.
??

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: Onkeypress in Procedure

Beitrag von felix96 »

Guck mal nach threads.
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

shokwave
Beiträge: 476
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Onkeypress in Procedure

Beitrag von shokwave »

felix96 hat geschrieben:Guck mal nach threads.
Das finde ich jetzt ein wenig übertrieben.

Ich würde einen TTimer für die Spielmechanik nehmen, dann kannst du ohne Verrenkungen OnKeyDown für die Tastatureingaben benutzen.

TTimer.Interval - legt die Zeit in ms fest wie schnell hintereinander das Ereignis TTimer.OnTimer aufgerufen wird.
TTimer.enabled - Start(true)/Ende(false)
TTimer.OnTimer - der Spielablauf z.B. bewege Ball um 3 Pixel, prüfe auf Wand bzw. noch im Spielfeld...
mfg Ingo

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: Onkeypress in Procedure

Beitrag von lrlr »

der "normale" timer ist window message basiert (war er zumindest mal im delphi)

die windows messages kommen schon mal verspätet und/oder gehäuft an

ein flüssiger spiel ablauf also nicht gewährleistet

besser wäre TJvThreadTimer (thread basiert) thread priorität kann man auch höher setzen..

immer fix 3pixel bewegen ist auch "schlecht" man sollte/muss sich die strecke anhand der tatsächlich seit dem letzten aufruf verstrichenen zeit ausrechnen...

(die "idee" mit processmessages ist generell KAUM eine gute idee..)

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Onkeypress in Procedure

Beitrag von Hitman »

Leute ... hier stellt jemand eine Frage für ein Schulprojekt im Informatik-Unterricht. Meint Ihr ernsthaft, da wäre TThread oder irgendwelche Dritt-Komponenten eine hilfreiche Antwort? Wollt Ihr vielleicht noch ein paar Vorschläge für Projektmanagement oder Quellcodeverwaltung machen? Hilft Neulingen sicher ungemein Fuss zu fassen und Spass zu haben ...

Also Moax, TTimer ist sicherlich eine ganz gute Lösung. Solltest du es weiterhin alles im OnClick des Buttons abarbeiten wollen, dann bau dir noch eine globale Variable "Cancel" oder so ein, die, sobald die True wird, deine Schleife unterbricht. Im OnKeyPress kannst du dann einfach diese Variable auf True setzen und wird dann durch das bereits beschrieben Application.ProcessMessages ausgelöst.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Onkeypress in Procedure

Beitrag von pluto »

Für ein Ping Pong, habe ich hier ein ganz Gutes Beispiel gefunden:
http://www.delphipraxis.net/2635-image- ... assen.html" onclick="window.open(this.href);return false;
Schau dir das mal an. Vielleicht Hilft es dir etwas weiter.

Den ganzen Code in einer Click-Procedure ein zu bauen ist schlecht. Es gibt ein Paar Nachteile:
01: Du erstellst so eine Art "Endlos" schleife, die den MainThread deiner Anwendung aufhältst.
02: Dadurch können, keine anderen User-Inputs wie das drücken einer Taste abgefangen werden. Auch der Vorschlag von Theo ändert hier nichts. Dann werden zwar andere Botschaften verarbeitet, jedoch wird die Bewegung des Balls "Kurz" unterbrochen. Das kann zu unerwünschten Effekten führen.

Dein Problem ist nicht OnKeyPress sondern die Frage: Wie führt man "Sachen" (fast) gleichzeitig aus ?
Der Standard Timer reicht für deinen Fall vollkommen. Der ist zwar ungenau, aber das einfachste. Es gibt noch das onIdl Event von TApllication. Dafür findest du sogar eine Komponente.
Ein Thread wäre dafür zu übertrieben. Das würde eine reihe weitere Fragen aufwerfen. Ein Thread habe ich bei meinen Spielen auch noch nie verwendet.

Ich habe schon viele Spiele mit Canvas erstellt. Es geht also. Ich habe bisher auch nur "ein Timer" verwendet.
MFG
Michael Springwald

Antworten