Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Yeni kayıt eklerken eski kayıdı silme
#1
Merhabalar.
Listviewde satır taşıma olayını  çözmeye çalışıyorum kayıdı istediğim yere taşıyabiliyorum. Eski kayıtı silmek istediğimde,
Taşıdığım satırı değilde bir önceki kayıt siliniyor. +1 ile test yaptığımda ise bu sefer başka kayıtlar siliniyor. 
Bu durumu nasıl çözerim?

for I := Listview1.Items.Count - 1 downto 0 do
        begin
          if Listview1.Items[I].Data['Marka'].ToString = 'Tofaş' then
          begin
            IYeni := Idxn; // Yeni index
            IOnce := Listview1.Items[I].Index; // Eski index

            Test := Listview1.Items[IOnce].Data['Marka'].ToString;

            Listview1.BeginUpdate;
            Listview1.Items.Insert(IYeni);
            Listview1.Items[IYeni].Data['Fiyat'] := Test;
            Listview1.Items.Delete(IOnce);
            Listview1.EndUpdate;
Cevapla
#2
insert ettiğinizde for döngüsü taça çıkıyor.

Hefefiniz index bulduğunuzda önce döngüden çıkmak ardından insert ve delete işleminyapmak olsun.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#3
(07-08-2018, Saat: 09:58)mrmarman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.insert ettiğinizde for döngüsü taça çıkıyor.

Hefefiniz index bulduğunuzda önce döngüden çıkmak ardından insert ve delete işleminyapmak olsun.
Sayın mrmarman;

exit ile döngüden çıkınca bu sefer delete gerçekleşmiyor. 
Döngüden çıkarsam birden fazla kayıt seçildiğinde bu seferde kayıtları taşınmaz. Huh

  
           Listview1.BeginUpdate;
            Listview1.Items.Insert(IYeni);
            Listview1.Items[IYeni].Data['Fiyat'] := Test;
        Exit; 
            Listview1.Items.Delete(IOnce);
            Listview1.EndUpdate;
Cevapla
#4
Şimdi daha bir netleşti.
For döngüsü yerine while do veya repeat until tercih edin. Sayaçlar sizin kontrolünüzde olsun.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#5
(07-08-2018, Saat: 10:16)ahmetb Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(07-08-2018, Saat: 09:58)mrmarman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.insert ettiğinizde for döngüsü taça çıkıyor.

Hefefiniz index bulduğunuzda önce döngüden çıkmak ardından insert ve delete işleminyapmak olsun.
Sayın mrmarman;

exit ile döngüden çıkınca bu sefer delete gerçekleşmiyor. 
Döngüden çıkarsam birden fazla kayıt seçildiğinde bu seferde kayıtları taşınmaz. Huh

  
           Listview1.BeginUpdate;
            Listview1.Items.Insert(IYeni);
            Listview1.Items[IYeni].Data['Fiyat'] := Test;
        Exit; 
            Listview1.Items.Delete(IOnce);
            Listview1.EndUpdate;

for dongusunden cıkmak için break komutunu kullanabilirsiniz. bu sekilde for dongusunun dısındaki komutlarda işlemiş olur
Cevapla
#6
(07-08-2018, Saat: 12:47)s_salci Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(07-08-2018, Saat: 10:16)ahmetb Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Sayın mrmarman;

exit ile döngüden çıkınca bu sefer delete gerçekleşmiyor. 
Döngüden çıkarsam birden fazla kayıt seçildiğinde bu seferde kayıtları taşınmaz. Huh

  
           Listview1.BeginUpdate;
            Listview1.Items.Insert(IYeni);
            Listview1.Items[IYeni].Data['Fiyat'] := Test;
        Exit; 
            Listview1.Items.Delete(IOnce);
            Listview1.EndUpdate;

for dongusunden cıkmak için break komutunu kullanabilirsiniz. bu sekilde for dongusunun dısındaki komutlarda işlemiş olur

exit ile döngüden çıkınca bu sefer delete gerçekleşmiyor.
Döngüden çıkarsam birden fazla kayıt seçildiğinde bu seferde kayıtları taşınmaz.
Cevapla
#7
(07-08-2018, Saat: 15:11)ahmetb Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(07-08-2018, Saat: 12:47)s_salci Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.for dongusunden cıkmak için break komutunu kullanabilirsiniz. bu sekilde for dongusunun dısındaki komutlarda işlemiş olur

exit ile döngüden çıkınca bu sefer delete gerçekleşmiyor.
Döngüden çıkarsam birden fazla kayıt seçildiğinde bu seferde kayıtları taşınmaz.

Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.'i kullandığınızda metoddan (prosedür veya fonksiyondan) çıkıyorsunuz, döngüden değil... Sadece döngüden çıkacaksanız "Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız." komutunu kullanmalısınız...
P.Safa:Yaşlanarak değil, yaşayarak tecrübe kazanılır.Zaman insanları değil,armutları olgunlaştırır
C.Yücel:Toprak gibi olmalısın! Ezildikçe sertleşmelisin!Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı
S.Canan:Bildiğini zannettiğin an hiç bir şey öğrenemezsin
Bilgi uçar
WWW
Cevapla
#8
Cevaplar için teşekkür ederim;

Fakat sorun for döngüsünden çıkıp çıkmama durumundan değil. Insert işleminden sonra silinmesini istediğim itemlerin indexleri (sıra no) değiştiği için delete işlemi saçmalıyor. Bunu nasıl çözebilirim?
Cevapla
#9
Evet haklısınız. İşte bu yüzden @mrmarman size silme işlemini döngü dışında yapın diyor.

Şöyle düşünün;
Silmek istediğiniz Item'ın indeksi = IOnce.
Ama siz öncesinde yeni bir Item daha eklediniz.
Dolayısıyla sizin silmek istediğiniz Item'ın index'i değişti.
Fakat siz hala indeksi IOnce olan Item'ı siliyorsunuz.



Silmek istediğiniz Item'ın indeksini değil de kendisini bir değişkende saklarsanız, daha sonra silmek istediğinizde bu sakladığınız değişkenin indeksine göre silme yapabilirsiniz:
var
  silenecek: TListItem;
...

  silinecek := Listview1.Items[I].Index;
...
...
...
  ListView1.Items.Delete(silinecek.Index);
There's no place like 127.0.0.1
WWW
Cevapla
#10
(07-08-2018, Saat: 18:06)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Evet haklısınız. İşte bu yüzden @mrmarman size silme işlemini döngü dışında yapın diyor.

Şöyle düşünün;
Silmek istediğiniz Item'ın indeksi = IOnce.
Ama siz öncesinde yeni bir Item daha eklediniz.
Dolayısıyla sizin silmek istediğiniz Item'ın index'i değişti.
Fakat siz hala indeksi IOnce olan Item'ı siliyorsunuz.



Silmek istediğiniz Item'ın indeksini değil de kendisini bir değişkende saklarsanız, daha sonra silmek istediğinizde bu sakladığınız değişkenin indeksine göre silme yapabilirsiniz:
var
  silenecek: TListItem;
...

  silinecek := Listview1.Items[I].Index;
...
...
...
  ListView1.Items.Delete(silinecek.Index);

Detaylı bilgi için teşekkür ederim.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Her yeni sürümde artan apk boyutu ? Mr.Developer 0 136 20-08-2019, Saat: 09:56
Son Yorum: Mr.Developer
  Mysql db'ye kayıt listviewde otomatik görme ahmetb 6 373 26-07-2019, Saat: 15:53
Son Yorum: ahmetb
  Çıkarttığım oyun için yeni fikirlerinizi bekliyorum QepnS 12 1.033 06-05-2019, Saat: 19:47
Son Yorum: engerex
  Insert ve Silme yakalama ahmetb 4 474 18-04-2019, Saat: 16:29
Son Yorum: wiseman
  Yeni Kullanıcı ilk IOS uygulama destek talebi chngrzdmr 4 793 18-02-2019, Saat: 18:52
Son Yorum: SimaWB



Konuyu Okuyanlar: 1 Ziyaretçi