Delphi Can
Memo içerisinde 4 kolonlu tablo tipi string göstermek (String Format) - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: Memo içerisinde 4 kolonlu tablo tipi string göstermek (String Format) (/showthread.php?tid=5941)



Memo içerisinde 4 kolonlu tablo tipi string göstermek (String Format) - Syntax - 22-04-2021

Merhabalar,

Aram bu string format ve Regex tipi yapılarla pek iyi değil.

Memo içerisinde düzenli bir yapıda içerik göstermek istiyorum.


İsim       Soyisim       S.NO       Şehir
Aras       Yıldız          24565      İstanbul

Şeklinde bir çıktı elde etmek için çabalıyorum. Bunun için 2 kolonlu bir yapıya uygun olarak aşağıdaki kodu kullanıyorum.

Kod:
procedure Output(const AStr1, AStr2: string; AWidth: Integer);
begin
 Memo1.Lines.Add(Format('%-*.*s %s', [AWidth, AWidth, AStr1, AStr2]));
end;

6tdd2j.png

Bu bana düzgün şekilde 2 kolonlu bir tablo yapısı veriyor fakat ben bu kodu aşağıdaki şekilde modifiye ettiğimde

Kod:
procedure Output(const AStr1, AStr2, AStr3, AStr4: string; AWidth: Integer);
begin
 Memo1.Lines.Add(Format('%-*.*s %s %-*.*s %s', [AWidth, AWidth, AStr1, AStr2, AWidth, AWidth, AStr3, AStr4]));
end;

Kolon yapısı bozuluyor ve metin aralarında kaymalar oluyor.

8l4bx1.png

Format kodumda sorun var sanırım. Bu syntax mantığını öğrenebileceğim bir yer tavsiye ederseniz çok sevinirim. 

Not: İçerik gösterimi için Memo kullanımım zorunlu. Richedit kullanamıyorum malesef.

Teşekkürler.


Cvp: Memo içerisinde 4 kolonlu tablo tipi string göstermek (String Format) - ugorkem - 23-04-2021

biçimlendirmenizde hata yoksa karakter genişliği sabit olan aşağıdaki fontlardan birini memo nun font u olarak kullanınız.

Courier New,Droid Sans Mono ,Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,monospace,serif

isterseniz aşağıdaki fonksiyonu da kullanabilirsiniz.

function cwRightPad(Str: string; const CharCount: Integer = 15;  FillChar: Char=' '): string;
var
 l_restLength: Integer;
begin
 Result  := str;
 l_restLength := CharCount - Length(str);
 if (l_restLength < 1) then
   exit;

 Result := str + StringOfChar(FillChar, l_restLength) ;
end;

//kullanımı
memo1.Lines.Add( cwRightPad('metin1')+ cwRightPad('metin1')+cwRightPad('145')+cwRightPad('20') ) ;



Memo içerisinde 4 kolonlu tablo tipi string göstermek (String Format) - mrmarman - 23-04-2021

* Fantazi olsun diye yazayım, dinamik bir yaklaşım da buradan. - dinamik derken içerik uzunluğu kadar boşluk -

- Uzunuluklar için Type tanımına gerek yok, sadece Liste alanları kadar değişkeni bir defada gruplamak açısından kolay geldi o bakımdan.

Type tIsimListesi = Record
  Ad, Soyad, Sicil, Sehir : String;
End;

var
  FList : Array of tIsimListesi;

procedure AddList( const AAd, ASoyad, ASicil, ASehir: string );
begin
  if High(Flist) < 0 then SetLength( FList, 1 ) else SetLength( Flist, High(Flist) + 1 + 1 );
  With FList[ High(FList) ] do begin
    Ad    := AAd;
    Soyad := ASoyad;
    Sicil := ASicil;
    Sehir := ASehir;
  end;
end;

procedure MakeOutput( aList: TStrings );
  Type tIsimListesiUz = Record
    Ad, Soyad, Sicil, Sehir : Integer;
  End;
var
  LUz : tIsimListesiUz;
  i : Integer;
begin
  // Önce döngü ile en uzun boylu ifadelerin tespiti.
  LUz := default(tIsimListesiUz); // Reset
  for i := low( FList ) to high( Flist ) do begin
    if LUz.Ad    < Length(FList[i].Ad)     then LUz.Ad    := Length(FList[i].Ad);
    if LUz.Soyad < Length(FList[i].Soyad)  then LUz.Soyad := Length(FList[i].Soyad);
    if LUz.Sicil < Length(FList[i].Sicil)  then LUz.Sicil := Length(FList[i].Sicil);
    if LUz.Sehir < Length(FList[i].Sehir)  then LUz.Sehir := Length(FList[i].Sehir);
  end;

  // Sonra benzer döngü ile bu uzunlukları çıktıda kullanmak.
  for i := low( FList ) to high( Flist ) do begin
    aList.Add( Format(  ' %-'+IntToStr(LUz.Ad   )+'s'
                      + ' %-'+IntToStr(LUz.Soyad)+'s'
                      + ' %-'+IntToStr(LUz.Sicil)+'s'
                      + ' %-'+IntToStr(LUz.Sehir)+'s'
                      , [  FList[i].Ad, FList[i].Soyad, FList[i].Sicil, FList[i].Sehir ]
                      ) );
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Liste reset işlemi
  Finalize( FList );

  // Listelenecek içeriğin eklenmesi işlemi
    AddList( 'Aras', 'Tekin', '2365', 'İstanbul' );
    AddList( 'Mehmet', 'Yıldızoğlu', '8476', 'Edirne' );
    AddList( 'Tufan', 'Pekcan', '7590', 'Ankara' );
    //AddList( '00000000000', '111111111111', '2222222222', '33333333333333' );

  // İçeriğin çıktı işlemi
  MakeOutput( Memo1.Lines );
end;



dklgh3qylvxck16dqtf5.gif



Memo içerisinde 4 kolonlu tablo tipi string göstermek (String Format) - Syntax - 23-04-2021

@ugorkem ve @mrmarman cevaplarıız için çok teşekkür ederim. İki metot da işimi gördü. İyi çalışmalar dilerim.


Memo içerisinde 4 kolonlu tablo tipi string göstermek (String Format) - Bay_Y - 05-05-2023

@ugorkem ve @mrmarman her iki kullanımda gayet kullanışlı ve açıklayıcı olmuş. Teşekkürler.