numaralandirma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

numaralandirma

Mesaj gönderen sr1111 »

basit bir şey gibi geldi ama yapamadim. yardimci olursaniz sevinirim.
memo1. de asagidaki gibi yazim var . istedigim c4 olan satirlari yukaridan asagiya yerleri değişmeksizin c1,c2,c3,c4,c5 diye düzgün bir bicimde numaralanmasi.

124324324
c4
asdasda
sdfgdfgdf
c4
dgdgdfgfdg
dfgdfg
c4
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: numaralandirma

Mesaj gönderen mrmarman »

Merhaba...

Basit düşünerek; eğer metnin içerisindeki "c4" kodları tekil ise aşağıdaki şekilde bir çözüm işini görecektir. Tabi yazı içerisinde bu c4 türev halinde yer alıyorsa sorun olacaktır. O zaman c4'ün sağındaki ve/veya solundaki boşluk veya kontrol karakteri (LF enter/CR return vb.) kılavuz olacaktır.

Aşağıdaki procedure'de yapılan işlem,
1. "c4" görülen yere metnin içinde yer almayan bir karakter ile ( örneğimizde #254 ) değiştirerek sayaçlandırma.
2. #254 olan (yani bizim eklediğimiz karakterleri) "c" prefix ile değiştirmek.

1 nolu aşamada özel karakter kullanmazsak, bizim sayacımızdaki c4 ile ötüşecektir. Onun önüne geçmek için #254 ile yabancılaştırma yaptık. Muhtemelen takıldığınız nokta burada oldu.

Özetle basit bir "StringReplace" fonksiyonunu iki farklı parametrik haliyle kullandık...

Kod: Tümünü seç

Var
  Sayac : Integer;
begin
  Sayac := 0;
  while Pos( 'c4', Memo1.Text ) > 0 do
  begin
    Inc(Sayac);
    Memo1.Text := StringReplace( Memo1.Text, 'c4', #254+IntToStr(Sayac), [] );
  end;
  Memo1.Text := StringReplace( Memo1.Text, #254, Format('c', [sayac]), [rfReplaceAll] );
end;

Memo1.Text içeriği

Kod: Tümünü seç

124324324
c4
asdasda
sdfgdfgdf
c4
dgdgdfgfdg
dfgdfg
c4
dgdgdfgfdg
dfgdfg
c4
dgdgdfgfdg
dfgdfg
c4
Çıktısı

Kod: Tümünü seç

124324324
c1
asdasda
sdfgdfgdf
c2
dgdgdfgfdg
dfgdfg
c3
dgdgdfgfdg
dfgdfg
c4
dgdgdfgfdg
dfgdfg
c5
Başarılar.
Resim
Resim ....Resim
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: numaralandirma

Mesaj gönderen sr1111 »

cook tesekkur ederim.
Tam takıldıgım yer ve çözümü olmuş.

otomatik olarak c1 - c40 arasi değişken grup oluyor.
bunlari otomatik c1-c2 arasi c2-c3 ... .... arasini stringlere nasıl atayabilirim.
c30 olursa 30 stringe c50 olursa 50 stringe otomatik atamak istiyorum istedigim zaman bunlari s1,s2,s3,s4 diye kullanabileyim.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: numaralandirma

Mesaj gönderen mrmarman »

O zaman isim değişikliğine gerek yokmuş, fazladan olmuş aslında.
Normal bir String PARSE operasyonu yeterliymiş. Ayrılacak blok aralıkları sayaç almasa daha kolay olurdu.

Ama sizin için önceki hikayeyi birleştirip sunalım.

Kod: Tümünü seç

Var
  Sayac : Integer;
  Ara, Blok  : String;
  icerik: TStringList;
begin
  // Faz 1 // Blokları isimlendirmek.
  Sayac := 0;
  while Pos( 'c4', Memo1.Text ) > 0 do
  begin
    Inc(Sayac);
    Memo1.Text := StringReplace( Memo1.Text, 'c4', #254+IntToStr(Sayac), [] );
  end;
  Memo1.Text := StringReplace( Memo1.Text, #254, Format('c', [sayac]), [rfReplaceAll] );

  // Faz 2 // Her bir bloğu ayırmak.
  Blok   := Memo1.Text;
  icerik := TStringList.Create;
  Sayac := 1;
  Ara   := 'c'+IntToStr(Sayac);
  while Pos( Ara, Blok ) > 0 do
  begin
    // ilk "c4" öncesi veri varsa onu da almak.
    if Copy( Blok, 1, Pos( Ara, Blok )-1 ) <> '' then
      icerik.Add( Copy( Blok, 1, Pos( Ara, Blok )-1) );

    System.Delete( Blok, 1, Pos( Ara, Blok ) + Length(Ara)-1 );
    Inc(Sayac);
    Ara   := 'c'+IntToStr(Sayac);
    if Pos( Ara, Blok ) > 0 then
    begin
      icerik.Add( Copy( Blok, 1, Pos( Ara, Blok )-1) );
      System.Delete( Blok, 1, Pos( Ara, Blok ) -1 );
    end
    else icerik.Add( Blok );
  end;

  // Final Çıktı
  Memo1.Lines.Clear;
  for Sayac := 0 to icerik.Count - 1 do
  begin
    Memo1.Lines.Add( 'Değişken #'+IntToStr(Sayac+1) + ':' + icerik[Sayac] );
  end;

  icerik.free;
end;
Girdi :

Kod: Tümünü seç

öncesi text
c4
asdasda
sdfgdfgdf
c4
dgdgdfgfdg
dfgdfg
c4
dgdgdfgfdg
dfgdfg
c4
dgdgdfgfdg
dfgdfg
c4
313131231
c4
43546675765
Çıktısı ise şöyle:

Kod: Tümünü seç

Değişken #1:öncesi text

Değişken #2:
asdasda
sdfgdfgdf

Değişken #3:
dgdgdfgfdg
dfgdfg

Değişken #4:
dgdgdfgfdg
dfgdfg

Değişken #5:
dgdgdfgfdg
dfgdfg

Değişken #6:
313131231

Değişken #7:
43546675765
Bir de Faz 1 olmaksızın direkt bloklara ayırma hali şöyle olabilirdi.

Kod: Tümünü seç

Var
  Sayac : Integer;
  Ara, Blok  : String;
  icerik: TStringList;
begin
  // Aracısız Faz 2 // Her bir bloğu ayırmak.
  Blok   := Memo1.Text;
  icerik := TStringList.Create;
  Sayac := 1;
  Ara   := 'c4';
  while Pos( Ara, Blok ) > 0 do
  begin
    // ilk "c4" öncesi veri varsa onu da almak.
    if Copy( Blok, 1, Pos( Ara, Blok )-1 ) <> '' then
      icerik.Add( Copy( Blok, 1, Pos( Ara, Blok )-1) );

    System.Delete( Blok, 1, Pos( Ara, Blok ) + Length(Ara)-1 );
    Inc(Sayac);
    if Pos( Ara, Blok ) > 0 then
    begin
      icerik.Add( Copy( Blok, 1, Pos( Ara, Blok )-1) );
      System.Delete( Blok, 1, Pos( Ara, Blok ) -1 );
    end
    else icerik.Add( Blok );
  end;

  // Final Çıktı
  Memo1.Lines.Clear;
  for Sayac := 0 to icerik.Count - 1 do
  begin
    Memo1.Lines.Add( 'Değişken #'+IntToStr(Sayac+1) + ':' + icerik[Sayac] );
  end;

  icerik.Free;
end;
Başarılar.
Resim
Resim ....Resim
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: numaralandirma

Mesaj gönderen sr1111 »

hocam tesekkurler döktürmüssünüz.
her 2 işlemide kullaniyorum ihtiyacim var.
En son sr1111 tarafından 24 Eyl 2013 10:24 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: numaralandirma

Mesaj gönderen mrmarman »

Final Çıktı bloğunu yeniden inceleyin.

icerik[1], icerik[2] vb. kullanarak..

icerik isimli stringlist 'i global (form create kısmında ) tanımlanması yeterli. projenin dilediğiniz yerinde bu bilgiye ulaşmak mümkün olur.
Resim
Resim ....Resim
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: numaralandirma

Mesaj gönderen sr1111 »

hocam daha fazla uzatmamak icin yapmak istedigimi yazayim. daha iyi anlaşılacak.
diğerlerini ben yapabilirim ugrastirmayayim diye yazmadimdi. sizin yardimlarinizla
dosyami şöyle duzenledim. yapmak istedigim asagidaki dosyada


düzenlediğim memo1 de
c_1
w_1
1581 2846 1623 2886 0
1630 2858 1682 2888 0
1692 2852 1719 2904 0
1725 2846 1752 2883 0
1759 2863 1767 2905 0
w_2
1153 2855 1176 2885 0
w_3
1288 2837 1318 2883 0
1324 2838 1385 2902 0
w_4
1416 2855 1432 2872 0
1440 2858 1472 2886 0
1473 2838 1504 2883 0
c_2
....
..........
...............
c_3
yukaridaki gibi devam ediyor c_40...

yapmak istediğim hedef memo1 ciktisi şöyle olmasi lazim
c_1
1581 2846 1767 2905 0 //w_1 den elde edilen
1153 2855 1176 2885 0 //w_2 den elde edilen
1288 2837 1385 2902 0
1416 2855 1504 2886 0
c_2
...............
.......................
............................
c_3
..................
c_4
En son sr1111 tarafından 02 Eki 2013 01:55 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: numaralandirma

Mesaj gönderen mrmarman »

Merhaba.

Basit bir sıralı TUZAKLAMA mekanizması kurarak sonuca ulaşabilirsin.

Aşağıda şöyle bir işlem tapıldı.
1. İlk satırdan başlayarak 'c_' ile başlayan satıra rastlanırsa, bu satırı ürün listesine alması sağlandı.
2. 'w_' ile başlayan satır görüldüğünde ( espiri olsun diye onu bilgi değişkenine aldım 8) ) YAKALA isimli boolean değişkeni TRUE yaparak tetik mekanizmasını kurduk.
3. 'c_' veya 'w_' olmayan ilk sayı sırası gelindiğinde YAKALA değişkeni true olduğundan tetik ateşlendi ve bu satırı URUN listesine alarak TRUE olan değeri FALSE yaptık. Böylece takip eden rakam satırlarını dikkate almayıp pass geçmesi sağladık.
4. 1. adıma geri döndük. taa ki satırlar sona erene kadar.

Aşağıda procedure görüyorsun.

Kod: Tümünü seç

Var
  Sat    : Integer;
  Urun   : TStringList;
  Yakala : Boolean; // Tuzaklama Boolean Değişkeni. True olunca ilk satırı yakalar.
  Bilgi  : String;
begin
  Urun := TStringList.Create;

  Sat    := 0;
  Yakala := False;
  while Sat <  Memo1.Lines.Count - 1 do
  begin
    if  ( Trim( Memo1.Lines[Sat] ) <> '' ) // Satır boş değilse
    then
    begin
      if Trim(Memo1.Lines[Sat][1]) = 'c' then
      begin // c_?? satırındayız demektir.
        Urun.Add( Memo1.Lines[Sat] ); // bu başlık idi...
      end else
      if Trim(Memo1.Lines[Sat][1]) = 'w' then
      begin // w_?? satırındayız demektir.
        Bilgi  := ' // ' + Memo1.Lines[Sat] + '''den elde edilen  :) ';
        Yakala := True; // Tuzak Modu açık...
      end else begin
        if Yakala then
        begin
          Urun.Add( Memo1.Lines[Sat] + Bilgi );
          Yakala := False; // yakaladık, şimdi bir sonraki w_ başlığına kadar pass geçilecek...
        end;
      end;
    end;
    inc(Sat);
  end;
  Memo1.Text := Urun.Text;
  Urun.Free;
end;
Ürün tablosu şu şekilde.

Kod: Tümünü seç

c_1
1581 2846 1623 2886 0 // w_1'den elde edilen  :) 
1153 2855 1176 2885 0 // w_2'den elde edilen  :) 
1288 2837 1318 2883 0 // w_3'den elde edilen  :) 
1416 2855 1432 2872 0 // w_4'den elde edilen  :) 
c_2
Resim
Resim ....Resim
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: numaralandirma

Mesaj gönderen sr1111 »

w1 içinde
enküçük enküçük enbüyük enbüyük sabit //olmasi gerekenler
1581 2846 1767 2905 0 //bendeki cikti olmasi gereken
1581 2846 1623 2886 0 //sizdeki cikti
En son sr1111 tarafından 02 Eki 2013 01:57 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: numaralandirma

Mesaj gönderen mrmarman »

Şimdi anladım. Sonuç aşağıdaki şekilde yeniden değerlendirildi.
// Bir saniye yine yanlışlık oluyor.... ///

gruplar ayrı ayrı mı değerlendirilecek... 1,2 ardışık sayı olarak değerlendirilmeyip ayrı birer sütun mu olmalıydı ?
Bir sonraki mesajımı bekleyin.


Ürün Çıktısı Şu Şekile....

Kod: Tümünü seç

c_1
1581 2846-1767 2905 //  // w_1'den elde edilen  :) 
1153 2855-1176 2885 //  // w_2'den elde edilen  :) 
1288 2837-1385 2902 //  // w_3'den elde edilen  :) 
1416 2855-1504 2883 //  // w_4'den elde edilen  :) 
c_2
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: numaralandirma

Mesaj gönderen mrmarman »

Herhalde bu sefer doğru anlamışımdır.

Girdi değerler

Kod: Tümünü seç

c_1
w_1
1581 2846 1623 2886 0
1630 2858 1682 2888 0
1692 2852 1719 2904 0
1725 2846 1752 2883 0
1759 2863 1767 2905 0
w_2
1153 2855 1176 2885 0
w_3
1288 2837 1318 2883 0
1324 2838 1385 2902 0
w_4
1416 2855 1432 2872 0
1440 2858 1472 2886 0
1473 2838 1504 2883 0
c_2
....
..........
...............
c_3
Ürün Çıktısı

Kod: Tümünü seç

c_1
1581 2846 1767 2905 0 //  // w_1'den elde edilen  :) 
1153 2855 1176 2885 0 //  // w_2'den elde edilen  :) 
1288 2837 1385 2902 0 //  // w_3'den elde edilen  :) 
1416 2838 1504 2886 0 //  // w_4'den elde edilen  :) 
c_2

Procedure aşağıda...

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
  Function EnBuyukOlan( Liste: TStrings ): String;
  Var
    i, idxKucuk1, idxKucuk2, idxBuyuk3, idxBuyuk4  : Integer;
    ss1,ss2 : String;
    s1, s2, s3, s4  : Integer;
  begin
    idxKucuk1 := 0;
    for i := 1 to Liste.Count - 1 do
    begin
      // 1581 2846 1623 2886 0
      ss1 := Copy( Liste[idxKucuk1], 01, 4 );
      ss2 := Copy( Liste[i],         01, 4 );

      s1 := StrToInt( ss1 );
      s2 := StrToInt( ss2 );
      if s2 < s1 then idxKucuk1 := i;
    end;
    idxKucuk2 := 0;
    for i := 1 to Liste.Count - 1 do
    begin
      // 1581 2846 1623 2886 0
      ss1 := Copy( Liste[idxKucuk2], 06, 4 );
      ss2 := Copy( Liste[i],         06, 4 );

      s1 := StrToInt( ss1 );
      s2 := StrToInt( ss2 );
      if s2 < s1 then idxKucuk2 := i;
    end;
    idxBuyuk3 := 0;
    for i := 1 to Liste.Count - 1 do
    begin
      // 1581 2846 1623 2886 0
      ss1 := Copy( Liste[idxBuyuk3], 11, 4 );
      ss2 := Copy( Liste[i],         11, 4 );

      s1 := StrToInt( ss1 );
      s2 := StrToInt( ss2 );
      if s2 > s1 then idxBuyuk3 := i;
    end;
    idxBuyuk4 := 0;
    for i := 1 to Liste.Count - 1 do
    begin
      // 1581 2846 1623 2886 0
      ss1 := Copy( Liste[idxBuyuk4], 16, 4 );
      ss2 := Copy( Liste[i],         16, 4 );

      s1 := StrToInt( ss1 );
      s2 := StrToInt( ss2 );
      if s2 > s1 then idxBuyuk4 := i;
    end;
    Result := Format('%s %s %s %s 0', [
       Copy( Liste[idxKucuk1], 01, 4 )
      ,Copy( Liste[idxKucuk2], 06, 4 )
      ,Copy( Liste[idxBuyuk3], 11, 4 )
      ,Copy( Liste[idxBuyuk4], 16, 4 )]);
  end;
Var
  Sat    : Integer;
  Urun, AraSicak   : TStringList;
  Bilgi  : String;
begin
  Urun     := TStringList.Create;
  AraSicak := TStringList.Create;

  Sat    := 0;
  while Sat <  Memo1.Lines.Count - 1 do
  begin
    if  ( Trim( Memo1.Lines[Sat] ) <> '' ) // Satır boş değilse
    then
    begin
      if Trim(Memo1.Lines[Sat][1]) = 'c' then
      begin // c_?? satırındayız demektir.
        if AraSicak.Count > 0 then // 'c_' gelmişsek, blok sona erdi demektir.
        begin
          Urun.Add( EnBuyukOlan( AraSicak ) + ' // '+Bilgi );
          AraSicak.Clear;
        end;
        Urun.Add( Memo1.Lines[Sat] ); // Ürüne 'c_' başlığı eklemek için...
      end else

      if Trim(Memo1.Lines[Sat][1]) = 'w' then
      begin // w_?? satırındayız demektir.
        if AraSicak.Count > 0 then // 'w_' gelmişsek, blok sona erdi demektir.
        begin
          Urun.Add( EnBuyukOlan( AraSicak ) + ' // '+Bilgi );
          AraSicak.Clear;
        end;
        Bilgi  := ' // ' + Memo1.Lines[Sat] + '''den elde edilen  :) ';
      end else
      begin
        AraSicak.Add( Memo1.Lines[Sat] );
      end;
    end;
    inc(Sat);
  end;
  Memo1.Text := Urun.Text;
  Urun.Free;
  AraSicak.Free;
end;
Resim
Resim ....Resim
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: numaralandirma

Mesaj gönderen sr1111 »

Üstadım bu kadar emek verdiniz ne diyeyim. Allah razı olsun demekten başka.
Çok Güzel istedigim gibi calisiyor.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: numaralandirma

Mesaj gönderen mrmarman »

Memnun oldum.
Başarılar. :bravo:
Resim
Resim ....Resim
Cevapla