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?

15
demandé sur duplode 2010-07-02 10:12:24

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.

23
répondu vcldeveloper 2010-07-02 16:32:46

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.

2
répondu avra 2010-07-02 11:40:12