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