Cita:
Empezado por Crandel
Tu codigo tiene muchos errores por varios lados.
Para eliminar varios al mismo tiempo te aconsejo utilizar la clase TList en vez de array dinámico.
|
Hola Crandel. Ya decia en mi primer mensaje que ya está funcionando correctamente usando una Lista (concretamente un TObjectList).
Agradecería, no obstante, saber cuales son esos errores.
Cita:
Empezado por Crandel
Por otro lado al asignar los elementos tienes:
Código Delphi [-]
Value := TColumnaDict.Create;
try
AnadeValores(Value, 'uno', 'el uno', false);
AnadeValores(Value, 'dos', 'el dos', true);
FColMant.AddColumna(Value);
finally
Value.Free;
end;
aca lo que estas haciendo es crear el objeto TColumnaDict asignarle valores y agregarlo a FColMant, hasta aca todo bien, pero luego lo destruyes !!!
|
Olvidas un paso:
FColMant.AddColumna(Value);
Este paso,
copia la Colección a la nueva colección que se crea internamente, dentro de la clase.
Cita:
Empezado por Crandel
Tienes que entender que Delphi al pasar objetos como parametros no crea una nueva instacia (copia) de ellos, sino solamente pasa el puntero, por lo que el objeto sigue siendo el mismo, asi que al destruirlo, destruiste el objeto que pasaste.
Donde obtienes el error es porque intentas de volver a destruir el objeto ya destruido
|
Gracias Crandel, creo que entiendo minimamente la forma de trabajo de Delphi y su paso de objetos.
Pero debo insistir, el "truco" de esta clase está en:
Código Delphi
[-] if Value = nil then
FColumnas[result] := TColumnaDict.Create
else
FColumnas[result] := TColumnaDict.Create(Value);
Donde la segunda forma de crear el objeto TColumnaDict, realiza una
copia del objeto Value.
Si fuese de otro modo, en el test, el método:
Código Delphi
[-]
TestValueAddedByTestAddColumna0
No funcionaría. Y si habeís pasado el test, todos ellos funcionan con normalidad (y he comprobado que sin ningún Memory Leak), excepto el método del TestCase:
y por tanto, el método de la clase:
Código Delphi
[-] function DelColumna(index: Byte): Boolean;
Gracias por la respuesta..
Un saludo.