Form oluşturma yada yok etmede, SELF Nil ve Free olayı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ikut

Form oluşturma yada yok etmede, SELF Nil ve Free olayı

Mesaj gönderen ikut »

Merhaba

Formları kod içinden oluştururken parametre olarak SELF mi vermeli Application mı. Bu formu gene kod içinden yok ederken Nil mi yapmalı Free methodu mu kullanmalı.

Bilen birisi bunun teknik farklarını yazabilirmi.
iqprog

Mesaj gönderen iqprog »

FreeAndNil(Form1); şeklinde kullanmalısın.

Form1.Free; dersen hafızadan tamamen silinmiyor , bi de sonuna Form1 := nil; demelisin. Borland bunun ikisinin yerini tutan FreeAndNil'i ekledi.



Create'de self dersen sonradan yaratılan formun sahibi kodu yazdığın form oluyor, application dersen uygulumanın kendisi yaratılan formun sahibi oluyor, bir başka şekilde nil de diyebilirsin. Formun owner özelliğini kullanmayan birisi için bunun hiçbir önemi yok , herhangi birini kullanabilirsin yani. owner ne olduğunu da çoğu kişi bilmez, hiç ihtiyacı olmamıştır çünkü.
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,
Form1.Free; dersen hafızadan tamamen silinmiyor , bi de sonuna Form1 := nil; demelisin.
Bu kısım pek doğru değil. Free dediğiniz zaman hafızadan tamamen silinir, ama Form1 bellekte hala bir adres gösterir. Bu adres artık geçerli bir adres değildir. Eğer bu değişken bir fonsiyon/procedure içinde tanımlanmışsa, nil yapmanıza gerek yok. Ama private veya public tanımlanmışsa, o zaman nil yapmanız sizin yararınıza olacaktır.

Kod: Tümünü seç

procedure FormGoster(Sender : TObject)
var
  FForm :TForm1;
begin
  FForm:=TForm1.Create(self);
  FForm.ShowModal;
  FForm.Free;
end;
Bu fonksiyonda nil yapmaya gerek yok, çünkü kodda zaten Free yaptıktan sonra bir daha FForm'a erişmeye çalışmayacağız (Programı yazan kişi olarak bundan %100 eminiz.)

Bir de şöyle bir örnek düşünün. Bu sefer FForm'un private olarak tanımladık diyelim.

Kod: Tümünü seç

function FormGoster(Sender :TObject)
begin
  if not Assigned(FForm) then
    FForm:=TForm1.Create(self);

  FForm.ShowModal;
end;
İşte sorun buna benzer fonksiyonlarda çıkar. if kontrolü yapılan satır tehlikeli bir satırdır, çünkü bu FForm değişkeni private olduğu için, programın başka bir yerinde Free edilmiş olabilir ve eğer Free edildikten sonra FForm:=nil; ataması yapılmamışsa, bu Assigned fonksiyonundan geriyor true dönecek, not ile kontrol ettiğimiz için if şartı gerçekleşmeyecek ve FForm.ShowModal satırına geçilecektir. Ama biz FForm'u daha önce Free ettiğimiz için hata verecektir, çünkü FForm değişkeninin gösterdiği adres geçersiz bir adres.

Eğer ilk örnekteki gibi kullanacaksan, FreeAndNil veya FForm:=nil gibi satırlara ihtiyacın yok. Özellikle çok yüksel performans gerektiren programlarda bu tür gereksiz atamalar yapmak aslında programın performansını düşürür (Genelde bizim yazdığımız programlar için geçersiz bir uyarı). Ama private veya public bir değişken ise bu nil yapmakta fayda var.

NOT: Assigned fonksiyonu pointerlar için kullanılır (ki FForm değişkeni de aslında bir pointerdir) ve asıl yaptığı iş de pointerin nil olup olmadığını kontrol etmektir.
iqprog

Mesaj gönderen iqprog »

Opt2000 yazdı:Selam,
Form1.Free; dersen hafızadan tamamen silinmiyor , bi de sonuna Form1 := nil; demelisin.
Bu kısım pek doğru değil. Free dediğiniz zaman hafızadan tamamen silinir, ama Form1 bellekte hala bir adres gösterir. Bu adres artık geçerli bir adres değildir.

dostum konuyu uzatmamak için özetle hafızadan tamamen silinmiyor diyorum. Hafızadan tamamen silinir ama bellekte hala bir adres gösterir demişsin, bellek ne hafıza ne ikisi de aynı şey. anlattığını şeyi biliyorum ama özetle free demekle nesnenin hafızadaki bağlantılarını tamamen yok etmiş olmuyorsun. yani daha da özetle hafızadan tamamen silinmiyor. belki kendi siliniyor ama adresi silinmiyor, yani hafızadan tamamen silinmiyor.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Aslında bu şey gibi defteri karalarsın sonra silersin bakmışsın ki izi kalmış bu şekilde düşünmek yararlı olur.

Bellek yönetimi farklı bir olaydır bellek pointerlarla adres tutar ve bu adreslerde oluşturulan nesne ve değişkenler oluşur ve otururlar ama hangi adreste ikamet ettiklerini sistem istediği zaman ulaşabilmesi için indexleme yapma gerekir buda oluşan nesnenin ikamet adresini belirler. Anlayacağınız nil sadece adres kaydını siler nesnenin temizlenmesiyle alakası yoktur peki adres kaydını silmemizin ne yararı olur :idea: adres kaydının silinmesi yani nil atanması o adresi indexten kurtarır ve o adresi kullanıma açar.

Ben formları create ediyorsam free ettikten sonra mutlaka nil atamasını yapar create ederkende sadece nil kontrolü yaparım.

Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

peki destroy dersek nasıl bir olay olur? Help kısmında destroy kullanılmasını tavsiye etmiyor free kullanın diyor. destroy yapınca sanıırm formun onclose olayları işlenmiyor. görevini sonlandırmak gibi bir şey sanırım.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Free metodu static Polymophism sen hangi nesneyi create edersen et nesne yok ettiğin zaman TObject’in Free metodu çalışır bu metodla hangi nesneyi yok ediyor isen o nesnenin Destroy metodunu işler destroy ise public ve virtual tanımlanmıştır. Direk destroy kullanıldığında destroy bu işlem sırasına uyulmadığı için nesneye bağlı çalışması gereken bir den fazla yordamın işlememesine neden olabilir.

Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

polymorphism aynı isme sahip fonksiyonların benzer olabilse de farklı işlevleri yerine getirmesidir. Bilgisayarı açmak, bulaşık makinesini açmak, çamaşır makinasını açmak vb...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Delphi

Mesaj gönderen sabanakman »

Delphinin bileşen tasarımı çok ilginçtir. Tıpkı klasörlere benzer. Application nesnesini C:\ klasörüne benzetirsek C:\ içinde görünen (alt klasörleri hariç Windows, Program Files gibi) tüm klasörlerde DataModül ve Formları temsil eder. Tabi bu klasörlerin altındaki klasörlerde bu Formlar ve Modüllerin üzerindeki bileşenlere karşılık gelir. Biz bir formu eğer çok özel bir tasarımımız yoksa oluştururken Owner (Sahip) parametresine Application vermeliyiz. Çünkü başka bir bileşen verildiği zaman o bileşenin altında oluşacak (alt klasör gibi) ve o sahip bileşen silinince (free destroy vs.) bizim oluşturduğumuz bileşende silinecektir (Klasör silinince içinde bulunan alt klasörlerin silinmesi gibi). Sahip parametresi verilmezse eğer (nil verilirse) o zaman proje kapatılırken bununda free edilmesi gerekecektir. Sistem kaynaklarını verimli kullanmak açısından durum böyle. Bu bahsettiğim özellik TComponent nesnesine ait bir özelliktir ve değişmez. Delphide tüm bileşenler bu nesneden türediği için durum böyledir. Kısaca bir forma sahip olarak Edit veya Table nesneleri bile verilebilir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla