fnksiynun icinde nesne.free yapnca result:=nesne olmuyor...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

fnksiynun icinde nesne.free yapnca result:=nesne olmuyor...

Mesaj gönderen huseyinkucuk »

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...
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

Array'ları bir birine atayınca pointerları atıyor. String listlerde de benzer bir problem olması muhetemeldir. Bu hatadan kurtulmak için döbgü yardımıyla result'a atmayı dene.
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Re: fnksiynun icinde nesne.free yapnca result:=nesne olmuyor

Mesaj gönderen tuanna »

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...
Evet bu tür function kullanımı tamamen hatalı...(Bende Yapmıştım... :D )

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

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)) :lol:
Siz hayal edin...Biz yapalım TuannaSoft...
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

Teşekkürler...

Mesaj gönderen huseyinkucuk »

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.
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

ben bu functionu söle yazarım....

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;
kullanımı ise

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...
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

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.

Kod: Tümünü seç

fonksiyon Arama:TStringList; 
var 
   liste:TStringList; 
begin 
   liste:=TStringList.Create; 
   result:=liste; 
   liste.free; 
end; 
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;

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; 
işte şimdi sana doğru sonuç dönecektir. Ve sen bu dönen değeri nerde kullanacaksan orada FREE etmelisin..

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;
Şunu bilmek istiyorum, aslında yapmak istediğin bir StringList içinden arama mı yapmaktı?

kolay gelsin..
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

muratdicle 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.

Kod: Tümünü seç

fonksiyon Arama:TStringList; 
var 
   liste:TStringList; 
begin 
   liste:=TStringList.Create; 
   result:=liste; 
   liste.free; 
end; 
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;

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; 
işte şimdi sana doğru sonuç dönecektir. Ve sen bu dönen değeri nerde kullanacaksan orada FREE etmelisin..

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;
Şunu bilmek istiyorum, aslında yapmak istediğin bir StringList içinden arama mı yapmaktı?

kolay gelsin..
Yiğitler yoğurdu farklı yer ... eee bacılarımızda farklı ayran yapar (sulandırmayayım neyse :o )...

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 :o )

bunu da arşivime ekleyeyim...
Siz hayal edin...Biz yapalım TuannaSoft...
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

Merhaba;

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; 
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;

Kod: Tümünü seç

Function  Arama(var yuklenecekliste:TStringList):boolean; 
begin 
...
 yuklenecekliste:=Nil;//Burda nesne işaretcisini NIL e ayarlayabilirim
...
end; 
Ve böylelikle TStringList nesnenize işaret eden bir işaretçi yok oldu. Ona artık erişemezsiniz ve yok edemezsiniz.

Kolay gelsin.
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

poshet303 yazdı:Merhaba;

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; 
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;

Kod: Tümünü seç

Function  Arama(var yuklenecekliste:TStringList):boolean; 
begin 
...
 yuklenecekliste:=Nil;//Burda nesne işaretcisini NIL e ayarlayabilirim
...
end; 
Ve böylelikle TStringList nesnenize işaret eden bir işaretçi yok oldu. Ona artık erişemezsiniz ve yok edemezsiniz.

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; 
yuklenecekliste:=Nil;//Burda nesne işaretcisini NIL e ayarlayabilirim bunu
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; 
Bu arada hata nasıl olacak ...
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... :o
Siz hayal edin...Biz yapalım TuannaSoft...
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

tekrar teşekkür

Mesaj gönderen huseyinkucuk »

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...
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

Kodu tekrar kontrol edince nerde hata yaptığımı anladım aslında ama ...bu şekild ekullandığım zamanlarda hata almadım...artı ram sorunu olmadı yani ne kadar tanımladı isem o kadar kullanıldı...
Siz hayal edin...Biz yapalım TuannaSoft...
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

programımın hafızada kapladığı alan

Mesaj gönderen huseyinkucuk »

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.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

bu yazdığın örnekte ;

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; 
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...
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

:) :) :)

Mesaj gönderen huseyinkucuk »

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.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

hahaha

harika olan sensin ya.... :lol:
Cevapla