Comment sauvegarder et restaurer un formulaire?
ainsi, j'ai un formulaire avec quelques douzaines de commandes et quelqu'un voudrait enregistrer et plus tard restaurer leur contenu et paramètres - quel bouton radio a été sélectionné, quelle était la Position de ce haut/bas, etc.
j'aimerais aussi stocker toutes les entrées ajoutées à une liste au moment de l'exécution.
Quelle est la façon la plus simple de le faire? DfmToString et reverse? Écrire/lire un .INI? Quelque chose d'autre?
2 réponses
la solution de PRUZ est une solution prête à l'emploi; JVCL est open-source, et l'utilisation de JvFormStorage est simple. Mais vous pouvez également utiliser Delphi propre streaming mécanisme sans l'aide des 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 component, plus un nom de fichier, et envoie le component dans le fichier, dans un texte lisible par l'humain.
pour charger le composant à partir du 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 component, et un nom de fichier, puis charge le contenu du fichier dans l'instance component. Pour éviter de nommer un conflit, nous sommes libres de tous les composants existants appartenant à l'instance, avant d'y charger des données de fichier.
vous pouvez maintenant utiliser le code ci-dessus pour sauvegarder un formulaire dans un fichier:
SaveComponentToFile(FSecondForm,ExtractFilePath(Application.ExeName)+ 'formdata.txt');
FSecondForm est une instance form, et elle sera sauvegardée dans formdata.txt " fichier à l'intérieur du même dossier que L'EXE fichier.
et de charger un second formulaire à partir de " formdata.txt" un fichier, nous écrire ceci:
if not Assigned(FSecondForm) then
FSecondForm := TfrmSecond.Create(Application);
LoadComponentFromFile(FSecondForm,ExtractFilePath(Application.ExeName)+ 'formdata.txt');
FSecondForm.Show;
LoadComponentFromFile a besoin que l'instance soit créée en premier, donc nous vérifions si FSecondForm est assignée, sinon, nous en créons une instance (c'est une instance de la classe TfrmSecond), puis nous y chargeons les données du fichier. Et finalement, nous montrons la forme chargée.
il est assez facile de lire/écrire les propriétés des composants ou des objets, ou les positions des formes dans le fichier INI ou le registre. Tout ce dont vous avez besoin existe en aide. Vous avez juste besoin de décider quand vous souhaitez lire (sur la création, avant de montrer...) et de les stocker (sur fermer ...). Cela dépend de ce que vous sauvegardez/restaurez. Si vous allez utiliser des composants prêts à l'emploi et que vous voulez enregistrer la position du formulaire, assurez-vous de vérifier comment ils traitent plusieurs moniteurs. Si vous le faites à votre manière, vous devriez prendre soin de vous-même. Par exemple, vous pourriez avoir un ordinateur portable et un grand écran de 22", et la position d'un formulaire a été enregistrée alors que votre grand écran a été utilisé. Plus tard, si vous ouvrez ce formulaire sur ordinateur portable il pourrait être affiché de l'écran de sorte que vous ne pouvez pas voir le formulaire si ce cas n'est pas manipulé correctement.