Linux : Cursor Position ve Text Attributte API Muadili

Created with Sketch.

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ış

Yorumunuzu ekleyin