Listview belirtilen adet kadar kopyalama

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 belirtilen adet kadar kopyalama

Mesaj gönderen Serhat »

Selam.

Listview de kopyalama işlemi yapıyorum fakat edit içine girilen sayı kadar kopyalamayı entegre edemedim...

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  SelArray: array of Integer;
begin
  try
    with ListView1 do
    begin
      for i := 0 to Items.Count - 1 do
        if Items[i].Checked then
        begin
          SetLength(SelArray, length(SelArray) + 1);
          SelArray[High(SelArray)] := i; // Seçili satır indexsini alınıyor
          Items[i].Checked := True;
        end;

      for i := High(SelArray) downto 0 do // Seçili satır altına kopyala
        for i := 0 to StrToIntDef(Edit1.Text, -1) do

        begin
          Items.Insert(SelArray[i] + 1).Assign(Items[SelArray[i]]);
          Items[SelArray[i] + 1].Checked := False;
          Items[SelArray[i] + 1].SubItems[8] := '';
          KSayisi := KSayisi + 1;
        end;
    end;
  except
  end;
end;
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Listview belirtilen adet kadar kopyalama

Mesaj gönderen xozcanx »

Kodlarını aşağıdaki bloğa alabilirsin

Kod: Tümünü seç

var
  s:integer;
Begin
 For s:=0 to StrToint(Edit1.text) do
  Begin

  End;
End;
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Listview belirtilen adet kadar kopyalama

Mesaj gönderen ikra »

degisken bir string'i integer'e cevirmek istiyorsan StrToInt yerine StrToIntDef kullanman daha iyi bir secim olur.
Aksi taktirde Edit1 nesnesine herhangi bir harf girildiginde girilen harf rakama cevirilemeyeceginden hata verecektir.
Def eklentisi ile Edit1.Text rakama cevrilemediginde "0" degerini alacak ve for döngüsüne girmeyecektir.
Kullanimi asagidaki gibidir...

Kod: Tümünü seç

for I := 0 to StrToIntDef(Edit1.Text,0) do
kıdemsiz üye
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Listview belirtilen adet kadar kopyalama

Mesaj gönderen thelvaci »

Serhat yazdı:Selam.

Listview de kopyalama işlemi yapıyorum fakat edit içine girilen sayı kadar kopyalamayı entegre edemedim...

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  SelArray: array of Integer;
begin
  try
    with ListView1 do
    begin
      for i := 0 to Items.Count - 1 do
        if Items[i].Checked then
        begin
          SetLength(SelArray, length(SelArray) + 1);
          SelArray[High(SelArray)] := i; // Seçili satır indexsini alınıyor
          Items[i].Checked := True;
        end;

      for i := High(SelArray) downto 0 do // Seçili satır altına kopyala
        for i := 0 to StrToIntDef(Edit1.Text, -1) do

        begin
          Items.Insert(SelArray[i] + 1).Assign(Items[SelArray[i]]);
          Items[SelArray[i] + 1].Checked := False;
          Items[SelArray[i] + 1].SubItems[8] := '';
          KSayisi := KSayisi + 1;
        end;
    end;
  except
  end;
end;

Yukarıdaki kodunuza istinaden, sakın i değişkeninizi Cardinal yapmayın ;)
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Listview belirtilen adet kadar kopyalama

Mesaj gönderen xozcanx »

ikra yazdı:degisken bir string'i integer'e cevirmek istiyorsan StrToInt yerine StrToIntDef kullanman daha iyi bir secim olur.
Aksi taktirde Edit1 nesnesine herhangi bir harf girildiginde girilen harf rakama cevirilemeyeceginden hata verecektir.
Def eklentisi ile Edit1.Text rakama cevrilemediginde "0" degerini alacak ve for döngüsüne girmeyecektir.
Kullanimi asagidaki gibidir...

Kod: Tümünü seç

for I := 0 to StrToIntDef(Edit1.Text,0) do
Hocam verdiğiniz değerli bilgi ve açıklamanız için teşekkürler.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Kullanıcı avatarı
Serhat
Üye
Mesajlar: 203
Kayıt: 27 Tem 2014 11:10

Re: Listview belirtilen adet kadar kopyalama

Mesaj gönderen Serhat »

Hocam çoklu kopyalama yapabilmem için bu kodda değişikliği nasıl yapacağım???

Kod: Tümünü seç

for i := High(SelArray) downto 0 do // Seçili satır altına kopyala
Burada değişiklik yaparsam örnek: edite 5 sayısı girildiğinde sadece listviewde ilk 5 satır kontrol edilir ve çoklu kopyalama yapmaz yapmıyor da

Kod: Tümünü seç

for I := 0 to StrToIntDef(Edit1.Text,0) do
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Listview belirtilen adet kadar kopyalama

Mesaj gönderen ikra »

Serhat yazdı:Selam.

Listview de kopyalama işlemi yapıyorum fakat edit içine girilen sayı kadar kopyalamayı entegre edemedim...

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  SelArray: array of Integer;
begin
  try
    with ListView1 do
    begin
      for i := 0 to Items.Count - 1 do
        if Items[i].Checked then
        begin
          SetLength(SelArray, length(SelArray) + 1); // if checked sartina göre array sayisini yükseltmissin
          SelArray[High(SelArray)] := i; // secili satirin index'ini almissin
          Items[i].Checked := True; // zaten secili mi diye kontrol ettigin satiri neden tekrar true olarak isaretledin?
        end;

      for i := High(SelArray) downto 0 do // ilk for döngüsünde kullandigin i degiskenini
        for i := 0 to StrToIntDef(Edit1.Text, -1) do // ikinci döngüde tekrar kullanmissin. Bu yanlis. Üstelik yukarida I degiskeni tanimlanmamis.

        begin
          Items.Insert(SelArray[i] + 1).Assign(Items[SelArray[i]]); // Yeni bir Item insert ettikten sonra, 
                                                                                            // eklemis oldugun itemin indexi ile SelArray[I]'in indexi birbirine esit. 
                                                                                            // yani kendi icerisindeki veriyi kendine kopyaliyor. haliyle bos veri kopyalamis oluyor.
                                                                                            // insert yerine ADD fonksyonunu kullanirsan sorun ortadan kalkacaktir.
          Items[SelArray[i] + 1].Checked := False;
          Items[SelArray[i] + 1].SubItems[8] := '';
          KSayisi := KSayisi + 1;
        end;
    end;
  except
  end;
end;
asagida kod'un düzenlenmis hali var.
Delphi olmadigi icin kontrol edemiyorum ama calismasi lazim.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  SelArray: array of Integer;
  I: Integer;
begin
  try
    with ListView1 do
    begin
      for i := 0 to Items.Count - 1 do
        if Items[i].Checked then
        begin
          SetLength(SelArray, length(SelArray) + 1); 
          SelArray[High(SelArray)] := i; 
        end;
        
      if StrToIntDef(Edit1.Text,0) > Length(SelArray) then
      begin
         ShowMessage('Edit1 icerisine girilen sayi isaretli satirlarin toplam sayisindan fazla olamaz');
         exit;
      end;
      
        for I := 0 to Pred(StrToIntDef(Edit1.Text, 0)) do
        begin
          Items.Add.Assign(Items[SelArray[i]]);                                                                                   
          Items[Count -1].Checked := False;
          Items[Count -1].SubItems[8] := ''; // SubItems[8] zaten bos ise ve kasitli olarak bosaltilmiyorsa bu satirin varligi gereksiz.
          KSayisi := KSayisi + 1;
        end;
    end;
  except
  	raise Exception.Create('Bu iste bir yalnizlik var');
  end;
end;
kıdemsiz üye
Kullanıcı avatarı
hido
Üye
Mesajlar: 268
Kayıt: 29 Mar 2014 04:32

Re: Listview belirtilen adet kadar kopyalama

Mesaj gönderen hido »

:bravo: Hocam yaznız iki noktayı gözden kaçımışsınız...

1. Kullanıcı 7. satırdan satırdan 3 adet kopyalama yapmak istediğinde yapamıyor (Edit1 icerisine girilen sayi isaretli...) buraya takılıyor...
2. Bir kaç tane satırı seçip bu satırlarda 5 tane kopyalama yapmak istediğinde ilk secil olan satır sadece kopyalanıyor...


Not: Amacım eleştirmek değil, nacizane fikrimi yazdım sevgi va saygılarımla...
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Listview belirtilen adet kadar kopyalama

Mesaj gönderen ikra »

Estagfirullah.
Fare ile isaretlenmis alanlarin sifirinci indexinden edit icerisindeki rakam kadarini listenin kendisine ekler. Edit'e girilen deger secilen satirlarin toplamindan fazla ise, kopyalanacak veri hafizadaki veriden fazla oldugu icin hata mesaji ile kullaniciyi uyarir.
Ben hata göremedim.
Fakat istenilen indexden itibaren kopyalanmasi yada kopyalanan verinin verilen deger kadar kopyasi arzu ediliyorsa ikinci bir edit entegre edilip ufak bir degisiklik ile halledilebilinir.
Selâm ve Dua ile.
kıdemsiz üye
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Listview belirtilen adet kadar kopyalama

Mesaj gönderen brs »

Basit bir kopyalama yöntemi de benden olsun, ufak bir uyarı maksimum Checked ile seçilmiş olan 2 taneyi kopyalama sorunsuz yapıyor daha fazla olursa bazı kopyalamayı yapmıyor...

Kod: Tümünü seç

var
  I, J, KSay: Integer;
begin
  try
    KSay := 0;
    with ListView1 do
    begin
      if Items.Count > 0 then
      begin
        for I := 0 to Items.Count - 1 do
        begin
          if Items[I].Checked then
          begin
            for J := 0 to (StrToInt(KAdet) - 1) do
            begin
              Items[I].Checked := False;
              Items.Insert(I).Assign(Items[I]);
            end;
          end;
        end;
      end;
    end;
  except
  end;
end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Cevapla