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;
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...
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
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...
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.
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;
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...
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.
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...
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...