{ This file is part of restemplate. Copyright (C) 2015 Andreas Schneider restemplate is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. restemplate is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with restemplate. If not, see . } unit UCRTHelper; {$mode objfpc}{$H+} interface uses Classes, SysUtils, crt; type TPromptMode = (pmNormal, pmPassword); function Prompt(ACaption: String; AMode: TPromptMode = pmNormal): String; overload; function Prompt(ACaption, ADefault: String; AMode: TPromptMode = pmNormal): String; overload; implementation function Prompt(ACaption: String; AMode: TPromptMode): String; begin Result := Prompt(ACaption, '', AMode); end; function Prompt(ACaption, ADefault: String; AMode: TPromptMode): String; var c: Char; begin Write(ACaption); if ADefault <> '' then Write(' [', ADefault, ']'); Write(': '); Result := ''; repeat c := ReadKey; if (c = #8) and (Length(Result) > 0) then begin Write(#8, ' ', #8); SetLength(Result, Length(Result) - 1); end else if c > #31 then begin Result := Result + c; case AMode of pmNormal: Write(c); pmPassword: Write('*'); end; end; until (c = #13) or (c = ^C); if (c = #13) and (Result = '') then begin Result := ADefault; Write(ADefault); end; if c = ^C then Result := ''; //Pretend that nothing happened. Writeln; //Always end the line end; end.