delphi – 如何保存和恢复表单?

前端之家收集整理的这篇文章主要介绍了delphi – 如何保存和恢复表单?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以,我有一个十几个控件的表单,有人想保存,然后恢复其内容和设置 – 哪个单选按钮被选中,上/下的位置等等.

我也想在运行时存储添加到列表框中的任何条目.

最简单的做法是什么? DfmToString和反向?写/读一个.INI?还有什么?

@H_301_6@

解决方法

PRUZ的解决方案是一个现成的解决方案; JVCL是开源的,使用JvFormStorage很简单.但是您也可以使用Delphi自己的流式传输机制,而不使用任何第三方组件.这是一个例子:
  1. procedure SaveComponentToFile(Component: TComponent; const FileName: TFileName);
  2. var
  3. FileStream : TFileStream;
  4. MemStream : TMemoryStream;
  5. begin
  6. MemStream := nil;
  7.  
  8. if not Assigned(Component) then
  9. raise Exception.Create('Component is not assigned');
  10.  
  11. FileStream := TFileStream.Create(FileName,fmCreate);
  12. try
  13. MemStream := TMemoryStream.Create;
  14. MemStream.WriteComponent(Component);
  15. MemStream.Position := 0;
  16. ObjectBinaryToText(MemStream,FileStream);
  17. finally
  18. MemStream.Free;
  19. FileStream.Free;
  20. end;
  21. end;

SaveComponentToFile将一个组件实例加上一个文件名称,并以组件的形式将组件流入文件.

要从文件加载组件,可以使用如下代码

  1. procedure LoadComponentFromFile(Component: TComponent; const FileName: TFileName);
  2. var
  3. FileStream : TFileStream;
  4. MemStream : TMemoryStream;
  5. i: Integer;
  6. begin
  7. MemStream := nil;
  8.  
  9. if not Assigned(Component) then
  10. raise Exception.Create('Component is not assigned');
  11.  
  12. if FileExists(FileName) then
  13. begin
  14. FileStream := TFileStream.Create(FileName,fmOpenRead);
  15. try
  16. for i := Component.ComponentCount - 1 downto 0 do
  17. begin
  18. if Component.Components[i] is TControl then
  19. TControl(Component.Components[i]).Parent := nil;
  20. Component.Components[i].Free;
  21. end;
  22.  
  23. MemStream := TMemoryStream.Create;
  24. ObjectTextToBinary(FileStream,MemStream);
  25. MemStream.Position := 0;
  26. MemStream.ReadComponent(Component);
  27. Application.InsertComponent(Component);
  28. finally
  29. MemStream.Free;
  30. FileStream.Free;
  31. end;
  32. end;
  33. end;

LoadComponentFromFile将一个组件实例和一个文件名称,然后将文件内容加载到组件实例中.为了避免命名冲突,在将文件数据加载到其中之前,我们将释放实例的所有现有所有组件.

现在,您可以使用上述代码将表单保存到文件中:

  1. SaveComponentToFile(FSecondForm,ExtractFilePath(Application.ExeName)+ 'formdata.txt');

FSecondForm是一个表单实例,它将被保存到与EXE文件相同的文件夹中的“formdata.txt”文件中.

并从“formdata.txt”文件加载FSecondForm,我们写这个:

  1. if not Assigned(FSecondForm) then
  2. FSecondForm := TfrmSecond.Create(Application);
  3. LoadComponentFromFile(FSecondForm,ExtractFilePath(Application.ExeName)+ 'formdata.txt');
  4. FSecondForm.Show;

LoadComponentFromFile需要首先创建实例,所以我们检查是否分配了FSecondForm,如果不是,我们创建一个实例(它是TfrmSecond类的一个实例),然后将文件数据加载到它中.最后,我们显示加载的表单.

@H_301_6@ @H_301_6@

猜你在找的Delphi相关文章