Delphi Can

Orjinalini görmek için tıklayınız: Yeni kayıt eklerken eski kayıdı silme
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
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;
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.
(07-08-2018, Saat: 09:58)mrmarman Adlı Kullanıcıdan Alıntı: [ -> ]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;
Şimdi daha bir netleşti.
For döngüsü yerine while do veya repeat until tercih edin. Sayaçlar sizin kontrolünüzde olsun.
(07-08-2018, Saat: 10:16)ahmetb Adlı Kullanıcıdan Alıntı: [ -> ]
(07-08-2018, Saat: 09:58)mrmarman Adlı Kullanıcıdan Alıntı: [ -> ]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
(07-08-2018, Saat: 12:47)s_salci Adlı Kullanıcıdan Alıntı: [ -> ]
(07-08-2018, Saat: 10:16)ahmetb Adlı Kullanıcıdan Alıntı: [ -> ]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.
(07-08-2018, Saat: 15:11)ahmetb Adlı Kullanıcıdan Alıntı: [ -> ]
(07-08-2018, Saat: 12:47)s_salci Adlı Kullanıcıdan Alıntı: [ -> ]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.

EXIT'i kullandığınızda metoddan (prosedür veya fonksiyondan) çıkıyorsunuz, döngüden değil... Sadece döngüden çıkacaksanız "BREAK" komutunu kullanmalısınız...
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?
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);
(07-08-2018, Saat: 18:06)SimaWB Adlı Kullanıcıdan Alıntı: [ -> ]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.