Guten Tag,
ich brauche mal wieder Eure Hilfe!
Wie kann ich unter Lazarus die Eingabe eines Passworts in der Konsole sofort maskieren - d.h. Buchstaben für Buchstaben?
Vielen Dank vorab für Eure Bemühungen.
Beste Grüße
mbulm1
Passworteingabe über Konsole
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2809
- 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: Passworteingabe über Konsole
Schnell und schmutzig so:
Benötigt die Units Crt und SysUtils.
Code: Alles auswählen
function ReadMasked: String;
var
c: Char;
begin
Result := EmptyStr;
repeat
c := ReadKey;
if not (c = #13) then begin
Result := Result + c;
Write('*');
end;
until c = #13;
end;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Passworteingabe über Konsole
Wenn man noch eine abfrage auf #8 (backspace) zum löschen des letzten characters einfügt ist das denk ich mal ne ausreichende funktion. Aber, ich persönlich bin kein sonderlich großer fan der CRT Unit, da sie eigenes buffering vornimmt, und man wenn man sie benutzt einige sachen nicht mehr so trivial zu benutzen sind (da praktisch zwischen jeder ausgabe die CRT unit geschaltet wird, was es wiederum nicht erlaubt eigene low level sachen zu machen)m.fuchs hat geschrieben:Schnell und schmutzig so:
[...]
Benötigt die Units Crt und SysUtils.
Dafür hatte ich mal in dieser Unit einiges an Funktionalität geschrieben, unter anderem auch eine ReadChar methode: Link
Re: Passworteingabe über Konsole
Hallo "Warf",
das mit #8(Backspace) habe ich jetzt nicht so richtig verstanden - kannst Du das mit Quellcode etwas erläutern?
Lieben Dank vorab!
BG
mbulm1
das mit #8(Backspace) habe ich jetzt nicht so richtig verstanden - kannst Du das mit Quellcode etwas erläutern?
Lieben Dank vorab!
BG
mbulm1
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Passworteingabe über Konsole
Ich hab dir hier mal ne etwas ausgefeiltere Version geschrieben. Das problem ist, um das ganze richtig gut zu machen müsste man viel mehr arbeit reinstecken (damit z.B. Pfeiltasten nicht als Chars gehandelt werden, etc.)
Code: Alles auswählen
function ReadMasked(const Prefix: String; const MaskChar: Char): String;
function getClearText(len: Integer): String;
begin
SetLength(Result, Prefix.Length + len + 2);
Result[1] := #13;
FillChar(Result[2], Prefix.Length + len, ' ');
Result[Result.Length] := #13;
end;
var
Masked: String;
c: Char;
clearLength: Integer;
begin
clearLength:=0;
Masked := '';
Result := '';
while True do
begin
Write(getClearText(clearLength), Prefix, Masked);
clearLength:=Masked.Length;
c := ReadKey;
case c of
#0..#7,#10..#12,#14..#31:
// Non Printable chars
continue;
#8:
begin // Backspace -> remove last char
Result := Result.Remove(Result.Length - 1);
Masked := Masked.Remove(Masked.Length - 1);
end;
#13: // Enter -> break loop and return password
break;
else
begin // other, printable chars
Result += c;
Masked += MaskChar;
end;
end;
end;
Writeln;
end;
// Benutzung:
var
PW: String;
...
PW := ReadMasked('Password: ', '*');
Re: Passworteingabe über Konsole
Danke "Warf" - Du bist mehr als SUPER - jetzt habe ich es verstanden!
BG
mbulm1
BG
mbulm1