Aquí tengo una situación complicada, supongo. Necesito poder liberar un objeto que es un campo de un registro. Normalmente escribiría el código de limpieza en el destructor, si fuera una clase. Pero como los tipos de registro no pueden introducir un "destructor", ¿cómo sería posible llamar al TObject (campo) .Free;?¿Cómo liberar un objeto que está en un registro?
Habrá dos tipos de uso: Predigo
Sustitución del registro con una nueva.
Creo que este uso sería fácil de implementar. Dado que los registros son tipos de valores y, por lo tanto, se copian en la asignación, puedo sobrecargar el operador de asignación y liberar los objetos que pertenecen al registro anterior.
(Editar: sobrecarga asignación no fue capaz Esa es una información nueva para mi ...)
Al salir del ámbito donde variable de registro definido.
Puedo pensar en un método privado que libera los objetos y este método podría ser invocado en la excitación de alcance manualmente. PERO, aquí está la misma pregunta: ¿Cómo hacer que sea más sin precedentes? Este comportamiento tipo de se siente como una clase ...
Este es un ejemplo (y obviamente no el uso previsto):
TProperties = record
... some other spesific typed fields: Integers, pointers etc..
FBaseData: Pointer;
FAdditionalData: TList<Pointer>;
//FAdditionalData: array of Pointer; this was the first intended definition
end;
Supongamos,
FAdditionalData:=TList<Pointer>.Crete;
llama en el constructor de registros o manualmente en el alcance de la variable de registro accediendo públicamente al campo como
procedure TFormX.ButtonXClick(Sender: TObject);
var
rec: TProperties;
begin
//rec:=TProperties.Create(with some parameters);
rec.FAdditionalData:=TList<Pointer>.Create;
//do some work with rec
end;
Después de salir del ámbito ButtonClick la rec ya no existe más que un TList aún conserva su existencia lo que provoca pérdidas de memoria a ...
La asignación de registros no se puede sobrecargar. – kludg
No estaba al tanto de eso (nunca antes lo había necesitado), pero lo he aprendido ahora :) Sí, no pudo ser sobrecargado ... –