[ srki @ 21.02.2006. 03:51 ] @
U TList imam property da podesim da li lista posedje objekte ali nisam video tako nesto u TStringList. Ako u funkciji definisem promenjivu tipa TStringList i ako se u toj funkciji desi exception, sta ce da se desi sa stringovima iz TStringList? Da li ce destruktor od TStringList probati da pocisti stringove koji nisu referencirani od nekog drugog objekta?

[Ovu poruku je menjao srki dana 21.02.2006. u 09:47 GMT+1]
[ morlic @ 21.02.2006. 08:45 ] @
Negde moras da uradis Free te string liste jer se to ne radi automatski, i to je najbolje u try..finally varijanti, na primer:

Code:

Sl:= TStringList.Create;
try
  // Nesto se radi sa listom
finally
  Sl.Free;
end;


Posebno resenje trazi varijanta u kojoj string listu ne koristis samo unutar jednog metoda, vec je koristis na nivou forme, data modul-a i sl. Onda radis Free u OnDestroy te forme ili DM-a. Naravno, obavezno proveravaj da li je objekat liste uposte napravljen:

Code:

OnCreate:
   Sl:= nil;
   Sl:= TStringList.Create;

....

OnDestroy:
  if Assigned(Sl) then
     FreeAndNil(Sl); // ili Sl.Free;













[ srki @ 21.02.2006. 08:57 ] @
Citat:
morlic: Negde moras da uradis Free te string liste jer se to ne radi automatski.

Ne mogu da verujem da nisu stavili da to moze da se podesava kao u TList. Hvala u svakom slucaju.
[ nikola.j @ 21.02.2006. 09:47 ] @
>

Mozda ti ovo pomogne

http://bdn.borland.com/article/0,1410,33423,00.html
[ srki @ 21.02.2006. 10:41 ] @
To mi treba! Nazalost ne radi mi u ovom slucaju jer koristim neke properties od TStringList kojih nema ovde ali makar mogu ovo da iskoristim na nekim drugim mestima. Resenje sa try finaly mi nije dobro jer u mom slucaju meni funkcija vraca TStringList pa onda moram da stavljam try finaly ne samo u funkciji vec na svakom mestu gde pozivam tu funkciju i radim nesto sa povratnim rezultatom a ne mogu da ocekujem od drugih da ce uvek to da postuju kada pozivaju moju funkciju. Nista, izgleda da cu morati da doradim ovaj TStringListRecord i ubacim te properties koji mi trebaju: Duplicates, Sorted...

Dugo nisam radio sa Delphijem pa sam zaboravio da se destruktori ne pozivaju automatski za razliku od C++ jezika.

Hvala vam obojici.

[Ovu poruku je menjao srki dana 21.02.2006. u 14:25 GMT+1]
[ bondja @ 21.02.2006. 14:12 ] @
Pa mozes da koristis TStringList, ako stavis da ti fja vraca preko interfejs promenljive.... onda ce ona sama da se oslobodi kada vise ne bude potrebe za njom.... :) tako da i ako neko zaboravi u kodu da je oslobodi......

poz.

[ srki @ 21.02.2006. 14:37 ] @
E super, nisam se setio toga. Probacu da koristim interfejse. Ja sam inace pre ovoga programirao u C++-u a tamo nema interfejsa pa se nisam navikao. Sada sam video da interfejsi imaju reference counter pa na kraju pozovu destruktor kada ne postoje vise interfejsi ka tom objektu. Hvala svima na idejama, mislim da cu sve negde primenjivati...
[ morlic @ 21.02.2006. 21:47 ] @
HE, he, pa ja sam tek sada shvatio sta tebi treba :)
[ srki @ 22.02.2006. 02:15 ] @
Nasao sam jednu zaista dobru stranicu, savetujem svima da pogledaju:
http://www.wehlou.com/Code/d6_items.htm

Citat:

I’m really and truly grieving that Delphi doesn’t allow objects on the stack and the automatic destructors. It’s a tragedy. The only thing that can, sometimes, replace it is the destruction of reference counted objects as they go out of scope. In other words, if you do the following, the object is exception safe and destroys itself as the procedure exits, even if it goes feet first:

Code:
type
  IMyObj = interface
  end;
  
  TMyObj = class(TInterfacedObject, IMyObj)
  end;

procedure MyProc;
var
  myobj : IMyObj;
begin
  myobj := TMyObj.Create;
  .. dadada
  .. dididi
  .. dododo
end;  <= here myobj will go out of scope and the object be freed