KeyUp-Ereignis nachprogrammieren
-
- Beiträge: 168
- Registriert: Sa 8. Okt 2016, 08:38
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Polska
KeyUp-Ereignis nachprogrammieren
Hi
Ich habe eine Unit (die Unit arbeitet mit Scancode Set 1) die gut auf KeyDown reagiert, aber leider keine KeyUp-Funktion hat.
Das einzige was mir eingefallen ist um es nach zu programmieren, hintereinander nach dem KeyDown-Status abfragen, das bringt mir aber nur einen Absturz.
Dann dachte ich an ein Array, aber das schien mir zu kompliziert und ich hätte mehr an der Unit arbeiten müssen.
Das was ich jetzt habe, arbeitet mit einer Schleife, die aufgerufen wird wenn die Taste gedrückt wird, und die Schleife verlassen wird wenn die Taste nicht mehr gedrückt wird.
Nur leider pausiert das ganze Programm solange bis ich die Taste wieder loslasse.
Hat einer eine Idee wie ich das besser nachprogrammieren kann?
Gruß vom Nixsager
Ich habe eine Unit (die Unit arbeitet mit Scancode Set 1) die gut auf KeyDown reagiert, aber leider keine KeyUp-Funktion hat.
Das einzige was mir eingefallen ist um es nach zu programmieren, hintereinander nach dem KeyDown-Status abfragen, das bringt mir aber nur einen Absturz.
Dann dachte ich an ein Array, aber das schien mir zu kompliziert und ich hätte mehr an der Unit arbeiten müssen.
Das was ich jetzt habe, arbeitet mit einer Schleife, die aufgerufen wird wenn die Taste gedrückt wird, und die Schleife verlassen wird wenn die Taste nicht mehr gedrückt wird.
Nur leider pausiert das ganze Programm solange bis ich die Taste wieder loslasse.
Hat einer eine Idee wie ich das besser nachprogrammieren kann?
Gruß vom Nixsager
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Re: KeyUp-Ereignis nachprogrammieren
Hast du eine Message Queue?
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 168
- Registriert: Sa 8. Okt 2016, 08:38
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Polska
Re: KeyUp-Ereignis nachprogrammieren
Wenn du das meinst, was mir Wikipedia dazu sagt, dann nein.
Die Unit die ich benutze fragt den Interrupt 9 ab.
Es muss doch möglich sein über die KeyDown-Funktion ohne weiter den Interupt 9 abzufragen ein KeyUp-Funktion zu bauen.
Die Unit die ich benutze fragt den Interrupt 9 ab.
Es muss doch möglich sein über die KeyDown-Funktion ohne weiter den Interupt 9 abzufragen ein KeyUp-Funktion zu bauen.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Re: KeyUp-Ereignis nachprogrammieren
Normalerweise fängt man die Message vom System ein und verwendet diese.
Procedurales Coding, ist bei mir schon eine halbe Ewigkeit her, vielleicht gibt es auch bessere Lösungen. Aber wenn ich mich richtig erinnere, habe ich früher sowas in der Art gemacht:
Procedurales Coding, ist bei mir schon eine halbe Ewigkeit her, vielleicht gibt es auch bessere Lösungen. Aber wenn ich mich richtig erinnere, habe ich früher sowas in der Art gemacht:
Code: Alles auswählen
program project1;
uses
Crt, sysutils;
var
Terminated: Boolean;
Key: Char;
KeyTime: QWord;
procedure KeyUp;
begin
WriteLn('KeyUp ', Key);
Key := #0;
KeyTime := 0;
end;
procedure KeyDown;
var
aKey: Char;
begin
aKey := ReadKey;
WriteLn('KeyDown ', aKey);
case aKey of
#27: Terminated := True;
end;
if (KeyTime = 0) or (Key = aKey) then
KeyTime := GetTickCount64;
Key := aKey;
end;
procedure Machirgendwas;
begin
if Random(100000) = 0 then
WriteLn('Machirgendwas ', Random(100));
end;
begin
Key := #0;
KeyTime := 0;
Terminated := False;
repeat
if KeyPressed then KeyDown;
if (KeyTime > 0) and (GetTickCount64 - KeyTime > 100) then KeyUp;
Machirgendwas;
until Terminated;
end.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 168
- Registriert: Sa 8. Okt 2016, 08:38
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Polska
Re: KeyUp-Ereignis nachprogrammieren
Also wenn ich den Code richtig verstanden habe, ist das nicht so wirklich was ich gesucht habe.
Die Idee könnte ich aber für eine Funktionserweiterung gebrauchen.
Das ist eher was um die Wiederholrate der gedrückten Taste zu ändern.
Die Idee könnte ich aber für eine Funktionserweiterung gebrauchen.
Das ist eher was um die Wiederholrate der gedrückten Taste zu ändern.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Re: KeyUp-Ereignis nachprogrammieren
Nö. Der Code macht genau das, wie ich es verstanden hatte, die Simulation eines Ereignisses KeyUp, wenn man nur ein Ereignis KeyDown hat. Hast du es mal probiert (Projekt -> Neues Projekt -> Einfaches Programm und den Code per Drag&Drop eingefügt)?Nixsager hat geschrieben:Das ist eher was um die Wiederholrate der gedrückten Taste zu ändern.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 168
- Registriert: Sa 8. Okt 2016, 08:38
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Polska
Re: KeyUp-Ereignis nachprogrammieren
Ja habe ich. Unter FP und TP.
Na gut, ich hatte ein bisschen mit dem Code gespielt. Und bei den Cursor-Tasten bzw. bei den Tasten die einen 2 Byte großen Scancode habe, taucht das beschriebene Ergebnis auf.
Na gut einen kleinen Fehler scheint das Programm zu haben. Wenn ich auf einen Taste drücke, gibt er mir direkt ein KeyUp aus. Das konnte ich lösenen, in dem 'KeyTime' zur einer vorzeichenbehafteten Integerdatentyp gemacht habe und in der KeyUp-Prozedur der Variabel den Wert '-1' zugewiesen habe.
Als das mit 'if (KeyTime = 0) or (Key = aKey) then' verstehe ich nicht ganz.
Ich glaube, wenn die Tasten eine Mindestzeit gedrückt ist, wird ein KeyUp-Status ausgegeben.
Scheint zumindestens nach 'if (KeyTime > 0) and (GetTickCount64 - KeyTime > 100) then KeyUp;' so zu sein.
Aber einen großen Nachteil hat das ganze.
Na gut, ich nutze eine dauerhaft Schleife, ab ich frage die Taste nach dem Prinzip 'If KeyDown(Taste) then' ab.
Danke. Ich werde mal mit dem Ansatz weiter probieren.
Ich muss schauen wie ich das unter einem Hut bekomme.
Na gut, ich hatte ein bisschen mit dem Code gespielt. Und bei den Cursor-Tasten bzw. bei den Tasten die einen 2 Byte großen Scancode habe, taucht das beschriebene Ergebnis auf.
Na gut einen kleinen Fehler scheint das Programm zu haben. Wenn ich auf einen Taste drücke, gibt er mir direkt ein KeyUp aus. Das konnte ich lösenen, in dem 'KeyTime' zur einer vorzeichenbehafteten Integerdatentyp gemacht habe und in der KeyUp-Prozedur der Variabel den Wert '-1' zugewiesen habe.
Als das mit 'if (KeyTime = 0) or (Key = aKey) then' verstehe ich nicht ganz.
Ich glaube, wenn die Tasten eine Mindestzeit gedrückt ist, wird ein KeyUp-Status ausgegeben.
Scheint zumindestens nach 'if (KeyTime > 0) and (GetTickCount64 - KeyTime > 100) then KeyUp;' so zu sein.
Aber einen großen Nachteil hat das ganze.
Na gut, ich nutze eine dauerhaft Schleife, ab ich frage die Taste nach dem Prinzip 'If KeyDown(Taste) then' ab.
Danke. Ich werde mal mit dem Ansatz weiter probieren.
Ich muss schauen wie ich das unter einem Hut bekomme.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
-
- Beiträge: 168
- Registriert: Sa 8. Okt 2016, 08:38
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Polska
Re: KeyUp-Ereignis nachprogrammieren
Habe es jetzt mit einem Array gelöst. Dafür habe Ich die KeyDown-Funktion ein bisschen erweitert.
KeyDown setzt wenn eine angegebene Taste gedrückt wird. an der Position im Array die der angegebenen Taste zugewiesen ist den Wert auf 'True'.
KeyUp fragt mit der Hilfe von KeyDown nach ob aktuell die angegebene Taste gedrückt wird, und wenn sie nicht gedrückt wird, wird in dem Array nachgeschaut ob die angegebene Taste mal gedrückt wurde.
Wird die angegebene Taste aktuell nicht gedrückt, aber wurde sie mal gedrückt, wird der Rückgabewert auf 'True' gesetzt und im Array wird an der Position die der angegebenen Taste zugewiesen ist der Wert auf 'False' gesetzt.
Wenn aber eine Taste gedrückt wird, oder sie nicht mal gedrückt wurde, wird der Rückgabewert auf 'False' gesetzt
Wenn ihr eine bessere Lösung habt, dann nur her damit.
Danke Michl!
Wieder so ein Fall wo schon die Idee dazu hatte. Aber dachte mir, es gebe eine bessere Lösung.
KeyDown setzt wenn eine angegebene Taste gedrückt wird. an der Position im Array die der angegebenen Taste zugewiesen ist den Wert auf 'True'.
KeyUp fragt mit der Hilfe von KeyDown nach ob aktuell die angegebene Taste gedrückt wird, und wenn sie nicht gedrückt wird, wird in dem Array nachgeschaut ob die angegebene Taste mal gedrückt wurde.
Wird die angegebene Taste aktuell nicht gedrückt, aber wurde sie mal gedrückt, wird der Rückgabewert auf 'True' gesetzt und im Array wird an der Position die der angegebenen Taste zugewiesen ist der Wert auf 'False' gesetzt.
Wenn aber eine Taste gedrückt wird, oder sie nicht mal gedrückt wurde, wird der Rückgabewert auf 'False' gesetzt
Code: Alles auswählen
Function KeyUp(Key: Byte): Boolean;
begin
KeyUp := False;
If (KeyDown(Key)=False) and (KeyData3[Key]=True) then
begin
KeyUp := True;
KeyData3[Key] := False;
end
else
KeyUp := False;
Wenn ihr eine bessere Lösung habt, dann nur her damit.
Danke Michl!
Wieder so ein Fall wo schon die Idee dazu hatte. Aber dachte mir, es gebe eine bessere Lösung.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!