fnksiynun icinde nesne.free yapnca result:=nesne olmuyor...
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- huseyinkucuk
- Üye
- Mesajlar: 142
- Kayıt: 29 Nis 2005 10:03
- Konum: İstanbul
- İletişim:
fnksiynun icinde nesne.free yapnca result:=nesne olmuyor...
arkadaşlar... Şimdi fonksiyon genel hatlarıyla şöyle:
fonksiyon arama:TStringList;
var
liste:TStringList;
begin
liste:=TStringList.Create;
//işlemler...
//işlemler...
result:=liste;
liste.free;
end;
şimdi ben bu fonksiyonu çağırdığım zaman access vailation (böyle bişeydi) hatası veriyo... Acaba diyom, şimdi bu nesneler işaretçi ya, acaba "result" "liste" nesnesini referans gösteriyo da "liste" yok olunca "result"un göstereceği referans kalmıyo da o yüzden mi bu hatayı veriyo diyorum... ama fonksiyonun içindeki "liste.free" yi yazmazsam hata olmuyo ve fonksiyon normal çalışıyo, o zaman da diyorum ki kendi kendime "e bu 'liste' nesnesi lokal tanımlanmış, (ayrıca da işaretçi (pchar gibi yani)) fonksiyondan çıkınca yok olması gerekmiyo mu?" diyorum... Anlamadım gitti şu işleri...
fonksiyon arama:TStringList;
var
liste:TStringList;
begin
liste:=TStringList.Create;
//işlemler...
//işlemler...
result:=liste;
liste.free;
end;
şimdi ben bu fonksiyonu çağırdığım zaman access vailation (böyle bişeydi) hatası veriyo... Acaba diyom, şimdi bu nesneler işaretçi ya, acaba "result" "liste" nesnesini referans gösteriyo da "liste" yok olunca "result"un göstereceği referans kalmıyo da o yüzden mi bu hatayı veriyo diyorum... ama fonksiyonun içindeki "liste.free" yi yazmazsam hata olmuyo ve fonksiyon normal çalışıyo, o zaman da diyorum ki kendi kendime "e bu 'liste' nesnesi lokal tanımlanmış, (ayrıca da işaretçi (pchar gibi yani)) fonksiyondan çıkınca yok olması gerekmiyo mu?" diyorum... Anlamadım gitti şu işleri...
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
Re: fnksiynun icinde nesne.free yapnca result:=nesne olmuyor
Evet bu tür function kullanımı tamamen hatalı...(Bende Yapmıştım...huseyinkucuk yazdı:arkadaşlar... Şimdi fonksiyon genel hatlarıyla şöyle:
fonksiyon arama:TStringList;
var
liste:TStringList;
begin
liste:=TStringList.Create;
//işlemler...
//işlemler...
result:=liste;
liste.free;
end;
şimdi ben bu fonksiyonu çağırdığım zaman access vailation (böyle bişeydi) hatası veriyo... Acaba diyom, şimdi bu nesneler işaretçi ya, acaba "result" "liste" nesnesini referans gösteriyo da "liste" yok olunca "result"un göstereceği referans kalmıyo da o yüzden mi bu hatayı veriyo diyorum... ama fonksiyonun içindeki "liste.free" yi yazmazsam hata olmuyo ve fonksiyon normal çalışıyo, o zaman da diyorum ki kendi kendime "e bu 'liste' nesnesi lokal tanımlanmış, (ayrıca da işaretçi (pchar gibi yani)) fonksiyondan çıkınca yok olması gerekmiyo mu?" diyorum... Anlamadım gitti şu işleri...

Hata sebebi nedir?
Bu Suna Benziyor...Kuşun Kanadını Kır Hadi Uç demek gibi bir sey bence (

Yani demişinki ben seni bırakıyorum hemde sonuc dönder...
Biraz önceki örneğimi biraz geliştiriyorum...
Çalıştırdığınız elemanı kovup ona iş yapmasını sölemek gibi bir sey...
O Zaman bizde işi yaptırır öle kovarız....
Bunu nasıl yapacağız biraz araştır yapamazsan yardımcı oluruz ama gerçekten araştır...(Bu Gelişimin için iyi olacak...Bunu araştırırken neler öğreneceksin...(Bir den ah delphi kitapları ah demek geldi içimden kolay gelsin))

Siz hayal edin...Biz yapalım TuannaSoft...
- huseyinkucuk
- Üye
- Mesajlar: 142
- Kayıt: 29 Nis 2005 10:03
- Konum: İstanbul
- İletişim:
Teşekkürler...
Teşekkür ederim ilgilendiğiniz için... Aslında yaptığım bi proje falan yok, sadece öğrenmeye çalışıyorum. Şimdi fonksiyondan geriye direk olarak string tipte bi değişkenle tek tek döndürebilirdim listeyi. Ama ben düşündüm ki; fonksiyon tüm listeyi kendi içinde oluştursun, tstringlist (ya da tstrings) ile döndürsün... Ben de düşündüm bi an Result ile döndürdükten sonra nesneyi nasıl yok ederim diye (yani fonksiyon sonlandıktan sonra nesneyi nasıl yok ederim diye), aklıma lokal olmayan (yani fonksiyonun dışında tanımlanmış) bi tstringlist yapmak geldi (private bölümünde yaptım), yaptım da ve fonksiyonun her çalışmasında aynı nesneyi (privatede tanımlanan yani) kullandım... Böyle herşey güzel oluyo ama sonuçta ben bütün herşeyi fonksiyonun yapmasını istiyorum, dışarda ayrı bi değişken yardımcı olmasın fonksiyona bu konuda. Hımm...; şimdi aklıma geldi; procedure arama(var nesne:tstringlist); yapsam olur mu acaba bu fonksiyon yerine? Sanki olur gibi... Kahvaltı yapayım da deneyim... Cevaplarınız için teşekkürler, kolay gelsin...
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
ben bu functionu söle yazarım....
kullanımı ise
sana yazarken oluşan dosyayı ekledim...
http://www.tuannasoft.com/samples/Ornek.rar
Kod: Tümünü seç
Function Arama(var yuklenecekliste:TStringList):boolean;
begin
try
yuklenecekliste.Clear;
yuklenecekliste.Add('Tuanna');
Result:=true;
except
Result:=false;
end;
end;
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
var
aramasonucu:TStringList;
begin
try
aramasonucu:=TStringList.Create;
Arama(aramasonucu);// burda arama sonucu stringlistimize yüklendi...
ShowMessage(aramasonucu.Text);
finally
aramasonucu.Free;
end;
end;
sana yazarken oluşan dosyayı ekledim...
http://www.tuannasoft.com/samples/Ornek.rar
Siz hayal edin...Biz yapalım TuannaSoft...
- Murat DİCLE
- Kıdemli Üye
- Mesajlar: 702
- Kayıt: 19 Nis 2006 04:12
- Konum: İstanbul
- İletişim:
valla @tuanna arakdaşımız patron-işçi örneklemesi ile gayet iyi anlatmış.
aslında cevap bizlerde hazır, ama madem yeni başladım diyorsun sana biraz daha sancı çektirtirelim mi?
tamam şimdi şunlara bir bakalım.
bu örnekte geriye (Result) hiç bişi dönmez. ve sen dönen sonucu kullanayım dediğinde hataı basacaktır. Şimdi burda liste.free demişiz sorun aslında burda gibi düşünürsek yine hata etmiş oluruz. Neden?
Çünkü bir fonksiyonun içinde oluşturulan bir nesne fonksiyon bittiğinde otomatik olarak free olacaktır. O zaman buna göre tanımladığımız liste değişkeni gereksiz oluyor. Peki nasıl olacak.?
şöyle olacak;
işte şimdi sana doğru sonuç dönecektir. Ve sen bu dönen değeri nerde kullanacaksan orada FREE etmelisin..
bir iki örnek;
Şunu bilmek istiyorum, aslında yapmak istediğin bir StringList içinden arama mı yapmaktı?
kolay gelsin..
aslında cevap bizlerde hazır, ama madem yeni başladım diyorsun sana biraz daha sancı çektirtirelim mi?

tamam şimdi şunlara bir bakalım.
Kod: Tümünü seç
fonksiyon Arama:TStringList;
var
liste:TStringList;
begin
liste:=TStringList.Create;
result:=liste;
liste.free;
end;
Çünkü bir fonksiyonun içinde oluşturulan bir nesne fonksiyon bittiğinde otomatik olarak free olacaktır. O zaman buna göre tanımladığımız liste değişkeni gereksiz oluyor. Peki nasıl olacak.?
şöyle olacak;
Kod: Tümünü seç
fonksiyon Arama:TStringList;
var
begin
Result := TStringList.Create;
//işlemler...
//işlemler...
Result.Add('hello');
Result.Add(mello');
Result.Add('kello');
end;
bir iki örnek;
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender:TObject);
var L : TStringList;
begin
L := Arama;
ShowMessage(L[1]);
ShowMessage(L.Text);
L.Free;
end;
procedure TForm1.Button2Click(Sender:TObject);
begin
ShowMessage(Arama.Text);
end;
kolay gelsin..
Yiğitler yoğurdu farklı yer ... eee bacılarımızda farklı ayran yapar (sulandırmayayım neysemuratdicle yazdı:valla @tuanna arakdaşımız patron-işçi örneklemesi ile gayet iyi anlatmış.
aslında cevap bizlerde hazır, ama madem yeni başladım diyorsun sana biraz daha sancı çektirtirelim mi?
tamam şimdi şunlara bir bakalım.
bu örnekte geriye (Result) hiç bişi dönmez. ve sen dönen sonucu kullanayım dediğinde hataı basacaktır. Şimdi burda liste.free demişiz sorun aslında burda gibi düşünürsek yine hata etmiş oluruz. Neden?Kod: Tümünü seç
fonksiyon Arama:TStringList; var liste:TStringList; begin liste:=TStringList.Create; result:=liste; liste.free; end;
Çünkü bir fonksiyonun içinde oluşturulan bir nesne fonksiyon bittiğinde otomatik olarak free olacaktır. O zaman buna göre tanımladığımız liste değişkeni gereksiz oluyor. Peki nasıl olacak.?
şöyle olacak;
işte şimdi sana doğru sonuç dönecektir. Ve sen bu dönen değeri nerde kullanacaksan orada FREE etmelisin..Kod: Tümünü seç
fonksiyon Arama:TStringList; var begin Result := TStringList.Create; //işlemler... //işlemler... Result.Add('hello'); Result.Add(mello'); Result.Add('kello'); end;
bir iki örnek;
Şunu bilmek istiyorum, aslında yapmak istediğin bir StringList içinden arama mı yapmaktı?Kod: Tümünü seç
procedure TForm1.Button1Click(Sender:TObject); var L : TStringList; begin L := Arama; ShowMessage(L[1]); ShowMessage(L.Text); L.Free; end; procedure TForm1.Button2Click(Sender:TObject); begin ShowMessage(Arama.Text); end;
kolay gelsin..

Ben alacağımı aldım benim kullanım şeklim bu şekilde idi ama senin cevapta en az benim ki kadar geçerli(denemedi gerek yok

bunu da arşivime ekleyeyim...
Siz hayal edin...Biz yapalım TuannaSoft...
Merhaba;
sayın @muratdicle nin gösterdiği yol en ideali.
Şu kodda bir sorun var;
Burda fonksiyon tanımında "yuklenecekliste" değişkenini VAR parametresiyle (yani call by address) kullanmaya gerek yok. Ve hatta bu istenmeyecek durumlara sebep olabilir. "yuklenecekliste" zaten bir nesne işaretcisi. Burda nesne işaretcisini değiştirmek değil ilgiyi nesnenin bir metodu ile nesneye veri eklemek istiyorsunuz. Bu zaten çalışacaktır.
VAR parametresiyle kullanırsak;
Ve böylelikle TStringList nesnenize işaret eden bir işaretçi yok oldu. Ona artık erişemezsiniz ve yok edemezsiniz.
Kolay gelsin.
sayın @muratdicle nin gösterdiği yol en ideali.
Şu kodda bir sorun var;
Kod: Tümünü seç
Function Arama(var yuklenecekliste:TStringList):boolean;
begin
try
yuklenecekliste.Clear;
yuklenecekliste.Add('Tuanna');
Result:=true;
except
Result:=false;
end;
end;
VAR parametresiyle kullanırsak;
Kod: Tümünü seç
Function Arama(var yuklenecekliste:TStringList):boolean;
begin
...
yuklenecekliste:=Nil;//Burda nesne işaretcisini NIL e ayarlayabilirim
...
end;
Kolay gelsin.
poshet303 yazdı:Merhaba;
sayın @muratdicle nin gösterdiği yol en ideali.
Şu kodda bir sorun var;
Burda fonksiyon tanımında "yuklenecekliste" değişkenini VAR parametresiyle (yani call by address) kullanmaya gerek yok. Ve hatta bu istenmeyecek durumlara sebep olabilir. "yuklenecekliste" zaten bir nesne işaretcisi. Burda nesne işaretcisini değiştirmek değil ilgiyi nesnenin bir metodu ile nesneye veri eklemek istiyorsunuz. Bu zaten çalışacaktır.Kod: Tümünü seç
Function Arama(var yuklenecekliste:TStringList):boolean; begin try yuklenecekliste.Clear; yuklenecekliste.Add('Tuanna'); Result:=true; except Result:=false; end; end;
VAR parametresiyle kullanırsak;
Ve böylelikle TStringList nesnenize işaret eden bir işaretçi yok oldu. Ona artık erişemezsiniz ve yok edemezsiniz.Kod: Tümünü seç
Function Arama(var yuklenecekliste:TStringList):boolean; begin ... yuklenecekliste:=Nil;//Burda nesne işaretcisini NIL e ayarlayabilirim ... end;
Kolay gelsin.
Açıklamaların için sağ ol ama kafama takılan daha doğrusu çözemediğim seyler...
1- Kodu hata yapar demişsin olabilir..(Bir kaç hatayı yazsabilirisen)
2- Benim Kullanımımda hatanın olduğunu sölemişsin...
senin kullanımın su şekilde ise
Kod: Tümünü seç
Function Arama(var yuklenecekliste:TStringList):boolean;
begin
...
yuklenecekliste:=Nil;//Burda nesne işaretcisini NIL e ayarlayabilirim
...
end;
açıklarmısın ?
3- Benim yazdığım örnek sadece nesnelerin function içinde oluşturup aynı anda bırakılmasının function dönen değerin olmamasına sebep olmamakta idi... bunla ilgili idi
Kod: Tümünü seç
Function Arama(var yuklenecekliste:TStringList):boolean;
begin
try
yuklenecekliste.Clear;
yuklenecekliste.Add('Tuanna');
Result:=true;
except
Result:=false;
end;
end;
yuklenecekliste diye gelen nesnenin içeriği boşaltılıyor...ve
istediğimiz ifadeler yükleniyor...
Functionun içine dışarıdan bir refarans mış gibi davranılıyor...
Ama sölediklerini dikkate alıyorum ve tekrar değerlendirecem...

Siz hayal edin...Biz yapalım TuannaSoft...
- huseyinkucuk
- Üye
- Mesajlar: 142
- Kayıt: 29 Nis 2005 10:03
- Konum: İstanbul
- İletişim:
tekrar teşekkür
yok, bir stringlist içerisinde yapmıyorum aramayı... ben treeview ile windows 3.1 deki "dosya yöneticisi" gibi bişey yapmaya çalışıcaktım (findfirst, findnext vb. vb., tabi bunu kafaya koyduktan sonra karşıma farklı sorular çıkınca kafayı onlara yormak daha hoşuma gitti ve onları öğrenmeye çalıştım, dediğim gibi, herhangi bir proje üzerinde çalışmıyorum, sadece öğreniyorum şimdilik). muratdicle'nin çözümünü denemiştim aslında... şimdi de aynısını denedim, yani şöyle yaptım..
function arama(aranacakbolge:string):tstringlist;
begin
result:=tstringlist.create;
result.add('hüseyin küçük');
result.add('müseyin küçük');
result.add('küseyin küçük');
//vs... vs... vs...
end;
procedure TForm1.Button1Click(sender:TObject);
var
liste:tstringlist;
begin
liste:=tstringlist.create;
liste:=arama('c:\');
form1.caption:=liste.strings[0];
liste.free;
end;
evet, şimdi farkettim. (windows görev yöneticisinden bakıyorum da) düğmeye 100 kere basmama rağmen hafızada kapladığı alan artmıyo programın...
peki ben niye direk olarak form1.caption:=arama('c:\').strings[0]; yaptığım zaman hafızada kaplanılan alan sürekli artıyo da arama fonksiyonunun sonucunu başka bi nesneye aldığım zaman hafızanın artmadığını görüyorum? Şimdi cevap şuysa eğer: "çünkü liste değişkeni arama fonksiyonunu referans gösterir, liste.free yapınca aramanın hafızada kapladığı alan serbest kalır", eğer cevap buysa ben şunu da denedim: form1.caption:=arama('c:\').strings[0];arama('c:\').free; ve ben bunu yaptıktan sonra da hafızada alan artmaya başladı... Kafayı yemek üzereyim... Şu aletin içinde neler oluyo biri bana anlatabilse müteşekkir olurum... Bu arada yardımlarınız için çok teşekkür ederim... Herkese kolay gelsin...
function arama(aranacakbolge:string):tstringlist;
begin
result:=tstringlist.create;
result.add('hüseyin küçük');
result.add('müseyin küçük');
result.add('küseyin küçük');
//vs... vs... vs...
end;
procedure TForm1.Button1Click(sender:TObject);
var
liste:tstringlist;
begin
liste:=tstringlist.create;
liste:=arama('c:\');
form1.caption:=liste.strings[0];
liste.free;
end;

peki ben niye direk olarak form1.caption:=arama('c:\').strings[0]; yaptığım zaman hafızada kaplanılan alan sürekli artıyo da arama fonksiyonunun sonucunu başka bi nesneye aldığım zaman hafızanın artmadığını görüyorum? Şimdi cevap şuysa eğer: "çünkü liste değişkeni arama fonksiyonunu referans gösterir, liste.free yapınca aramanın hafızada kapladığı alan serbest kalır", eğer cevap buysa ben şunu da denedim: form1.caption:=arama('c:\').strings[0];arama('c:\').free; ve ben bunu yaptıktan sonra da hafızada alan artmaya başladı... Kafayı yemek üzereyim... Şu aletin içinde neler oluyo biri bana anlatabilse müteşekkir olurum... Bu arada yardımlarınız için çok teşekkür ederim... Herkese kolay gelsin...
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
- huseyinkucuk
- Üye
- Mesajlar: 142
- Kayıt: 29 Nis 2005 10:03
- Konum: İstanbul
- İletişim:
programımın hafızada kapladığı alan
benim merak ettiğim birşey daha var: programın hafızada kapladığı alana "windows görev yöneticisi"nden bakıyorum... Şimdi benim kontrolüm dışında windowsun kendi yaptığı şeyler olabilir, belki o yüzden programın kapladığı hafıza artıp azalıyo (mesela programı simde durumuna getirince 2500 kb'den 500 kb'ye düşüyor, sonra tekrar pencere yapınca 940 kb oluyor). Peki benim hafızayı görmem için başka bir seçeneğim var mı (delphideki bir araç falan), mesela; ben merak ediyorum değişkenlerim hafızada yer tutuyolar mı, tutmuyolar mı, yok edebildim mi onları vb. vb... Teşekkürler... (aslında bunu başka bir konu başlığında sormayı düşünüyodum ama nesne yoketmeyle az buçuk ilgili olduğunu düşündüm)
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
- Murat DİCLE
- Kıdemli Üye
- Mesajlar: 702
- Kayıt: 19 Nis 2006 04:12
- Konum: İstanbul
- İletişim:
bu yazdığın örnekte ;
liste'yi create etmene gerek yok.
sen şimdi liste'yi TStringList olarak create ediyorsun ve Liste yen icreate edilen StringList'i tutuyor ama ardından liste adlı tutamaca ARAMA ile gelen StringListi bağlıyorsun sonra liste.free diyerek aslında ARAMA'dan gelen StringList'i free ediyorsun. İlk başta create ettiğin StringList kaldı mı hafızada çıkart çıkartabilirsen..
Şimdi Task,Manager'daki BELLEK KULLANIMI sütünü programın o ana kadarki bellek kullanımını gösterir, programı minize edip tekrar açtığınızda resetlenir. programları test etmek için şu sütünları TaskManager'e ekleyin..
1. İŞLEMLER sekmesine geçin.
2. yukarıdaki GÖRÜNÜM menüsünden SÜTÜN SEÇ'i tıklayın.
3. Kullanıcı nesneleri, Sanal Bellek boyutu ve Tema Sayımı sütünlarını işaretleyin.
bu sütünlar size bilgi verecektir.
Kullanıcı nesneleri: program içinde create edilmiş nesne sayısını verir.
Sanal bellek: anlık olarak programın kullandığı bellek miktarını verir.
Tema sayımı (iş parçacığı): thread'ların sayısını verir.
bu üçünü eklerseniz task managere faydasını fazlasıyla görürsünüz.
kolay gelsin...
Kod: Tümünü seç
procedure TForm1.Button1Click(sender:TObject);
var
liste:tstringlist;
begin
liste:=tstringlist.create;
liste:=arama('c:\');
form1.caption:=liste.strings[0];
liste.free;
end;
sen şimdi liste'yi TStringList olarak create ediyorsun ve Liste yen icreate edilen StringList'i tutuyor ama ardından liste adlı tutamaca ARAMA ile gelen StringListi bağlıyorsun sonra liste.free diyerek aslında ARAMA'dan gelen StringList'i free ediyorsun. İlk başta create ettiğin StringList kaldı mı hafızada çıkart çıkartabilirsen..
Şimdi Task,Manager'daki BELLEK KULLANIMI sütünü programın o ana kadarki bellek kullanımını gösterir, programı minize edip tekrar açtığınızda resetlenir. programları test etmek için şu sütünları TaskManager'e ekleyin..
1. İŞLEMLER sekmesine geçin.
2. yukarıdaki GÖRÜNÜM menüsünden SÜTÜN SEÇ'i tıklayın.
3. Kullanıcı nesneleri, Sanal Bellek boyutu ve Tema Sayımı sütünlarını işaretleyin.
bu sütünlar size bilgi verecektir.
Kullanıcı nesneleri: program içinde create edilmiş nesne sayısını verir.
Sanal bellek: anlık olarak programın kullandığı bellek miktarını verir.
Tema sayımı (iş parçacığı): thread'ların sayısını verir.
bu üçünü eklerseniz task managere faydasını fazlasıyla görürsünüz.
kolay gelsin...
- huseyinkucuk
- Üye
- Mesajlar: 142
- Kayıt: 29 Nis 2005 10:03
- Konum: İstanbul
- İletişim:
:) :) :)
muratdicle abi, tek kelimeyle "hayranınım" abi, 2 kelimeyle "süpersin abi" abi
. Ayakta alkışlayacaktım ama neskafem dökülür diye kalkamıyorum. muratdicle, tuana ve poshet, çok çok teşekkür ederim... Umarım birgün sizin seviyenize ulaşırım... kolay gelsin...

29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
- Murat DİCLE
- Kıdemli Üye
- Mesajlar: 702
- Kayıt: 19 Nis 2006 04:12
- Konum: İstanbul
- İletişim: