procedure TForm1.Button2Click(Sender: TObject);
var
LI: TListItem;
I: Integer;
begin
with ListView1 do
begin
for i := 1 to Items.Count - 1 do
begin
if (Pos('Sumak', Items[i].SubItems[1]) > 0) then
begin
LI := ListView1.Items.Add;
LI.SubItems.Add('Sumak');
end;
end;
end;
end;
procedure YoksaEkle( strAra: String; ListView:tListView );
var
LI: TListItem;
I : Integer;
boolBulundu : Boolean;
begin
with ListView do
begin
if Items.Count > 0 then
begin
boolBulundu := False;
for i := 0 to Items.Count - 1 do
if Pos(strAra, Items[i].SubItems[0]) > 0
then boolBulundu := True;
if NOT boolBulundu then
begin
LI := ListView.Items.Add;
LI.SubItems.Add(strAra);
end;
end;
end;
end;
Kendi kodunu nereye nasıl eklediğini, ListView'inde daha önce herhangi bir Item ekli ama subitem sayısı aradığından az olup olmadığını vs. vs. bilemeyeceğim sürece ki (doğru mu ekledin yanlış mı yaptın bunu dahi bilemeyeceğime göre?!) ısrara gerek yok.
procedure YoksaEkle( strAra: String; ListView:tListView );
var
LI: TListItem;
I : Integer;
boolBulundu : Boolean;
begin
with ListView do
begin
if Items.Count > 0 then
begin
boolBulundu := False;
for i := 0 to Items.Count - 1 do
if Pos(strAra, Items[i].SubItems[0]) > 0
then boolBulundu := True;
if NOT boolBulundu then
begin
LI := ListView.Items.Add;
LI.SubItems.Add(strAra);
end;
end;
end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
YoksaEkle( 'Sumak', ListView1 );
end;
boolBulundu değişkenini true olarak setledikten sonra Break ile döngüden çıkmayı gözden kaçırmışsınız muharrem bey. Bulunan item son item değil ise bu durumda sorunla karşılaşılır sizin de görebileceğiniz gibi.
Ayrıca; soruyu soran arkadaşa bir kelam: item aramak ayrı bir şeydir eklemek ayrı bir şeydir. Kullandığınız componentleri biraz tanıyıp, mantığınıza müracaat ederseniz sorunlarınızı çok daha hızlıca aşabilirsiniz.
thelvaci yazdı: boolBulundu değişkenini true olarak setledikten sonra Break ile döngüden çıkmayı gözden kaçırmışsınız muharrem bey. Bulunan item son item değil ise bu durumda sorunla karşılaşılır sizin de görebileceğiniz gibi.
Sorun neden yaratsın anlamadım.Buradaki asıl konu en az bir bulunan varsa ekleme yapmasındır. Zaten FOR limitli bir döngü ve ITEM sayısı kadar döngü var. Neden bulamayınca bir fazla dönsün ki ?! Oldukça güvenli sadece bulursa gereksiz yere fazladan sona kadar gidiyor olacak o kadar
Hocam öylesine hızlıca yazdım, geç oldu herkesin uykusu gelmiştir diye.. Yoksa ben while döngüsü kullanır şart uyduğunda çıkmasına izin veririm. Break olayına dahi karşıyım. İç içe döngülerde ayağıma dolaşıyor çünkü. Hangisinden çıktı çıkmadı trace etmek güçleşiyor kod okunurluğunu bozuyor benim nazarımda.
procedure YoksaEkle( strAra: String; ListView:tListView );
var
I : Integer;
boolBulundu : Boolean;
begin
with ListView do
begin
if Items.Count > 0 then
begin
boolBulundu := False;
i := 0;
while (i < Items.Count) AND (NOT boolBulundu) do
begin
if Pos(strAra, Items[i].SubItems[0]) > 0
then boolBulundu := True;
inc(i);
end;
if NOT boolBulundu then
With ListView.Items.Add do
begin
Caption := '';
SubItems.Add(strAra);
end;
end;
end;
end;
thelvaci yazdı: boolBulundu değişkenini true olarak setledikten sonra Break ile döngüden çıkmayı gözden kaçırmışsınız muharrem bey. Bulunan item son item değil ise bu durumda sorunla karşılaşılır sizin de görebileceğiniz gibi.
Sorun neden yaratsın anlamadım. Buradaki asıl konu en az bir bulunan varsa ekleme yapmasındır.
Hocam öylesine hızlıca yazdım, geç oldu herkesin uykusu gelmiştir diye.. Yoksa ben while döngüsü kullanır şart uyduğunda çıkmasına izin veririm. Break olayına dahi karşıyım. İç içe döngülerde ayağıma dolaşıyor çünkü. Hangisinden çıktı çıkmadı trace etmek güçleşiyor kod okunurluğunu bozuyor benim nazarımda.
procedure YoksaEkle( strAra: String; ListView:tListView );
var
I : Integer;
boolBulundu : Boolean;
begin
with ListView do
begin
if Items.Count > 0 then
begin
boolBulundu := False;
i := 0;
while (i < Items.Count) AND (NOT boolBulundu) do
begin
if Pos(strAra, Items[i].SubItems[0]) > 0
then boolBulundu := True;
inc(i);
end;
if NOT boolBulundu then
With ListView.Items.Add do
begin
Caption := '';
SubItems.Add(strAra);
end;
end;
end;
end;
Sizi eleştirmek değildi niyetim gözden kaçırdığınızı düşündüğüm içindi. Malum burada paylaştığınız kodları alıp hiçbir değişiklik yapmadan kullanan bir çok kardeşimiz var. Ayrıca "bakmak ile görmek arasında fark var" gerçeğini de yaşamış oldum. Kodunuza bakıp kodu şöyle görüyordum:
Genelde bu tarz kullandığım için sanırım. Kusura bakmayın, bir önceki mesajımda yazdığım gibi kodunuz bir sorun vermez. Sadece yok yere döngü israfı yapar o kadar.
Uykusuzluk detayı buna ilişkindi... Döngü israfına değindim evet öyle olur. Eleştirecek yerde eleştirin hocam savunacak birşey varsa savunuruz da. Haklı olduğunuzda da başım üzerine...
Ben de kendimce ısrarla göremediğim nedir diye bakınıyordum. Sorun kalmadı...
if Not boolBulundu then
With ListView.Items.Add do
begin
Caption := IntToStr(Items.Count);
SubItems.Add('');
SubItems.Add(strAra);
SubItems.Add('');
SubItems.Add('');
SubItems.Add('');
SubItems.Add('');
end;
end;
end;
mrmarman yazdı:Kendi kodunu nereye nasıl eklediğini, ListView'inde daha önce herhangi bir Item ekli ama subitem sayısı aradığından az olup olmadığını vs. vs. bilemeyeceğim sürece ki (doğru mu ekledin yanlış mı yaptın bunu dahi bilemeyeceğime göre?!) ısrara gerek yok.
Başarılar.
Kod paylaşımı yapsaydın bunun cevabını önceden alırdın değil mi kardeşim...
Bir kaç satır öncesini yazsana, orada SubItems[5] dediğinei adım kadar eminim...