KeyUp-Ereignis nachprogrammieren

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

KeyUp-Ereignis nachprogrammieren

Beitragvon Nixsager » 25. Okt 2016, 07:50 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
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Michl » 25. Okt 2016, 08:39 Re: KeyUp-Ereignis nachprogrammieren

Hast du eine Message Queue?
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2320
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Nixsager » 25. Okt 2016, 08:46 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.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Michl » 25. Okt 2016, 09:14 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:
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; 
Michl
 
Beiträge: 2320
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Nixsager » 25. Okt 2016, 12:52 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.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Michl » 25. Okt 2016, 13:17 Re: KeyUp-Ereignis nachprogrammieren

Nixsager hat geschrieben:Das ist eher was um die Wiederholrate der gedrückten Taste zu ändern.
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)?
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2320
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Nixsager » 25. Okt 2016, 17:14 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.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Nixsager » 26. Okt 2016, 10:39 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

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!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 4 Gäste

porpoises-institution
accuracy-worried