KeyUp-Ereignis nachprogrammieren

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Nixsager
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

Beitrag von Nixsager »

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!!!

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: KeyUp-Ereignis nachprogrammieren

Beitrag von Michl »

Hast du eine Message Queue?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Nixsager
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

Beitrag von Nixsager »

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!!!

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: KeyUp-Ereignis nachprogrammieren

Beitrag von Michl »

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; 

Nixsager
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

Beitrag von Nixsager »

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!!!

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: KeyUp-Ereignis nachprogrammieren

Beitrag von Michl »

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; 

Nixsager
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

Beitrag von Nixsager »

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: 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

Beitrag von Nixsager »

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!!!

Antworten