Forum Kurallarımız güncellenmiştir. DelphiCan Forum Kuralları (March 04) x

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Oluşturulan butonu yok etme
#1
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;
Cevapla
#2
Proje yazmaya başlamadan evvel dilin ve ortamın temellerini öğrenmeniz sizin için çok faydalı olacaktır.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
+1 Bende merak ediyorum.
Cevapla
#4
(23-05-2020, Saat: 11:31)tabikisura10 Adlı Kullanıcıdan Alıntı: +1 Bende merak ediyorum.

Neyi merak ettiğinizi anlayamadım?
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#5
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.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#6
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?
Cevapla
#7
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.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#8
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.
Cevapla
#9
@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.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


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

Fakat butona name vermeyin.
Muharrem ARSLAN
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Firebird table event larını takip etme(fdeventalerter) 41linea41 10 1.586 02-01-2020, Saat: 17:12
Son Yorum: 3ddark
  Json Parse Etme faktoral 3 768 01-08-2019, Saat: 08:50
Son Yorum: SimaWB
  [ÇÖZÜLDÜ] Windows Service içerisinden başka uygulama çalışmasını kontrol etme theSinan 2 936 08-06-2019, Saat: 12:17
Son Yorum: elixir84
  [Çözüldü] Stringgrid özellik iptal etme CesuR 4 1.180 11-01-2019, Saat: 15:18
Son Yorum: CesuR
  Http post etme arsl01 7 1.779 14-09-2018, Saat: 19:52
Son Yorum: arsl01



Konuyu Okuyanlar: 1 Ziyaretçi