La solution de PRUZ est une solution prête à l'emploi, JVCL est open-source et JvFormStorage est simple, mais vous pouvez également utiliser le mécanisme de streaming de Delphi sans utiliser de composants tiers. Voici un exemple:.
procedure SaveComponentToFile(Component: TComponent; const FileName: TFileName);
var
FileStream : TFileStream;
MemStream : TMemoryStream;
begin
MemStream := nil;
if not Assigned(Component) then
raise Exception.Create('Component is not assigned');
FileStream := TFileStream.Create(FileName,fmCreate);
try
MemStream := TMemoryStream.Create;
MemStream.WriteComponent(Component);
MemStream.Position := 0;
ObjectBinaryToText(MemStream, FileStream);
finally
MemStream.Free;
FileStream.Free;
end;
end;
SaveComponentToFile prend une instance de composant, plus un nom de fichier, et les flux du composant dans le fichier, dans un texte lisible par l'homme
Pour charger le composant de fichier, vous pouvez utiliser un code comme ceci:
procedure LoadComponentFromFile(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');
if FileExists(FileName) then
begin
FileStream := TFileStream.Create(FileName,fmOpenRead);
try
for i := Component.ComponentCount - 1 downto 0 do
begin
if Component.Components[i] is TControl then
TControl(Component.Components[i]).Parent := nil;
Component.Components[i].Free;
end;
MemStream := TMemoryStream.Create;
ObjectTextToBinary(FileStream, MemStream);
MemStream.Position := 0;
MemStream.ReadComponent(Component);
Application.InsertComponent(Component);
finally
MemStream.Free;
FileStream.Free;
end;
end;
end;
LoadComponentFromFile prend une instance de composant, et un nom de fichier, charge ensuite le contenu du fichier dans l'instance du composant. Pour éviter les conflits de noms, nous libérons tous les composants appartenant à l'instance, avant de charger les données du fichier.
Maintenant, vous pouvez utiliser le code ci-dessus pour enregistrer un formulaire dans un fichier:
SaveComponentToFile(FSecondForm,ExtractFilePath(Application.ExeName)+ 'formdata.txt');
FSecondForm est une instance de forme, et il sera enregistré dans le fichier « formdata.txt » dans le même dossier que le Fichier EXE.
Et pour charger FSecondForm du fichier « formdata.txt », nous écrivons ceci:
if not Assigned(FSecondForm) then
FSecondForm := TfrmSecond.Create(Application);
LoadComponentFromFile(FSecondForm,ExtractFilePath(Application.ExeName)+ 'formdata.txt');
FSecondForm.Show;
LoadComponentFromFile a besoin de l'instance à créer d'abord, donc, nous vérifions si FSecondForm est attribué, sinon, nous créons une instance de celui-ci (c'est une instance de classe TfrmSecond), puis charger des données de fichier dans celui-ci. Et finalement, nous montrons le formulaire chargé.
Merci, ça a l'air bien. Maintenant, je vais juste l'emballer dans une boucle et le rendre récursif et je suis prêt à partir. – Mawg
Pourquoi mettre Parent à zéro avant de libérer un composant enfant? Au lieu de la boucle for entière, 'Component.DestroyComponents' ne ferait-il pas aussi bien l'affaire? – NGLN
Pourquoi 'LoadComponentFromFile()' ajoute-t-il '' Component' à la liste des composants possédés par 'Application'? Cela ne devrait pas être du tout le cas. –