Delphi Can
Oluşturulan butonu yok etme - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: Oluşturulan butonu yok etme (/showthread.php?tid=4856)

Sayfalar: 1 2


Oluşturulan butonu yok etme - ekank - 23-05-2020

Merhaba, Uygulamada bir buton create ediyorum daha sonra bu butonda işim bitince yok olmasını. Fakat yok ederken adres hatası alıyorum bu sorunu nasıl çözebilirim?



  private
    { Private declarations }
    procedure xCreateClick(Sender: TObject);
  public
    { Public declarations }
  end;

procedure TMainForm.xCreateClick(Sender: TObject);
begin
  if Sender is TButton then
  begin
  //işlermer


    TButton(Sender).Destroy; //  yok et ????
    TButton(TButton(Sender).Name).Free; //  yok et ???
  end;
end;


procedure TForm.ButtonHavuzIptalClick(Sender: TObject);
begin
  With TButton.Create(Panel1) do
  begin
    OnClick := xCreateClick;
    Cursor := crHandPoint;
    Tag := 1;
    Name := 'Close';
    Align := alRight;
    Height := 25;
    Width := 50;
    Caption := 'Ekle';
    parent := Panel1;
  end;
end;



Oluşturulan butonu yok etme - Tuğrul HELVACI - 23-05-2020

Proje yazmaya başlamadan evvel dilin ve ortamın temellerini öğrenmeniz sizin için çok faydalı olacaktır.


Oluşturulan butonu yok etme - tabikisura10 - 23-05-2020

+1 Bende merak ediyorum.


Cvp: Oluşturulan butonu yok etme - Fesih ARSLAN - 23-05-2020

(23-05-2020, Saat: 11:31)tabikisura10 Adlı Kullanıcıdan Alıntı: +1 Bende merak ediyorum.

Neyi merak ettiğinizi anlayamadım?


Oluşturulan butonu yok etme - mrmarman - 23-05-2020

Size önerim, 
(1) Burada kodlarını paylaşmak üzere boş bir proje açın
(2) Yine panel içerisinde aynı yapıyı kurun
(3) Butona basınca, basılı buton yok olmuyorsa çıkan hatayla birlikte öyle sorunuzu yineleyin.  Çünkü "// işlemler" ile belirttiğiniz yerde belki de farklı iş yükü arasında kendisini ve/veya owner'ini, onun ownerini vs. birden fazla defa yok etmeye çalışıyor olabilirsiniz bunu bilemeyiz. 
Sorunuzda yazdığınız gibi soru işareti ile belirtmek istediğini kod satırlarını alt alta aynı anda yazıp çalıştırdığınız yanılgısı yaşıyor olabiliriz.  Exclamation

Buradan çözüm için örnek kod yazmadan önce sizin takıldığınız yeri görmek isteriz.


Oluşturulan butonu yok etme - ekank - 23-05-2020

Aynı kodları daha önce FMX tarafında kullanıyordum ve sorun yaşamıyordum. Fakat var olan VCL projemde kodları ekleyince hata almaya başladım.
Sorun VCL'den kaynaklanıyor sanıyordum Sad

Hata kodu:
First chance exception at $0054EA85. Exception class $C0000005 with message 'access violation at 0x0054ea85: read of address 0x00000008'. Process Arsiv.exe (14964)


Tekrar VCL boş proje ile test yaptım hata vermedi. Var olan projemdeki hatayı nasıl çözerim?


Oluşturulan butonu yok etme - mrmarman - 23-05-2020

Hata vermeyeceğine ilişkin kuşkum vardı zaten, onun için yazmıştım. Var olan projenizde kodları adımlayarak ( TRACE ) bir aşamada FREE edilmiş olan nesneyi yeniden FREE etmek istiyor olduğunuzu göreceksiniz. Bunu bulduğunuzda çözüm de orada olacak.

Şöyle bir senaryo kurayım değerlendirin:
* Bir dizi düşünün ( 1,2,3,4,5,6,7,8,9,10 )
* Aradan 5 numaralı olan nesenyi FREE ettik.
* Siz projenin bir yerinde tüm diziyi yok et dediniz. Döngüyü nasıl kurarsınız.
  - 1'den başlayıp 10'a kadar değil mi ? Arada (5) daha önce FREE edildiğine göre işte orada Access Violation hatası alınır. 

Kontrolünüz ne kadar etkin olursa olsun, free öncesi orada bir nesne var mı diye -  if Assigned( nesne )   veya   if nesne <> nil gibi - sormalısınız. Idea

İşte sorununuza ilişkin senaryoya bunu da ekleyin.


Oluşturulan butonu yok etme - tabikisura10 - 23-05-2020

TButton* Btnn[10];

void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (int i = 0; i < 10; i++) {
Btnn[i] = new TButton(Form1);
Btnn[i]->Parent = Form1;
Btnn[i]->Text   = i;
Btnn[i]->Position->Y = 30 * i;
}
}

void __fastcall TForm1::Button3Click(TObject *Sender){
for (int i = 0; i < 10; i++) {
Btnn[i]->Free();
}
}


ben böyle kullandım sildi.


Oluşturulan butonu yok etme - mrmarman - 23-05-2020

@tabikisura10

Örneğin bir başka buton ile veya butonun kendisi ile Btnn[5]->Free();  ile 5 nolu indeksli olanını tekil olarak sildiniz.  

* Button3'e tıkladığınızda ne olur ? İşte @ekank 'nı karşılaştığı sorun böyle bir sorun bence.


Oluşturulan butonu yok etme - arsl01 - 23-05-2020

Merhaba ben şu şekilde yok ediyorum.
 RemoveObject(Tobject)

Fakat butona name vermeyin.