questa è la procedura che utilizzo per la generazione di una pagina web.
I dati relativi alla pagina sono nel database (mysql, TmyQuery è una classe che agisce direttamente sulle API), la struttura è invece nelle classi.
Il costruttore organizza la struttura, la procedura Free inserisce codici di finalizzazione.
Le procedure Free sono chiamate a scendere attraverso la chiamata ad inherited fino al progenitore che è TStringList.
La chiamata a Free di TStringList, come classe vcl, chiama alla fine della catena Destroy, che essendo virtuale è il Destroy dell'oggetto creato (nel mio caso della classe TLAY3_ECOM) che non ho bisogno di chiamare direttamente appunto perchè virtuale, e poi a scendere disciplinatamente attraverso le classi genitrici.

codice:
procedure genera_pagina_new (dominio, pagina : string);
var
  tipo : string;
begin

  with TmyQuery.Create do
  begin

       SQL.Add('select tipo from PagineSito');
       SQL.Add('where dominio="' + dominio + '"');
       SQL.Add('and pagina="' + pagina + '"');

       Open;

       // tipo pagina web: html, php
       if not (Eof and Bof) then
         tipo := FieldByName('tipo')
       else tipo := 'html';

       Free;

  end;

  with TLAY3_ECOM.Create (dominio, pagina, '/' + pagina + '.' + tipo) do Free;

end;
Il tutto mi funzione perfettamente con l'accortezza sempre di inserire inherited alla fine di ciascuna procedura Free, altrimenti la catena si interrompe.

Una osservazione, questo codice è Free Pascal e lo utilizzo su Lazarus, non so se il comportamente in Delphi possa essere differente, ma non penso.

Il fatto che ho utilizzato la procedura Free (che comunque nella classe base vcl chiama Destroy) e perchè ho qui inserito del codice di finalizzazione, mentre il codice relativo alla distruzione di eventuali oggetti creati all'interno della classe ho cercato di inserirlo in Destroy.

ti ringrazio della opportunità che hai colto di chiarimento di un argomento di logica base che non è sempre facile aver l'ocasione di poter discutere

ciao
sergio