Unix Konsolen Programm

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
HK12
Beiträge: 31
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Unix Konsolen Programm

Beitrag von HK12 »

Hi,
ich möchte gerne abfragen ob eine Taste gedrückt wurde. So wie KeyPressed in Crt. Ich möchte aber nicht die Crt einbauen. Gibt es eine andere möglichkeit abzufragen ob eine Taste gedrückt wurde (in einer schleife) und dann den KeyCode abholen? Ich finde dazu so rein garnichts im Internet.

Vielen dank im Voraus

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Unix Konsolen Programm

Beitrag von fliegermichl »

unit keyboard einbinden

HK12
Beiträge: 31
Registriert: Mi 7. Feb 2018, 10:31
OS, Lazarus, FPC: Winux (FPC 3.x)
CPU-Target: xxBit

Re: Unix Konsolen Programm

Beitrag von HK12 »

Hi,
erstmal danke. Das habe ich nicht gefunden. Leider reagiert KeyPressed nur auf Return. Mache ich da was falsch? Ich möchte eigentlich CRTL-C abfangen. Wäre aber nicht schlimm wenn es nur ein Buchstabe z.b. E wäre.

Dank deiner Hilfe konnte ich nun anders suchen und habe das gefunden.
https://www.freepascal.org/docs-html/cu ... event.html

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Unix Konsolen Programm

Beitrag von Warf »

Ich hab mal ne lib geschrieben die das kann: https://github.com/Warfley/LazTermUtils

Schau dir mal die beispiele readkey und non blocking readkey an:

Readkey:

Code: Alles auswählen

Term := TTerminal.Create;
  try
    Term.Input.DirectRead:=True; // Ändert das verhalten der konsole das keyboard events wie strg+c nicht als signale aufgefasst werden
    repeat
      k := Term.Input.ReadKey;
      [...]
    until (k.CharValue = 'c') and (kmCtrl in k.Modifiers); // Testen auf C mit Modifier Strg
  finally
    Term.Free;
  end;

Code: Alles auswählen

  Term := TTerminal.Create;
  try
    Term.Input.DirectRead:=True;
    [...]
    while true do
    begin
      ...
      if Term.Input.ReadKeyNonBlocking(key) then // War überhaupt ein key press
        if Key.SpecialKey and (Key.SpecialKeyCode = skEscape) then // Falls ja check was es war
          Break;
      Sleep(100);
    end;
  finally
    Term.Free;
  end;
Aber du musst um STRG+C abfangen zu können das verhalten der Konsole massiv verändern (DirectRead := True macht das), was sehr unangenehm sein kann. Wenn du also nur Strg+C fangen willst ist das registrieren eines Handlers für SIGINT wahrscheinlich deutlich angenehmer und einfacher

Antworten