ListView içinde yok ise son kayıt olarak ekleme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Serhat
Üye
Mesajlar: 203
Kayıt: 27 Tem 2014 11:10

ListView içinde yok ise son kayıt olarak ekleme

Mesaj gönderen Serhat »

Selamlar...

ListView içinde aranan kelime yok ise en sona nasıl ekleye bilirim...

Kod: Tümünü seç

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;
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: ListView içinde yok ise son kayıt olarak ekleme

Mesaj gönderen mrmarman »

Şöyle bir kurgu hazırladım senin için.

Kod: Tümünü seç

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;
Kullanımı :

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  YoksaEkle( 'Sumak', ListView1 );
end;
Resim
Resim ....Resim
Kullanıcı avatarı
Serhat
Üye
Mesajlar: 203
Kayıt: 27 Tem 2014 11:10

Re: ListView içinde yok ise son kayıt olarak ekleme

Mesaj gönderen Serhat »

Hocam, Hatası verdi: with message 'List index out of bounds (5)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: ListView içinde yok ise son kayıt olarak ekleme

Mesaj gönderen mrmarman »

Hocam bendeki kodda index olarak (5)'de aranan bir şey yok, kendin nasıl bir kod yazdın onu buraya bir yazıver bakalım yine.
Resim
Resim ....Resim
Kullanıcı avatarı
Serhat
Üye
Mesajlar: 203
Kayıt: 27 Tem 2014 11:10

Re: ListView içinde yok ise son kayıt olarak ekleme

Mesaj gönderen Serhat »

Yukarıdaki paylaştığım kod ve sizin yazmış olduğunuz kod ile listview de arama yaptırıyorum, farklı bir yok hocam :(
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: ListView içinde yok ise son kayıt olarak ekleme

Mesaj gönderen mrmarman »

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.
Resim
Resim ....Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: ListView içinde yok ise son kayıt olarak ekleme

Mesaj gönderen thelvaci »

mrmarman yazdı:Şöyle bir kurgu hazırladım senin için.

Kod: Tümünü seç

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;
Kullanımı :

Kod: Tümünü seç

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.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: ListView içinde yok ise son kayıt olarak ekleme

Mesaj gönderen mrmarman »

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.

Aşağıdaki şekil benim için uygundur...

Kod: Tümünü seç

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;
Resim
Resim ....Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: ListView içinde yok ise son kayıt olarak ekleme

Mesaj gönderen thelvaci »

mrmarman yazdı:
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.

Aşağıdaki şekil benim için uygundur...

Kod: Tümünü seç

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:

Kod: Tümünü seç

  boolBulundu := Pos(strAra, Items[i].SubItems[0]) > 0;
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.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: ListView içinde yok ise son kayıt olarak ekleme

Mesaj gönderen mrmarman »

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... :wink:
Ben de kendimce ısrarla göremediğim nedir diye bakınıyordum. Sorun kalmadı... :lol:
Resim
Resim ....Resim
Kullanıcı avatarı
Serhat
Üye
Mesajlar: 203
Kayıt: 27 Tem 2014 11:10

Re: ListView içinde yok ise son kayıt olarak ekleme

Mesaj gönderen Serhat »

mrmarman yazdı:Hocam bendeki kodda index olarak (5)'de aranan bir şey yok, kendin nasıl bir kod yazdın onu buraya bir yazıver bakalım yine.

Hocam size bahsettiğim "with message 'List index out of bounds (5)" garip ama çözümü aşağıda :lol:

Hata veren kod

Kod: Tümünü seç

    if Not boolBulundu then
      With ListView.Items.Add do
      begin
        Caption := IntToStr(Items.Count);
        SubItems.Add('');
        SubItems.Add(strAra);
      end;
  end;
end;

Calışan kod

Kod: Tümünü seç

    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;
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: ListView içinde yok ise son kayıt olarak ekleme

Mesaj gönderen mrmarman »

Ben ne demiştim ?!
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... :wink:
Bir kaç satır öncesini yazsana, orada SubItems[5] dediğinei adım kadar eminim...
Resim
Resim ....Resim
Cevapla