Estoy serializando y deserializando un objeto (descendiente TComponent) usando el ejemplo en la sección ComponentToString en el archivo de ayuda de Delphi. Esto es para poder almacenar el objeto en un campo VARCHAR en la base de datos.¿Puedo hacer un constructor que deserialice una versión de cadena de mi objeto?
Cuando necesito instanciar una nueva instancia de mi clase a partir de una cadena almacenada en la base de datos, ¿puedo hacer eso usando un constructor del formulario CreateFromString(AOwner: TComponent; AData: String)
? ¿O debo usar un método que no sea de clase que devuelva una instancia de mi clase de componente?
Si puedo usar la versión del constructor, ¿cómo puedo "asignar" el valor de retorno de ReadComponent al "self" que está creando el constructor?
Aquí está el ejemplo deserialización del archivo de ayuda:
function StringToComponentProc(Value: string): TComponent;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result:= BinStream.ReadComponent(nil);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;
¿Es posible que haya un pequeño error en su implementación? Creo que debería ser 'Create (nil)'; no 'heredado Create (nil);'. Con "heredado" se pierde la creación de cualquier almacenamiento de campo y las propiedades que introduce TLarryComponent. –
Tienes razón. Estaba pensando que 'ReadComponent' se ocuparía de eso, pero ahora me doy cuenta de que no hay forma de que sea posible. –
Ahora estoy trabajando perfectamente y proporcionando una solución elegante a mi problema. –