Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Memo içerisinde 4 kolonlu tablo tipi string göstermek (String Format)
#1
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.

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

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.
Cevapla
#2
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') ) ;
Cevapla
#3
* 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
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#4
@ugorkem ve @mrmarman cevaplarıız için çok teşekkür ederim. İki metot da işimi gördü. İyi çalışmalar dilerim.
Cevapla
#5
@ugorkem ve @mrmarman her iki kullanımda gayet kullanışlı ve açıklayıcı olmuş. Teşekkürler.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  DLL içerisinde FireDac Problemi tecnomaster 1 183 16-03-2024, Saat: 18:05
Son Yorum: delphi.developer
Bug SQL e Bağlantıda Tablo Adını bir değişkene atamak barissagir 3 519 10-02-2024, Saat: 16:11
Son Yorum: barissagir
  JSon Format m_ekici 7 1.017 02-10-2023, Saat: 09:24
Son Yorum: yhackup
  FastReport detail tablo gösterim sorunu Frrst 12 1.946 14-07-2023, Saat: 17:10
Son Yorum: hi_selamlar
  Tablo Dinleme barissagir 2 618 11-07-2023, Saat: 12:36
Son Yorum: delphiman



Konuyu Okuyanlar: 1 Ziyaretçi