Create edilen nesnede silinme sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Hashirama
Üye
Mesajlar: 81
Kayıt: 26 Kas 2013 03:42

Create edilen nesnede silinme sorunu

Mesaj gönderen Hashirama »

Merhaba Arkadaşlar

Form da ki buton a her tıklamamda bir elips oluşturuyorum, elipslerin üzerine tıklayınca da silinmesi istiyorum. Oluşturma işleminde sıkıntı yok, oluşturduğum her elipsin üzerine tıklayıp Name sini Label e aktarabiliyorum ama silme işlemini yapamadım.

Kod: Tümünü seç

.
.
.
procedure elipsclick(Sender: TObject);

public
    { Public declarations }
     function silComponent(AParent: TComponent; Name: string): TComponent;
.
.
.
var
xElipsnumarasi:integer=0; // global, elips in tag ve name sinde kullnıyorum

procedure TForm1.Button2Click(Sender: TObject); // elips oluştur
begin
inc(xElipsnumarasi);

elips:=TEllipse.Create(Rectangle2);
elips.Parent:=Rectangle2;
elips.Name:=format('elips_%.3d',[xElipsnumarasi]);
elips.Height:=73;
elips.Width:= 65;
elips.Fill.Color:=TAlphaColorRec.red;
elips.Position.X:= 72;
elips.Tag:=xElipsnumarasi;

ip:=TArc.Create(elips);
ip.Parent:=elips;
ip.Name:=format('ip%.3d',[xElipsnumarasi]);
ip.Height:=105;
ip.Width:= 17;
ip.Position.Y:=72;
ip.Position.X:=24;
ip.Tag:=xElipsnumarasi;

elips.OnClick:=elipsclick;
end;

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

procedure TForm1.elipsclick(Sender: TObject);
begin
label1.Text:=elips.name;
silComponent(self,elips.Name);
end;
Bu konu da yardımcı olur musunuz ?

Teşekkürler.
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Create edilen nesnede silinme sorunu

Mesaj gönderen xxxjedixxx »

Merhaba,

Elipsinin parent'ı Rectangle2 diye bir nesne iken click prosedüründe SilComponent'e "AParent" parametresini "Self" olarak gönderiyorsun. Form'a ait bir prosedür içinde Self kullandığında bu Form'u ifade eder, Elips'in parent'ı anlamına gelmez. Rectangle2 nedir bilemiyorum, bu kadar kodla ancak bu kadar yorum yapabilirim.
Muhtemelen AParent.Components[n].free; kodunda hata alacaksın. Bu yüzden RemoveComponent'i kullanmak gerekecektir.

Kod: Tümünü seç

procedure TForm1.elipsclick(Sender: TObject);
begin
  label1.Text:=elips.name; //Ayrıca burada kullandığın elips, daima son create ettiğin elips'i ifade eder. Bu yüzden TEllipse(Sender).Name kullanman gerekir.

// Burada self yerine Rectangle2 olması gerekir.
  silComponent(Rectangle2,elips.Name);
end;
Kullanıcı avatarı
The_aLiEn
Üye
Mesajlar: 28
Kayıt: 09 Kas 2010 02:35
Konum: Trabzon
İletişim:

Re: Create edilen nesnede silinme sorunu

Mesaj gönderen The_aLiEn »

xxxjedixxx yazdı:

Kod: Tümünü seç

procedure TForm1.elipsclick(Sender: TObject);
begin
  label1.Text:=elips.name; //Ayrıca burada kullandığın elips, daima son create ettiğin elips'i ifade eder. Bu yüzden TEllipse(Sender).Name kullanman gerekir.

// Burada self yerine Rectangle2 olması gerekir.
  silComponent(Rectangle2,elips.Name);
end;
Benzer şekilde

Kod: Tümünü seç

silComponent(Rectangle2,elips.Name);
değil

Kod: Tümünü seç

silComponent(Rectangle2,TEllipse(Sender).Name);
kullanılmalı.
Hashirama
Üye
Mesajlar: 81
Kayıt: 26 Kas 2013 03:42

Re: Create edilen nesnede silinme sorunu

Mesaj gönderen Hashirama »

Sorunun bir kısmı çözüldü, cevaplarınız için teşekkürler.

Ancak birden fazla elips oluşturup, en son oluşturduğumdan itibaren üzerine tıklayıp silmeye başladığımda hiç bir sorun çıkmıyor. Silme işlemine en son harici başka bir elips ten başlarsam 'Argument out of range.' hatası alıyorum. Bunda nasıl bir yol izlemem gerek ?
Kullanıcı avatarı
The_aLiEn
Üye
Mesajlar: 28
Kayıt: 09 Kas 2010 02:35
Konum: Trabzon
İletişim:

Re: Create edilen nesnede silinme sorunu

Mesaj gönderen The_aLiEn »

Silme işlemi için Parent'ın child component'larını gezdirmene gerek yok. Click event'ı içinde gerçekleştirebilirsin silmeyi.

Kod: Tümünü seç

procedure TForm1.elipsclick(Sender: TObject);
begin
  //TEllipse(Sender) ile bir şeyler yapıldı

  // iş bitti, elips silinecek
  Sender.Free; // TEllipse, TComponent descendant ise Parent'ına FreeNotification geçecektir diye düşünüyorum
  
  //silComponent(Rectangle2,elips.Name); //ile silme yapmana bu durumda gerek yok. 
end;
Hashirama
Üye
Mesajlar: 81
Kayıt: 26 Kas 2013 03:42

Re: Create edilen nesnede silinme sorunu

Mesaj gönderen Hashirama »

The_aLiEn yazdı:Silme işlemi için Parent'ın child component'larını gezdirmene gerek yok. Click event'ı içinde gerçekleştirebilirsin silmeyi.

Kod: Tümünü seç

procedure TForm1.elipsclick(Sender: TObject);
begin
  //TEllipse(Sender) ile bir şeyler yapıldı

  // iş bitti, elips silinecek
  Sender.Free; // TEllipse, TComponent descendant ise Parent'ına FreeNotification geçecektir diye düşünüyorum
  
  //silComponent(Rectangle2,elips.Name); //ile silme yapmana bu durumda gerek yok. 
end;
Teşekkürler, sorun çözüldü.
Cevapla