Memory, Scope vs. ile ilgili birtakım sorular..

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Memory, Scope vs. ile ilgili birtakım sorular..

Mesaj gönderen Glen »

Merhaba arkadaşlar..

Sorularım basit gelebilir, ancak bu sıralar kafamı bayağı bir kurcalamakta.. Eğer yanılıyorsam, kodlarımı bayağı bir değiştirmem gerekecek :)

İlk sorum scope ile ilgili, bağlantılı olarak da memory..

Button1.Click eventini ele alalim.. Kod şöyle olsun..

Kod: Tümünü seç

var
XForm : TForm;
begin
  xForm := TStok.Create(Self);
  xForm.Show;
end;
Stokun da OnClose eventinde

Kod: Tümünü seç

Action := CaFree;
Self := nil;
Dikkat Ederseniz, Self := Nil diyorum, Stok := Nil DEĞİL!

1. si Button1'in OnClick eventi bitince XForm diye tanimaldigimiz şey free oluyor mu? Yani Delphide bu tip degiskenler sadece scope icinde mi gecerli Yoksa en son XForm := nil; gibi birsey yapmam gerekiyor mu?

İlk sorum buydu.. Daha devami gelecek dizi halinde :)

Şimdiden çok teşekkür ederim ilginiz icin, eger açık anlatamadıysam tekrar anlatabilrim

Herkese kolay gelsin..
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: Memory, Scope vs. ile ilgili birtakım sorular..

Mesaj gönderen sadettinpolat »

Glen yazdı: 1. si Button1'in OnClick eventi bitince XForm diye tanimaldigimiz şey free oluyor mu? Yani Delphide bu tip degiskenler sadece scope icinde mi gecerli Yoksa en son XForm := nil; gibi birsey yapmam gerekiyor mu?
free olmaz. sadece Xform degiskeni lokal bir degisken oldugundan button1.onClick olayi tamamlaninca Xform degiskeni hafizadan atilir ama xForm degiskeninin isaret ettigi nesne (TStok) siz onu free etmeden hafizadan silinmez.

not: Orneginizde TStok penceresini kapatmaniz ya da TStok un Owner i free edildiginde de TStok otomatik olarak free edilir.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Mesaj gönderen Glen »

Cevabiniz icin tesekkür ederim. Aslinda ayni seyi sormusum ancak farkli anlasilmis, yani istedigim gibiymis cevap :)

OnClose eventinde yarattigim nesne kapatiliyor, ancak xForm (pointer durumunda sanirim) button1 click eventi bittiginde xForm gidiyor, (yani isaret ettigi TStok hala duruyor..).

Harika.. Degistirmeme gerek kalmadi sevindim :)
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Mesaj gönderen Glen »

Memory ile ilgili arastirma yaparken bir koda rastladim ve aklima takildi konuyla ilgili yine.. Sormak istedim..

Kod: Tümünü seç

var
   Tbl1:TTable;

begin 
   Tbl1:=TTable.Create(nil); 
   Tbl1.Databasename:='EmployeesDB'; 
   Tbl1.TableName:='Employees';
   Tbl1.Open;
   Tbl1.Insert;
   Tbl1.FieldByName('Employee_Name').AsString:=EditEmpName.Text;
   Tbl1.Post;
   Tbl1.Free;
end;
Tbl1 objesi en son Tbl1.Free seklinde free ediliyor.. Event bittiginde zaten otomatikman Free edilmiyor mu? Yani oradaki

Kod: Tümünü seç

Tbl1.Free
Kodu gereksiz degil mi?
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

gereksiz degil gerekli.
ordaki tbl1 sadece hafizada olusturulmus Table nesnesini gosteren bir isaretciden baska birsey degil.
table nesnesi hafizada (atiyorum) 50 byte lik yer isgal ediyor olsun.
tbl1 ise bir isaretci oldugu icin hafizada 4 byte lik yer kaplar.
isgal ettigi alanda ise hafizada olusturulmus olan table nesnesinin adresi vardir.

event bittiginde tbl1 in isgal ettigi 4 bytlik alan geri iade edilir ama tbl1.free komutunu kullanmazsan 50 bytle lik table nesnesi hafizada durmaya devam eder.

50 byte lik hafizayida serbest birakmak icin tbl1.free komutunu kullanmalisin.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Cevapla