Form oluşturma yada yok etmede, SELF Nil ve Free olayı
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Form oluşturma yada yok etmede, SELF Nil ve Free olayı
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.
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.
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ü.
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ü.
Selam,
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.
İş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.
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.Form1.Free; dersen hafızadan tamamen silinmiyor , bi de sonuna Form1 := nil; demelisin.
Kod: Tümünü seç
procedure FormGoster(Sender : TObject)
var
FForm :TForm1;
begin
FForm:=TForm1.Create(self);
FForm.ShowModal;
FForm.Free;
end;
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;
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.
Opt2000 yazdı:Selam,
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.Form1.Free; dersen hafızadan tamamen silinmiyor , bi de sonuna Form1 := nil; demelisin.
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.
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
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...
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

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.
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...
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.
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.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Delphi
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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .