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
Konsolenprogramm: Globaler Hotkey / Bearbeiten eines Strings
- 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
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- 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
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.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.
Am ehesten geht sowas wohl ohne Lazarus mit der "TUI" "Text-User-Interface) -IDE von Free Pascal.
Auch hier nimmst Du besser eine GUI oder ein TUI.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
-Michael
-
- 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
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!!!
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
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
-
- 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
"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
-Michael
- 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
Hm, ich hatte gehofft dass es da irgendwelche Trick gibt, zum Beispiel mit Konsolenprogrammen auf Basis von TCustomApplication. Schade.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, [...]
Beides nützt mir leider nichts. Die Anwendung soll einfach von blinden Nutzern bedienbar sein, da ist GUI und TUI nicht die erste Wahl.mschnell hat geschrieben:Auch hier nimmst Du besser eine GUI oder ein TUI.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
Michael
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de