TStrings veri tipi hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

TStrings veri tipi hakkında

Mesaj gönderen Lost Soul »

Selamun Aleyküm.
Aslında uzun zamandır bu soru aklımda ama şimdiye sormaya zahmet ettim :).

bilindiği üzre TStrings veri tipi end of line seperatorleri ile ayrılmış string tipindeki veriler bütünü.
Ve kullanmadan önce Create metodu ile oluşturulması gerekiyor. Ve bellekten tasarruf için sonradan destroy edilmeli.

Şimdi; Tstrings tipinden değer döndüren bir fonksiyon oluşturduğumuzda veriyi döndürebilmek için.
Fonksiyon içinde ya da global olarak ana programda bir TStrings nesnesi oluşturmamız gerekiyor Aksi taktirde program hata verir.
Sonuc : TStrings tipi bir değişken olsun
Fonksiyon içinde oluşturduğumuz zaman result:=Sonuc
dedikten sonra veya demeden önce fonksiyon içinde sonuç değişkenini destroy etmemiz mümkün değil. Deerseniz gene hata vereceğini görürsünüz.

Bunu gözardı edip destroy işlemini yapmadık diyelim. O zaman otomatik destroy yoksa ve fonksiyon çok fazla kullanılan bir fonnksiyonsa ve her seferinde büyük değerler barındırıyorsa işimiz var demektir. O zaman Tstrings veri tipini program başlangıcında oluşturup program bitene kadar bir global değişkeni kullanmak çözüm olabilir (Dediğim gibi eğer fonksiyon bitiminde otomatik destroy yok ise)
Ama programınızda birden fazla hatta çok fazla TStrings ile işlem yapıp yine TStrings tipinde değer döndüren fonksiyonlar var ise global değişken tanımlamak kodun okunabilirliği ve programın sağlıklı çalışması için pek akıllıca bir çözüm olmayacaktır.
Fonksiyon bitiminde nesnenin otomatik destroy edildiğini düşünmüyorum çünkü sonuçta bu döndürülen değeri, fonksiyonu çağıran program bloğu da kullanıyor.
Sorum şu :
Fonksiyon içinde kullanlan TStrings nesnesi işi bittiğinde otomatik destroy ediliyor mu?.
edilmiyorsa işimiz bitiğinde fonksiyon içinde tanımlanan TStrings nesnesinin kullandığı belleği nasıl iade edebiliriz. Yani nasıl destoy edebiliriz.

Kolay gelsin.
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: TStrings veri tipi hakkında

Mesaj gönderen Battosai »

Function veya procedure farketmez oluşturulmuş bir nesne free edilmezse hafızada kalır...Delphi programcılığı açısından şuan için böyle yapmak lazım ama mesela java da böyle bir sorun yok java hafızayı kendisi bi güzel temziliyor...neyse konu bu değil....Ayırca global değişken kullanmak şaçma değil gerekli birşeydir çoğu zaman...
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: TStrings veri tipi hakkında

Mesaj gönderen Lost Soul »

Global değişkenin sıkıntı olabileceği durumları belirtmiştim.
Global değişken kullanım seçeneğini de belirtmiş. Yani bu şekilde yapılabilir demiştim zaten.

Sorumun devamında belirttiğim şekilde olabilecek yol hakkında bilgisi olan varsa paylaşabilir mi lütfen.
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: TStrings veri tipi hakkında

Mesaj gönderen emin_as »

Aşagıdaki kod bir procedure içinde en basit yoldur.
Global bir Tstrings tanımlayıp, o şekilde de kullanabilirsin. Bu durumda free etmeden önce assigned ile kontrol etmelisin.
Global Tstrings create edilmedigi sürece sadece referans degerini tutar ve bu nedenle hafızada yer tutmaz.

Kod: Tümünü seç

function TForm1.StrListesiGetir: TStrings;
begin
  result:=TStrings.Create;
end;

procedure TForm1.BirProcedure;
var
  str1 : TStrings;
begin
   try
     str1:=Strlistegetir;
     ...
   // str1 ile ilgili işlemleri yap
   finally
      str1.Free;
   end;
end; 
Global Degisken örnegi

Kod: Tümünü seç

var
  strliste  : Tstrings;
function TForm1.StrListesiGetir: TStrings;
begin
  result:=TStrings.Create;
end;

procedure TForm1.BirProcedure;
begin
    strliste:=Strlistegetir;
     ...
end;;

procedure TForm1.DigerProcedure;
begin
     ....
   if assigned(strliste)  then
      FreeAndNil(strliste);
end; 
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: TStrings veri tipi hakkında

Mesaj gönderen Lost Soul »

Evet. meşşakatli ama mantıklı bir çözüm. Teşekkürler.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: TStrings veri tipi hakkında

Mesaj gönderen sabanakman »

TStrings bir sınıftır. Üstelik şablon sınıf. Yani kendisi hiç bir işe yaramaz ama bundan türeyecek diğer sınıflar için temel özellik ve metotları barındırır. Mesela TStringList sınıfı TStrings sınıfından türer. Burada parametrede aslolan adres bilgisinin gitmesidir. Mesela

Kod: Tümünü seç

procedure ListeDoldur(const Lst:TStrings);
var i:Integer;
begin
  Lst.Clear;
  for i:=1 to 10 do Lst.Add(IntToStr(i));
end;
....
var Liste:TStrings;
begin
  Liste:=TStringList.Create;
  try
    ListeDoldur(Liste);
  finally
    Liste.Free;
  end;
end;
gibi bir kod yapısı aslında Liste isimli bir nesne kodlarla oluşturulur ama ListeDoldur prosedürü ise o oluşan nesneyi kullanır. İçerideki değişken isminin Lst olmasının önemi yoktur. Sonuçta Liste isimli nesneyi direk bellek adresinden kullanmaktadır. Mesela ADOConnection ile bağlandığımız bir veritabanındaki tablo isimlerini bir listbox içine okumak için ADOConnection1.GetTableNames(ListBox1.Items); gibi bir kod kullanılmaktadır. Burada hiç bir şey oluşturulmaz ve yok edilmez. Çünkü ListBox1.Items zaten vardır ve bunu yok etmek çok sakıncalı bir sonuç doğuracaktır. Bu metodun tek yaptığı listeyi boşaltıp, tablo isimlerini listeye eklemektir o kadar. Bu bilgiyi de dikkate almanı öneririm.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla