Potansif Logo
potansif.com Kurumsal Çözümler
Mühendislik Arşivi Yayın Tarihi: 30 Eylül 2019 • Yazar: Uğur Parlayan

Linux : Cursor Position ve Text Attributte API Muadili

#delphi #Programlama #Linux #SetConsoleCursorPosition #Ansi Escape Sequence #SetConsoleTextAttribute #Soru-Cevap

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' ) );
  {$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') );
  {$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┐', );
  for I := 1 to B - 2
  do  Print(X, Y + I, '│%s│', );
  Print(X, Y + I, '└%s┘', );
  Print(X + 2, Y, '', );
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…