Ora ho capito, pero:Originariamente inviato da alka
Concentriamoci su questo punto:
Innanzitutto, ci sono delle chiamate a TFormato.Create che non servono a nulla, perché la variabile viene riassegnata subito dopo usando la getFormatoByName.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;
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.
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:
A quel punto avrebbe avuto senso scrivere così: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;
ed avrei raggiunto il risultato sperato, giusto?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;