Form Creat içinde button oluşturma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Form Creat içinde button oluşturma

Mesaj gönderen Abrak »

Selam Arkadaşlar;
Bir proje yaparken yeni birşey öğrendim;
çalışma sırasında yeni fsMDIChild formlar oluşturuyorum ve bu formların onCreat 'inde Toollbar da yeni butonlar formu kapattığımda ilgili butonunda Free edildiğini gördüm bunu açıklayabilirseniz sevinirim..
Saygılarımla;
Başkasına Olan Saygımız.. Kendimize Olan saygıdır..
ertug
Üye
Mesajlar: 82
Kayıt: 10 Ara 2004 05:41

Mesaj gönderen ertug »

Merhaba,

Eğer doğru anladıysam; bir MDIChild form oluşturuyorsunuz ve OnCreate olayında ana formun toolbar'ına yeni nesneler ekliyorsunuz. Ancak child formu kapatınca düğmeler kayboluyor. Bunun nedenini öğrenmek istiyorsunuz...

Kısa cevap:
Sebebi "Owner" denilen, yani nesnenin sahibi olan bir başka nesnenin yok edilmesidir.

Uzun cevap:
Bir wincontrol nesnesi yarattığınızda, o nesneye bir "owner" (sahip) atarsınız.

Button1 := TButton.Create(Form1);

Örneğinde (Button1)in sahibi (Form1)dir ve onun yok edilmesinden ve hafızadan temizlenmesinden (Form1) sorumludur. Eğer

Form1.Free;

komutunu çalıştırırsanız, formla birlikte düğme de yok edilecektir. "Owner" kavramının dışında "Parent" (üzgünüm Türkçe'sini bilemiyorum) kavramı da vardır. "Parent" oluşturulan nesnenin nerede bulunacağını belirler. Nesnenin "Owner"ı ve "Parent"ı farklı nesneler olabilir.

Muhtemelen siz MDIChild formu kapattığınızda Delphi formu yokediyor ve bu da formun sahip olduğu tüm nesnelerin - "Parent"ı ana form olan araç çubuğu düğmeleri de dahil - yok olmasıyla sonuçlanıyor.

Umarım yeterince açık anlatabilmişimdir.
Ertuğ Kaya
Abrak
Üye
Mesajlar: 189
Kayıt: 18 Kas 2004 05:30

Mesaj gönderen Abrak »

Çok teşekkür ederim; owner ve parenti biliyorum artıkta şöyle diyelim;
formun creatında nesne oluşturduğumda yeni oluşturulan nesneye formun parentini atıyor kendisi.. Hiç aklıma gelmemişti bu şekilde olabileceği çok sağol tekrar
Başkasına Olan Saygımız.. Kendimize Olan saygıdır..
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Form'un OnCreate'de :

Button:= TButton.Create(nil) yapsaydın Form'un OnDestroy'da kendin Button.Free demek zorunda kalacaktın.

Button:= TButton.Create(Form1) yaparak Button'un sahibini Form1 yapmış oldun.

Şimdi Form'u Form1.Free yaparken birsürü şey olur. Ancak en önemlisi Form sahiplik yaptığı component listesini bir döngü içinde tek tek Free eder ve daha sonra kendini Free eder.

Free proc. Form'un Destroy destructor'unu çağırır.

Destructor şöyle birşey:

Misal:

destructor TForm.Destroy;
begin
..........
........

for I:= 0 to Components.Count - 1 // buraları sallıyorum
Components.Free;

// Üstteki yordama benzer bir yolla sahip olduğu bütün componentleri Free eder.

end;
Cevapla