Newsgroup: it.comp.lang.delphi
Titolo: Dispose di tipi record che contengono altri tipi record

Ho un tipo record che esprime un intervallo tra due date/ore:
	type
	  TDateTimeRange = record
	    Low: TDateTime;
	    High: TDateTime;
	  end;
    PDateTimeRange = ^TDateTimeRange;
e un tipo record che esprime un viaggio:
	type
	  TViaggio = record
	    dtrDalleAlle: TDateTimeRange;
	    sLocPartenza, sLocArrivo: string;
	  end;
    PViaggio = ^TViaggio;
con una funzione che crea e inizializza un nuovo viaggio:
	function ViaggioFactory: PViaggio;
	begin
	  New(Result);
	  with Result^ do
	  begin
	    dtrDalleAlle.Low:= 0;
	    dtrDalleAlle.High:= 0;
	    sLocPartenza:= '';
	    sLocArrivo:= '';
	  end
	end;
Poi ho una lista type-safe destinata a contenere oggetti di classe 
TViaggio 
(di cui riporto solo le parti essenziali, della sezione interface):
  TViaggiList = class
  private
    FList: TList;
    function GetItems(Index: Integer): TViaggio;
    procedure SetItems(Index: Integer; const Value: TViaggio);
  public
    constructor Create;
    destructor Destroy; override;
  { crea un nuovo viaggio, lo aggiunge alla lista e ne restituisce 
l'indice }
    function Add: Integer;
  { crea un nuovo viaggio e lo inserisce nella lista nel posto Index }
    procedure Insert(Index: Integer);
  { cancella l'elemento di posto Index e ne libera la memoria }
    procedure Delete(Index: Integer);
  { elimina tutti gli elementi della lista e ne libera la memoria per 
ciascuno }
    procedure Clear;
    property Items[Index: Integer]: TViaggio read GetItems write SetItems; 
default;
  end;
Il punto č che non sono affatto sicuro del modo in cui creo e libero la 
memoria delle variabili di tipo record, e se lascio dei memory leaks.
Per esempio nel metodo Add ho pensato di scrivere questo:
      function TViaggiList.Add: Integer;
	begin
	  Result:= FList.Add(ViaggioFactory);
	end;
e per esempio nel Clear ho scritto questo:
	procedure TViaggiList.Clear;
	var
	  i: Integer;
	begin
	  for i:= 0 to Pred(GetCount) do
	    Dispose(PViaggio(FList[i]));
	  FList.Clear;
	end;
Il mio dubbio č se il fatto di eseguire la Dispose(PViaggio...) sia o meno 
sufficiente a liberare la memoria occupata da TViaggio.dtrDalleAlle (che č 
una variabile di tipo TDateTimeRange, quindi di tipo record).
O non dovrei forse invocare Dispose anche per TViaggio.dtrDalleAlle?
P.S. ho provato nei modi piů improbabili (ma tutti mi sollevano 
eccezioni), 
fino a:
procedure TViaggiList.Clear;
var
  i: Integer;
  pv: PViaggio;
  dtr: TDateTimeRange;
  pdtr: PDateTimeRange;
begin
  for i:= 0 to Pred(GetCount) do
  begin
    pv:= PViaggio(FList[i]);
    dtr:= pv.dtrDalleAlle;
    pdtr:= @dtr;
    Dispose(pdtr);
    Dispose(pv);
  end;
  FList.Clear;
end;
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

    PViaggio = ^TViaggio;
[SNIPPONE]
Dal momento in cui tu usi TDateTimeRange e NON PDateTime Range non
devi fare alcun dispose in quanto la variabile è statica (tra l'altro
la dichiarazione del puntatore PDateTimeRange è inutile)..
Ciao.
-- 
"La velocità luce non è sufficiente Comandante Nunziatella, 
dobbiamo passare alla velocità smodata!"

 Ho un tipo record che esprime un intervallo tra due date/ore:
<snip>
Snippo su tutto perché ti hanno già risposto, ma ti chiedo per curiosità:
perché non erediti da TCollection ?!
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 perché non erediti da TCollection ?!
in effetti, non lo so perchè non ho ereditato da TCollection :-)
Forse perchè inizialmente pensavo a una lista di puntatori, quindi mi è 
venuto spontaneo usare TList.
