Concentriamoci su questo punto:
codice:
lista:=TlistaFormati.create('formati.ini');
formato1:=TFormato.create;
formato1:=lista.getFormatoByName('PICCOLO');
showmessage(formato1.getnome);
formato1.free;
formato2:=TFormato.create;
formato2:=lista.getFormatoByName('PICCOLO');
showmessage(formato2.getnome);
formato2.free;
Innanzitutto, ci sono delle chiamate a TFormato.Create che non servono a nulla, perché la variabile viene riassegnata subito dopo usando la getFormatoByName.
Poi, chiamando la getFormatoByName, si ottiene il riferimento a un oggetto che viene memorizzato in "formato1", di cui si fa la Free; pertanto, quell'oggetto viene distrutto, e il riferimento contenuto in "formato1" non sarà più valido.
Successivamente, sempre tramite la getFormatoByName, si ottiene lo stesso formato (PICCOLO) che non esisterà più perché distrutto poco prima.