delphimvcframework/sources/MVCFramework.Console.pas
Daniele Teti a8d57bb78b RC10
2017-10-16 22:57:49 +02:00

131 lines
2.4 KiB
ObjectPascal

unit MVCFramework.Console;
interface
type
TConsoleMode = (Normal, Bright);
TConsoleColor = (
Black = 30,
Red = 31,
Green = 32,
Yellow = 33,
Blue = 34,
Magenta = 35,
Cyan = 36,
White = 37);
procedure ResetConsole;
procedure TextColor(const Color: TConsoleColor);
procedure TextBackground(const Color: TConsoleColor);
procedure SetMode(const ConsoleMode: TConsoleMode);
implementation
uses
{$IFDEF MSWINDOWS}
WinApi.Windows,
{$ENDIF}
System.SysUtils;
const
ESC = Chr(27);
var
GForeGround: TConsoleColor;
GBackGround: TConsoleColor;
GMode: TConsoleMode = TConsolemode.Normal;
function ToBackGround(const ForeGround: Byte): Byte;
begin
if (GMode = TConsoleMode.Bright) and (ForeGround <> Byte(TConsoleColor.Black)) then
begin
Result := ForeGround + 10 + 60;
end
else
begin
Result := ForeGround + 10;
end;
end;
{$IFDEF LINUX}
procedure EnableVirtualTerminalProcessing; inline;
begin
// do nothing
end;
{$ELSE}
procedure EnableVirtualTerminalProcessing; inline;
const
ENABLE_VIRTUAL_TERMINAL_PROCESSING = $0004;
var
hOut: THandle;
dwMode: UInt32;
begin
hOut := GetStdHandle(STD_OUTPUT_HANDLE);
if hOut = INVALID_HANDLE_VALUE then
raise Exception.CreateFmt('GetLastError() = %d', [GetLastError]);
dwMode := 0;
if (not GetConsoleMode(hOut, &dwMode)) then
raise Exception.CreateFmt('GetLastError() = %d', [GetLastError]);
dwMode := dwMode or ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (not SetConsoleMode(hOut, dwMode)) then
raise Exception.CreateFmt('GetLastError() = %d', [GetLastError]);
end;
{$ENDIF}
procedure ResetConsole;
begin
write(ESC + '[0m');
end;
function GetColorString: string;
begin
if GMode = TConsoleMode.Bright then
Result := Format('[%d;1;%dm', [Byte(GForeGround), ToBackGround(Byte(GBackGround))])
else
Result := Format('[%d;%dm', [Byte(GForeGround), ToBackGround(Byte(GBackGround))]);
end;
procedure TextColor(const Color: TConsoleColor);
begin
GForeGround := Color;
write(ESC + GetColorString);
end;
procedure TextBackground(const Color: TConsoleColor);
begin
GBackGround := Color;
write(ESC + GetColorString);
end;
procedure SetMode(const ConsoleMode: TConsoleMode);
begin
GMode := ConsoleMode;
end;
procedure InitDefault;
begin
GForeGround := TConsoleColor.White;
GBackGround := TConsoleColor.Black;
end;
initialization
EnableVirtualTerminalProcessing;
InitDefault;
finalization
end.