Çalışma anında component silme

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
Asri
Kıdemli Üye
Mesajlar: 767
Kayıt: 16 Eyl 2003 09:54
Konum: istanbul

Çalışma anında component silme

Mesaj gönderen Asri »

tasarım anında yada parogram çalışırken oluşturulan componetleri silmek için aşağıdaki cilcomponent function'nunu kullanabilirsiniz.

aşağıda ayrıca program çalışırken image nesnesi oluşturma örneği de verilmiştir

Kod: Tümünü seç

 var
  img1:Timage;

Kod: Tümünü seç

function tform1.silComponent(AParent: TComponent; Name: string): TComponent;
var
   n: integer;
begin
  Result:=nil;
  if AParent.ComponentCount=0 then Exit;
  for n:=0 to AParent.ComponentCount-1 do
  begin
    if AParent.Components[n].Name=name then img1.free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   silComponent(Self,'image3');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  img1:=TImage.Create(form1);  
  img1.Parent :=form1;
  img1.Name:='image3';
  img1.Parent:=form1;
  img1.Height:=50;
  img1.Width:=50;
  img1.Top:=100;
  img1.Left:=100;
  img1.Picture.LoadFromFile('c:\resim.bmp');
end;
Öğrenmek ve öğretmek, akıntıya karşı yüzmek gibidir ilerleyemediğiniz taktirde gerilersiniz.
YeniCevizci
Üye
Mesajlar: 35
Kayıt: 24 Tem 2004 09:49

Mesaj gönderen YeniCevizci »

Kod: Tümünü seç

if AParent.Components[n].Name=name then img1.free; 
yerine

Kod: Tümünü seç

 if AParent.Components[n].Name=name then AParent.Components[n].free;
olmalı gibi geldi bana :wink:
Kullanıcı avatarı
Asri
Kıdemli Üye
Mesajlar: 767
Kayıt: 16 Eyl 2003 09:54
Konum: istanbul

Mesaj gönderen Asri »

YeniCevizci yazdı:

Kod: Tümünü seç

if AParent.Components[n].Name=name then img1.free; 
yerine

Kod: Tümünü seç

 if AParent.Components[n].Name=name then AParent.Components[n].free;
olmalı gibi geldi bana :wink:
:) Ben kodu test edip göndermiştim. Bu yüzden sadece img1.free demende yeterli olur. Senin gönderdiğin kod ise çok daha akıllıca neden dersen.

Kod: Tümünü seç

if AParent.Components[n].Name=name then img1.free; 
bu şekilde her bir eleman için ayrı bir if .. then kullanmak gerekir.
oysa senin gönderdiğin bu kod ile

Kod: Tümünü seç

 if AParent.Components[n].Name=name then AParent.Components[n].free;
tek bir satırda bütün elamanlar için kullanabilirsin.

düzeltmen için teşekkür ediyorum.

iyi çalışmalar.
Öğrenmek ve öğretmek, akıntıya karşı yüzmek gibidir ilerleyemediğiniz taktirde gerilersiniz.
YeniCevizci
Üye
Mesajlar: 35
Kayıt: 24 Tem 2004 09:49

Mesaj gönderen YeniCevizci »

Ben teşekkür ederim, bu güzel fonksiyonu bizlere kazandırdığınız için :)
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

Mesaj gönderen vampir261 »

Bu başlıkta çalışma anında component create etme konusu bahsi geçtiği için buraya yazmakta bir sakınca göremedim.

Kod: Tümünü seç

editim:=TEdit.Create(form11.suiPanel2);
    editim.Parent:=form11.suiPanel2;
bu kod ile yeni bir edit nensnesi oluşturuyorum. çalışma anında bunu yaparken ortalama 200 tane edit oluşturuyorum. ve bu kod gözle görülür (yaklaşık3-4 saniye) bir yavaşlamaya neden oluyor. bu kodun altında her bir edit için onenter olayları da ekleniyor. bu kodun alternatifini bulamadım. eğer bu konuda bilgisi olan varsa yardımlarını bekliyorum. Saygılar
Kullanıcı avatarı
Asri
Kıdemli Üye
Mesajlar: 767
Kayıt: 16 Eyl 2003 09:54
Konum: istanbul

Mesaj gönderen Asri »

Kod: Tümünü seç

    yeniEdit := TEdit.Create(self);
    yeniEdit.Parent := Form1;
    yeniEdit.Top := 65+(i*30);
    yeniEdit.left:= 10;
    yeniedit.Name:='yeniedit'+inttostr(i+1);

Bir de bunu dene, ne kadar çözüm olur bilemem ama..
umarım işinize yarar.

iyi çalışmalar.
Öğrenmek ve öğretmek, akıntıya karşı yüzmek gibidir ilerleyemediğiniz taktirde gerilersiniz.
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

Mesaj gönderen vampir261 »

Hocam elinize sağlık düşünüp yazmışsınız da yazdığınız kodun benimkinden farkı self bende bu olayı bir button altında yapmadığım için procedure içinde yazdığım için form11. gibi bir ifade kullanmışım yine de sağol.
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

Siz de olmasak naapıcaz bilemiyorum yani - Şimdiden saolun.

Kod: Tümünü seç

inifile:=Tinifile.Create(dir.Directory+'\'+dir_list.Items[dir_list.itemindex]+'\'+'Hosting Detay.ini');
inifile.ReadSection('FİRMA BİLGİLERİ',listbox1.items);
procedure TForm1.oku_hosting_detay2Click(Sender: TObject);
var i:integer;
const   NamePrefix1 = 'Giris';
        NamePrefix2 = 'Deger';
begin
//GİRİŞ DEĞİŞKENLERİNİ FORM'a Yerleştir
  for i := 0 to listbox1.items.count-1 do
  begin
    TEdit.Create(Self).Name := NamePrefix1 + IntToStr(i);
    with TEdit(FindComponent(NamePrefix1 + IntToStr(i))) do
    begin
    text:=Listbox1.items[i];
      Left := 0;
      Top := i * 20;
      Width := 160;
      color:=clbtnface;
      Parent := TabSheet1;
    end;
end;
//GİRİŞ DEĞİŞKENLERİNİ FORM'a Yerleştir
//GİRİŞ DEĞİŞKENLERİNİN DEĞERLERİNİ FORM'a Yerleştir
  for i := 0 to listbox1.items.count-1 do
  begin
    TEdit.Create(Self).Name := NamePrefix2 + IntToStr(i);
    with TEdit(FindComponent(NamePrefix2 + IntToStr(i))) do
    begin
    text:=inifile.readstring('FİRMA BİLGİLERİ',Listbox1.items[i],'');
      Left := 165;
      Top := i * 20;
      Width := TabSheet1.Width - left ;
      Anchors:=[akLeft,akTop,akRight];
      Parent := TabSheet1;
    end;
end;

//GİRİŞ DEĞİŞKENLERİNİN DEĞERLERİNİ FORM'a Yerleştir

Kod: Tümünü seç

function silComponent(AParent: TComponent; Name: string): TComponent;
var 
   n: integer; 
begin 
  Result:=nil; 
  if AParent.ComponentCount=0 then Exit; 
  for n:=0 to AParent.ComponentCount-1 do
  begin
    if AParent.Components[n].Name=name then AParent.Components[n].free;
  end; 
end; 

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
//showmessage(inttostr(ComponentCount));
for i:=0 to ComponentCount - 1 do
        begin
        if (Components[I] is TEdit) and (pos('Giris',Components[I].Name) <> 0 ) or (pos('Deger',Components[I].Name) <> 0 ) then
                begin
                listbox2.items.add(Components[I].Name);
                end;
        end;

for i:=0 to listbox2.items.count-1 do
        begin
        silComponent(Self,listbox2.items[i]);
        end;
end;
Şimdi sorun şurada. Butona basınca Bi listeye - benim create ettiğim (INI dosyasındaki section sayısı kadar olan) tedit lerin isimlerini aktarıyorum ve bunları silmek istiyorum. Listeye aktarmak o kadar da mühim diil - Hatalarımı kolay görmek Açısından yaptım sadece. Ancak Create ettiğim yani Deger ve Giris isimleri içeren Tedit leri silComponent fonksiyonu kullanarak siliyor ama hemen ardından şu hatayı veriyor.
List index out of bounds (27)

Kod: Tümünü seç

showmessage(inttostr(ComponentCount));
sonucu da 28. İpucu olsun... - Kolay Gelsin
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

Kod: Tümünü seç

silComponent(Self,listbox2.items[i]);
yerine

Kod: Tümünü seç

findcomponent(listbox2.items[i]).free;
yazarak sorunu şimdilik aştım. Kolay Gelsin
Cevapla