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
  dbgrid sutun toplamini alip lazreport da gostermek sadikacar60 6 185 02-12-2024, Saat: 12:21
Son Yorum: sadikacar60
  string icinde alt satirda goster koduyla beraber nasil gonderilir sadikacar60 4 295 09-09-2024, Saat: 08:42
Son Yorum: damert6
  Format sonrası alınan hata Altıner 7 425 13-08-2024, Saat: 18:11
Son Yorum: Altıner
  alpha l=blend forma png resmi normal gostermek sadikacar60 2 251 20-07-2024, Saat: 19:43
Son Yorum: sadikacar60
  DLL içerisinde FireDac Problemi tecnomaster 1 443 16-03-2024, Saat: 18:05
Son Yorum: delphi.developer



Konuyu Okuyanlar: 1 Ziyaretçi