Konsolenprogramm: Globaler Hotkey / Bearbeiten eines Strings

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2826
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Konsolenprogramm: Globaler Hotkey / Bearbeiten eines Strings

Beitrag von m.fuchs »

Moin,

nachdem ich plötzlich vor der Aufgabe stehe ein einfaches Benutzerinterface als Konsolenanwendung zu realisieren, habe ich zwei Probleme.

1.) Ist es möglich einen globalen Hotkeyhandler zu bauen, den ich einmal initialisiere und der dann im Hintergrund der Applikation lauscht und auf bestimmt Tasten reagiert?
Also zum Beispiel beim drücken von F1 immer eine bestimmte Methode auszuführen. Auch wenn der Benutzer gerade dabei ist über ReadLn eine Eingabe zu tätigen.

2.) Bei der Neueingabe eines Datensatzes benutze ich ReadLn. Nun benötige ich aber auch die Möglichkeit bestehende Datensätze zu ändern. Gibt es dafür schon eine fertige Funktion, die also den aktuellen Inhalt eines Strings ausgibt und der Benutzer kann diesen Inhalt verändern und dann per ENTER wieder in der Variable speichern?

mfg
Michael
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Konsolenprogramm: Globaler Hotkey / Bearbeiten eines Strings

Beitrag von mschnell »

m.fuchs hat geschrieben:1.) Ist es möglich einen globalen Hotkeyhandler zu bauen, den ich einmal initialisiere und der dann im Hintergrund der Applikation lauscht und auf bestimmt Tasten reagiert?
Also zum Beispiel beim drücken von F1 immer eine bestimmte Methode auszuführen. Auch wenn der Benutzer gerade dabei ist über ReadLn eine Eingabe zu tätigen.
Nein. Genau das ist der Unterschied zwischen einem (Konsolen-) "Programm" und einer "Application". Einige "Application"-Typen haben eine Event-Queue und elauben deshalb, dass das auf mehrere alternative Ereignisse reagiert werden kann, bzw dass Ereignisse registriert werden,m auf die man nicht gerade wartet. Lazarus erlaubt verschiedene "Application" bzw "Widget" - Typen (Windows, Mac, GTK, ...). Leider aber keine, die Ohne eine GUI ("Graphical User Interface") auskommt.

Am ehesten geht sowas wohl ohne Lazarus mit der "TUI" "Text-User-Interface) -IDE von Free Pascal.
m.fuchs hat geschrieben:2.) Bei der Neueingabe eines Datensatzes benutze ich ReadLn. Nun benötige ich aber auch die Möglichkeit bestehende Datensätze zu ändern. Gibt es dafür schon eine fertige Funktion, die also den aktuellen Inhalt eines Strings ausgibt und der Benutzer kann diesen Inhalt verändern und dann per ENTER wieder in der Variable speichern?l
Auch hier nimmst Du besser eine GUI oder ein TUI.

-Michael

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Konsolenprogramm: Globaler Hotkey / Bearbeiten eines Strings

Beitrag von gocher »

Man kann die Tastatur folgendermaßen überwachen, aber dann funktioniert readln natürlich nicht!
Schön ist anders aber es geht! Das Beispiel ist funktionstüchtig!!!

Code: Alles auswählen

program Test;
uses
  Crt, Windows;
 
var
  AppTerminated: Boolean;
  Line : string;
 
function ByteToHex(InByte:byte):shortstring;
const Digits:array[0..15] of char='0123456789ABCDEF';
begin
 result:=digits[InByte shr 4]+digits[InByte and $0F];
end;
 
procedure onKeyPress();
var key: char;
begin
  key := ReadKey();
  if key=char(0) then //Alt & Fx
  begin
    key := ReadKey();
    writeln('[00' + ByteTohex(Byte(key)) + ']');
  end
  else if key=char($1B) then //Esc
    AppTerminated := true
  else if key=char($08) then //Backspace
    SetLength(Line, Length(Line)-1)
  else if key=char($0D) then //CR
  begin
    WriteLn(Char($0D)+Line); // an dieser Stelle steht dein readln Ergebnis in der Variablen Line
    Line := '';
  end
  else
    Line := Line + key;
  Write(Char($0D)+Line + ' ' + Char($08)); //zurück zum Zeilenanfang + Zeile + womöglich durch Backspace überschriebenes Zeichen + Backspace
end;   
 
begin
  AppTerminated := False;
 
  while not AppTerminated do
  begin
    if KeyPressed then
      onKeyPress();
    sleep(100);
  end;
end.
Zuletzt geändert von gocher am Mo 26. Dez 2011, 18:32, insgesamt 1-mal geändert.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Konsolenprogramm: Globaler Hotkey / Bearbeiten eines Strings

Beitrag von mschnell »

"OnKeyPress" wird in einem Konsolen-Programm nicht funktionieren, weil es eine Event-Queue braucht. in einem Konsolen-Programm kann man nur mit "Read" auf eine Taste warten (dann geht aber gleichzeitig nichts anderes).

-Michael

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2826
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Konsolenprogramm: Globaler Hotkey / Bearbeiten eines Strings

Beitrag von m.fuchs »

mschnell hat geschrieben:Nein. Genau das ist der Unterschied zwischen einem (Konsolen-) "Programm" und einer "Application". Einige "Application"-Typen haben eine Event-Queue und elauben deshalb, dass das auf mehrere alternative Ereignisse reagiert werden kann, [...]
Hm, ich hatte gehofft dass es da irgendwelche Trick gibt, zum Beispiel mit Konsolenprogrammen auf Basis von TCustomApplication. Schade.
mschnell hat geschrieben:
m.fuchs hat geschrieben:2.) Bei der Neueingabe eines Datensatzes benutze ich ReadLn. Nun benötige ich aber auch die Möglichkeit bestehende Datensätze zu ändern. Gibt es dafür schon eine fertige Funktion, die also den aktuellen Inhalt eines Strings ausgibt und der Benutzer kann diesen Inhalt verändern und dann per ENTER wieder in der Variable speichern?l
Auch hier nimmst Du besser eine GUI oder ein TUI.
Beides nützt mir leider nichts. Die Anwendung soll einfach von blinden Nutzern bedienbar sein, da ist GUI und TUI nicht die erste Wahl.

Michael
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten