hi, bisher verwendete ich für das abfragen meiner tasten das onkeyup bzw das onkeydown des formulurares.
jetzt habe ich diverse komponenten auf dem formular und trotz keypreview := true tut sich bei mir rein gar nischt.
Wenn du mehrere Komponenten auf der Form hast zB. Buttons etc. greift die FormKeyDown / FormKeyUp Methode nicht mehr,
sobald eines der Komponenten den Focus hat. Das Problem habe ich selber nicht wirklich gelöst, ich habe es dann so gemacht,
dass ich die Komponenten die ich benötigt habe mit meiner OGL-Gui gezeichnet habe...
Falls ich dein Problem richtig verstanden habe, hoffe ich dir ein wenig geholfen zu haben
leider möchte ich die komponenten net auf das gl fenster zeichnen, das ist das problem und getasynckeystate funzt zwar, verursacht aber die oben genannten probleme Oo
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Hallo Seth,
ich hab es grade ausprobiert: Wenn Du bei allen Komponenten, die Du auf Deinem Form draufhast, die Eigenschaft "Tabstop" auf "False" setzt dann empfängt das Fenster wieder Tastendrücke; KeyPreview muss nicht True sein. Weiß jetzt nicht ob es auch anders geht.
Traude
EDIT: Es geht doch nicht. Denn wenn man mit der Maus eine Komponente anklickt, kriegt dieses den Focus und läßt ihn nicht mehr los. Ich habe das in einem früheren Projekt implementiert und habe mir damals folgende Notizen dazu gemacht:
//********************************************************************
// Das Map-Panel kann die CursorTasten nicht auffangen,
// daher müssen die Tastenanschläge vom Formular gelesen werden:
// 1. Das Ereignis KeyDown muss vom Formular behandelt werden
// 2. KEIN EINZIGES Steuerelement darf TabStop = True haben
// 3. KEYPREVIEW des Formulars muss FALSE sein
// 4. Die Ereignisbehandlungsmethode OnMouseMove des MapPanel muss alle
// Panels defokussieren, die einen Fokus erhalten können ("DefocusControl")
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Bin mir da gerade nicht 100%tig sicher aber alternativ sollte man auch auf einem Panel rendern können. Wenn man dieses etwas anpasst. Also so, dass es einen Fokus bekommen kann, dann verhält es sich wie eine Komponente und bekommt alle Tasten mit. Natürlich nur sofern es fokusiert wurde. Aber sonst ist ja auch der Button XYZ aktiv und soll auf die Leertaste etc. reagieren.
Ich habe das mal auf meine Seite geladen. Das ist aber so ausgelegt, dass man im OnPaint rendert, da es nicht für eine Renderschleife konzipiert wurde. Ist vom Code her nichts berauschendes. Aber dann verhält sich die OpenGL Ansicht wie eine Komponente. Na ja. Ist ja auch eine.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
@Seth: Tut mir leid, das weiß ich leider nicht. Aber GetAsyncKeystate ist eine WINAPI-Funktion und Du mischt daher hier VCL und WINAPI, vielleicht ist das der Grund. Aber, wie gesagt, ich weiß es nicht.
@Lossy: Bei dem Beispiel oben rendere ich mit OpenGL auf einem Panel, habe aber noch zahlreiche andere VCL-Panels mit Knöpfen drauf (es ist ein Spiele-Editor).
EDIT: Lossy: Wie hast Du das gemacht? Das TPanel hat kein OnKeyDown-Ereignis. Hast Du ihm eines implementiert?
nochmal EDIT: Ich hab mir das AdvancedPanel angesehen: Nicht schlecht. Ich kann mich erinnern, damals mit den Ereignissen für den Spiele-Editor ganz schön gerauft zu haben.
also ich rendere auf ein panel, wie könnte ich das mit deinem panel beheben ?
und verwechseln tue ich nichts, schau dir den source an, das eine ist im onidle, das andere im onkeyup / down, zwei verschiedene methoden. das eine ist ein ereignis und das andere ist ne statusabfrage im onidle
mfg
Zuletzt geändert von Seth am Di Mai 22, 2007 20:02, insgesamt 1-mal geändert.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Das TCustomPanel bietet schon die Ereignisse OnKeyDown/Up bzw irgendeine Klasse davor und die Ereignisse mache ich nur sichtbar.
Code:
published
...
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
Aber das Standardpanel kann keinen Focus bekommen weswegen der auch keine richtigen Tastaturevents bekommt bzw sich nicht vor die anderen Komponenten "drängeln" kann.
mit dem advanced panel funzt das super danke allerdings zeichne ich darauf immernoch wie ein normales panel, "darf" ich das, oder kann das zu komplikationen führen ? Bisher läuft das ohne Probleme
Registriert: Fr Feb 23, 2007 12:51 Beiträge: 2 Wohnort: In meiner Dunklen ecke
Was ist der unterschied zwischen getasynckeystate(vk_left) und getkeystate(vk_left)?
Ich hab in einem kleinem Programm mal die verwendung von:
Code:
if getkeystate(vk_left) > 0thenbegin
xxxxxx
end;
Hab mir die funktion getkeystate mal angeschaut und die liefert abwechselnd den wert 128 und 127 wenn die taste unten ist und 0 -1 wenn nicht (soweit ich mich richtig erinnere)
Vieleicht ist es wenn du es so machst weniger laggy =D (Vieleicht)
_________________ >.< Ich bin nicht Krank ich bin nur anders >.<
get keystate setzt das bit 7(128) wenn die taste gedrückt ist. Jeden 2. druck setzt es das bit 0(1)was nur für capslock etc interessant ist. Also kannst du mit (getkeystate(keycode) and 128<>0) feststellen ob eine taste gerdückt ist. GetAsyncKeystate liefert zurück ob die taste gerade gedrückt ist, und ob sie seit dem letzen aufruf von getasynckeystate mit diesem Parameter in diesem Thread gedrückt war. Welche Bits dafür zuständig sind kannst du entweder in der Win32 Hilfe von Delphi oder der MSDN nachlesen.
GetAsyncKeystate liefert außerdem den direkten Status der Taste wie sie gerade ist (praktisch "Hardware" status). GetKeyState hingegen hängt irgendwie davon ab ob die entsprechende Nachricht schon von der Anwendung verarbeitet wurde. Wenn man z.b. einen Tastatur Hook gesetzt hat KANN es passieren das GetKeyState im Hook den falschen status zurück gibt, GetAsyncKeyState hingegen funktioniert immer.
Mitglieder in diesem Forum: 0 Mitglieder und 8 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.