
Linux : Cursor Position ve Text Attributte API Muadili
Soru
Bilindiği üzere Tokyo sürümüyle beraber Linux için konsol uygulamaları geliştirebiliyoruz. Windows konsol ortamında imleç pozisyonu ve text renklendirmeleri için SetConsoleCursorPosition ve SetConsoleTextAttribute gibi bazı API’leri kullanıyoruz. Bu API’ler text ekranda ( konsolda / Ms-DOS ekranında ) imlecin konumunu / metnin zemin ve metin rengini ayarlamaya yarıyor.
Bu API’lerin Linux eşdeğeri hangisidir, nereden bulabilirim?
Cevap
program Renkli;
{$APPTYPE CONSOLE}
uses
System.SysUtils // Format
{$IFDEF MSWINDOWS} // Windows ise
, WinApi.Windows // SetConsoleTextAttribute , SetConsoleCursorPosition
{$ENDIF}
;
const
clBlack = 0;
clBlue = 1;
clGreen = 2;
clCyan = 3;
clRed = 4;
clMagenta = 5;
clBrown = 6;
clSilver = 7;
{$IFDEF MSWINDOWS}
clDarkGray = 8;
clLightBlue = 9;
clLightGreen = 10;
clLightCyan = 11;
clLightRed = 12;
clLightMagenta = 13;
clYellow = 14;
clWhite = 15;
{$ENDIF}
procedure Color(Zemin, Metin: Integer);
begin
{$IFDEF MSWINDOWS}
SetConsoleTextAttribute ( GetStdHandle(STD_OUTPUT_HANDLE)
, (Zemin * 16) or Metin
);
{$ENDIF}
{$IFNDEF MSWINDOWS}
Write( Format(#27'[%d'#27'[%d', [Zemin + 40, Metin + 30] ) );
{$ENDIF}
end;
procedure CLS;
{$IFDEF MSWINDOWS}
var
CRT : THandle;
Bufinf : TConsoleScreenBufferInfo;
ConsoleSize : DWORD;
NumWritten : DWORD;
Koordinat : TCoord;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
CRT := GetStdHandle(STD_OUTPUT_HANDLE);
Win32Check(CRT <> INVALID_HANDLE_VALUE);
Win32Check(GetConsoleScreenBufferInfo(CRT, Bufinf));
ConsoleSize := Bufinf.dwSize.X * Bufinf.dwSize.Y;
Koordinat.X := 0;
Koordinat.Y := 0;
Win32Check(FillConsoleOutputCharacter(CRT, ' ', ConsoleSize, Koordinat, NumWritten));
Win32Check(FillConsoleOutputAttribute(CRT, Bufinf.wAttributes, ConsoleSize, Koordinat, NumWritten));
Win32Check(SetConsoleCursorPosition(CRT, Koordinat));
{$ENDIF}
{$IFNDEF MSWINDOWS}
write(#27'[2J');
{$ENDIF}
end;
procedure GotoXY(X,Y: Byte);
{$IFDEF MSWINDOWS}
var
Z: _COORD;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
Z.X := X;
Z.Y := Y;
SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE), Z );
{$ENDIF}
{$IFNDEF MSWINDOWS}
Write( Format(#27'[%d;%dH', [X.ToString, Y.ToString]) );
{$ENDIF}
end;
function Print(aMetin: String): string; overload;
begin
Result := aMetin;
Write(Result);
end;
function Print(X, Y: Byte; aMetin: String): string; overload;
begin
Result := aMetin;
GotoXY(X, Y);
Write(Result);
end;
function Print(aMetin: String; const Args: array of const): string; overload;
begin
Result := format(aMetin, Args);
Write(Result);
end;
function Print(X, Y: Byte; aMetin: String; const Args: array of const): string; overload;
begin
GotoXY(X, Y);
Result := Print(aMetin, Args);
end;
procedure Pencere(aBaslik: AnsiString; X, Y, B, E: Byte; Zemin, Metin: Integer);
var
I: Integer;
begin
Color(Zemin, Metin);
Print(X,Y, '┌%s┐', [StringOfChar('─', E - 2)]);
for I := 1 to B - 2
do Print(X, Y + I, '│%s│', [StringOfChar(' ', E - 2)]);
Print(X, Y + I, '└%s┘', [StringOfChar('─', E - 2)]);
Print(X + 2, Y, '[%s]', [aBaslik]);
end;
var
I, J, X: Integer;
begin
CLS;
Pencere('Bi Pencere', 2, 2, 15, 35, clSilver, clRed);
Color(clSilver, clGreen);
Print(4, 4, 'Türkçe Harf Testleri ');
Print(4, 5, 'çöğüşiı / ÇÖĞÜŞİI / 0123456789');
Color(clBlack, clSilver);
Print(0, 0, '');
Readln;
end.
Şöyle de bir ekran çıktısı üretiyor…
Yorum yapılmamış