PDA

Ver la Versión Completa : Guardar componentes del formulario a un archivo


mak8888
14-01-2019, 07:48:19
Buenos días. Tengo una utilidad en la cual el usuario inserta dinámicamente objetos dentro de un Panel.
El problema radica en que me gustaría que pueda guardar la distribución de componentes inserta (y posicionada en el panel) a un archivo, de cara a poder restaurarlos posteriormente.
Aquí (https://stackoverflow.com/questions/3163586/how-to-save-and-restore-a-form) he visto un ejemplo en el que guardan un componente y posteriormente lo cargan, lo cual se aproxima mucho a lo que yo quiero.
Tengo dos problemas.
1. He intentado modificar la función de guardado para que guarde todos los componentes del Panel, pero solo guarda el último. Imagino que será por el "Memstrem.position := 0;", pero no sé porqué habría que cambiarlo.
procedure SaveComponentToFile(Component: TComponent; const FileName: TFileName);
var
FileStream : TFileStream;
MemStream : TMemoryStream;
i : integer;
begin
MemStream := nil;

if not Assigned(Component) then
raise Exception.Create('Component is not assigned');

FileStream := TFileStream.Create(FileName,fmCreate);
try
MemStream := TMemoryStream.Create;
for I := Form1.Panel1.ControlCount - 1 downto 0 do
MemStream.WriteComponent(Form1.Panel1.Controls[I]);
MemStream.Position := 0;
ObjectBinaryToText(MemStream, FileStream);
finally
MemStream.Free;
FileStream.Free;
end;
end;

2. Al cargar el archivo de texto con el componente, por medio de la función LoadComponentFromFile, me da un error diciendo "property glyph data does not exists". Es decir, no consigue cargar el glyph del TBitBtn que previamente insertó el usuario y que se veía perfectamente cuando lo insertó.
Os muestro el código que guarda la función "SaveComponentToFile" y que posteriormente no es capaz de cargar la función "LoadComponentFromFile".

object M1: TBitBtn
Left = 20
Top = 10
Width = 79
Height = 41
Caption = 'M1'
Glyph.Data = {
360C0000424D360C000000000000360000002800000020000000200000000100 ......

¿Se os ocurre cómo solucionarlo?
Gracias de antemano a todos.
Un saludo.

mak8888
15-01-2019, 13:15:54
Al final lo solucioné gracias al código de esta publicación (https://www.swissdelphicenter.ch/en/showcode.php?id=2436).
Gracias a todos.

Casimiro Notevi
15-01-2019, 19:52:00
Los componentes RXlib también tienen opción para hacerlo, aunque ya lo has resuelto con el que indicas.

mak8888
16-01-2019, 15:26:13
Gracias Casimiro.
Un saludo.