Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Linux Cursor Position ve Text Attributte API muadili...
#1
Merhaba,

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 / DOS ekranında ) imlecin konumunu  / metnin zemin ve yazı rengini ayarlamaya yarıyor.

Bu API'lerin Linux eşdeğeri hangisidir, nereden bulabilirim?
YouTube Delphi Tips
"Mantıklı adam kendini dünyaya uyarlar; mantıksız adam ise dünyayı kendine uydurmakta inat eder. Bu nedenle, tüm ilerleme o inatçı adama bağlıdır." - George Bernard Shaw
WWW
Cevapla
#2
Deneme şansım yok ama ANSI Escape sequences kullanılarak belki yapılabilir.(Sanırım Delphi'nin kullandığı Linux derleyicisine bağlı)
Bu yöntemle konsola yazdırmak istediğiniz metin "escape" karakteri ve ardından köşeli parantezle başlamalı. Yukarıdaki linkte renk kodları vs. yazıyor. Denemek lazım Smile
Örneğin; kırmızı Selam yazmak için:
WriteLn(#27'[31mSelam');
There's no place like 127.0.0.1
WWW
Cevapla
#3
(31-10-2017, Saat: 16:54)SimaWB Adlı Kullanıcıdan Alıntı: Deneme şansım yok ama ANSI Escape sequences kullanılarak belki yapılabilir.(Sanırım Delphi'nin kullandığı Linux derleyicisine bağlı)
Bu yöntemle konsola yazdırmak istediğiniz metin "escape" karakteri ve ardından köşeli parantezle başlamalı. Yukarıdaki linkte renk kodları vs. yazıyor. Denemek lazım Smile
Örneğin; kırmızı Selam yazmak için:
WriteLn(#27'[31mSelam');

Merhaba,
Sizin adınıza bir test ettim. Gayet sağlıklı çalışıyor. 

2017-10-31_17-03-36.png
DelphiCan'dır!
Cevapla
#4
Açıkçası böyle bir çözüm beklemiyordum, ilginç oldu, teşekkür ederim.
YouTube Delphi Tips
"Mantıklı adam kendini dünyaya uyarlar; mantıksız adam ise dünyayı kendine uydurmakta inat eder. Bu nedenle, tüm ilerleme o inatçı adama bağlıdır." - George Bernard Shaw
WWW
Cevapla
#5
Fesih bey, paylaştığınız ekran görüntüsünde macOS olduğunu görüyorum, rica etsem aynı kodu macOS'da da deneyebilir misiniz?
YouTube Delphi Tips
"Mantıklı adam kendini dünyaya uyarlar; mantıksız adam ise dünyayı kendine uydurmakta inat eder. Bu nedenle, tüm ilerleme o inatçı adama bağlıdır." - George Bernard Shaw
WWW
Cevapla
#6
(31-10-2017, Saat: 18:14)uparlayan Adlı Kullanıcıdan Alıntı: Fesih bey, paylaştığınız ekran görüntüsünde macOS olduğunu görüyorum, rica etsem aynı kodu macOS'da da deneyebilir misiniz?

2017-10-31_18-27-47.png

Geriye Windows testi kaldı, onu da bir zahmet siz yapın. Smile
DelphiCan'dır!
Cevapla
#7
Yoldayım üstat, yorarmıydım yoksa  Wink



GÜNCELLEME

Windows'ta maya tutmadı

o6V8d9.png
YouTube Delphi Tips
"Mantıklı adam kendini dünyaya uyarlar; mantıksız adam ise dünyayı kendine uydurmakta inat eder. Bu nedenle, tüm ilerleme o inatçı adama bağlıdır." - George Bernard Shaw
WWW
Cevapla
#8
Bir sonuca bağlamadan  konuyu bitirmek istemedim. Kaynak olması açısından aşağıdaki kod belki bir gün birinin işine yarar niyetiyle;

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...

rJ1MEP.png

SimaWB'e ayrıca teşekkürler.
YouTube Delphi Tips
"Mantıklı adam kendini dünyaya uyarlar; mantıksız adam ise dünyayı kendine uydurmakta inat eder. Bu nedenle, tüm ilerleme o inatçı adama bağlıdır." - George Bernard Shaw
WWW
Cevapla
#9
Harika bir sonuçlandırma olmuş. Elinize, emeğinize sağlık.
Forumlarda sıklıkla karşılaştığımız, soru sorup da cevabını alıp gidenlere örnek olur inşallah!
There's no place like 127.0.0.1
WWW
Cevapla
#10
Elinize sağlık .Linux için yazı formatlarını da araya noktalı virgül koyarak ekleyebilirsiniz.Formatlar:
0 Reset all attributes
1 Bright
2 Dim
4 Underscore
5 Blink
7 Reverse
8 Hidden
Örnek:
echo -e "\033[31;4m bu yazı kırmızı ve altıçizili"
Herhangi bir basit problem, hakkında yeterince toplantı yapılarak, çözümsüz hale getirilebilir.
https://play.google.com/store/apps/developer?id=ONGUN
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  HeidiSQL'in ilk Linux sürümü yayınlandı mesut61 0 690 03-06-2025, Saat: 09:02
Son Yorum: mesut61
  Linux Apache Module Base Url 3ddark 3 1.162 31-01-2025, Saat: 17:53
Son Yorum: engerex
  Linux Delphi 11.2 FMX Ubuntu 18.04 masaüstü uygulama ayarları emozgun 0 2.109 13-10-2022, Saat: 20:55
Son Yorum: emozgun
  Linux te Program çalıştırma barissagir 3 2.752 04-10-2021, Saat: 09:32
Son Yorum: RAD Coder
  Linux 20.04 LTD Apache Module Yukleme Hatası 3ddark 4 4.034 29-07-2020, Saat: 12:54
Son Yorum: 3ddark



Konuyu Okuyanlar: 1 Ziyaretçi