Originariamente inviato da alka
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.
Ora ho capito, pero:
non capisco perché si ottiene il riferimento all'oggetto e non il valore dell'oggetto, io non gli passo un puntatore, ma faccio una assegnazione.
Di conseguenza mi aspettavo che a formato1 venisse copiato il valore dell'oggetto risultato della funzione e non che invece venisse assegnato il riferimento all'oggetto stesso.
E' ovvio che in quest'ottica diventa superfluo creare gli oggetti formato1 e formato2..

Per ottenere il risultato da me sperato dovevo fare una cosa del genere:

codice:
  //Aggiungere una funzione assign a TFormati
  Prodecdure TFormati.assign(Var FormatoInCuiCopiare:TFormato);
  var
    i:integer;
    begin
      if FormatoInCuiCopiare<>nil then
      begin
        FormatoInCuiCopiare.nome:=nome;
	FormatoInCuiCopiare.codice:=codice;
	FormatoInCuiCopiare.codice_man:=codice_man;
	FormatoInCuiCopiare.codice_cd:=codice_cd;
	FormatoInCuiCopiare.alt:=alt;
	FormatoInCuiCopiare.larg:=larg;
	FormatoInCuiCopiare.quality:=quality;
	FormatoInCuiCopiare.rapW:=rapW;
	FormatoInCuiCopiare.rapH:=rapH;
	setLength(FormatoInCuiCopiare.codici,length(codici));
	setLength(FormatoInCuiCopiare.limiti,length(limiti));
	for i:=0 to count(codici)-1 do
          FormatoInCuiCopiare.codici[i]:=codici[i];
	for i:=0 to count(limiti)-1 do
	  FormatoInCuiCopiare.limiti[i]:=limiti[i];
			
	limiti: array of string;
	FormatoInCuiCopiare.variabile:variabile;
    end;		
  end;
A quel punto avrebbe avuto senso scrivere così:

codice:
  lista:=TlistaFormati.create('formati.ini');
  formato1:=TFormato.create;
  lista.getFormatoByName('PICCOLO').assign(formato1);
  showmessage(formato1.getnome);
  formato1.free;
  formato2:=TFormato.create;
  lista.getFormatoByName('PICCOLO').assign(formato2);
  showmessage(formato2.getnome);
  formato2.free;
ed avrei raggiunto il risultato sperato, giusto?