numaralandirma
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
numaralandirma
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
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
Re: numaralandirma
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...
Memo1.Text içeriği
Çıktısı
Başarılar.
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;
Kod: Tümünü seç
124324324
c4
asdasda
sdfgdfgdf
c4
dgdgdfgfdg
dfgdfg
c4
dgdgdfgfdg
dfgdfg
c4
dgdgdfgfdg
dfgdfg
c4
Kod: Tümünü seç
124324324
c1
asdasda
sdfgdfgdf
c2
dgdgdfgfdg
dfgdfg
c3
dgdgdfgfdg
dfgdfg
c4
dgdgdfgfdg
dfgdfg
c5
Re: numaralandirma
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.
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.
Re: numaralandirma
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.
Girdi :
Çıktısı ise şöyle:
Bir de Faz 1 olmaksızın direkt bloklara ayırma hali şöyle olabilirdi.
Başarılar.
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;
Kod: Tümünü seç
öncesi text
c4
asdasda
sdfgdfgdf
c4
dgdgdfgfdg
dfgdfg
c4
dgdgdfgfdg
dfgdfg
c4
dgdgdfgfdg
dfgdfg
c4
313131231
c4
43546675765
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
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;
Re: numaralandirma
hocam tesekkurler döktürmüssünüz.
her 2 işlemide kullaniyorum ihtiyacim var.
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.
Re: numaralandirma
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.
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.
Re: numaralandirma
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
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.
Re: numaralandirma
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
) 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.
Ürün tablosu şu şekilde.
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

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;
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
Re: numaralandirma
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
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.
Re: numaralandirma
Ş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....
// 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
Re: numaralandirma
Herhalde bu sefer doğru anlamışımdır.
Girdi değerler
Ürün Çıktısı
Procedure aşağıda...
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
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;
Re: numaralandirma
Üstadım bu kadar emek verdiniz ne diyeyim. Allah razı olsun demekten başka.
Çok Güzel istedigim gibi calisiyor.
Çok Güzel istedigim gibi calisiyor.