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

标签 delphi

所以,我有一个包含几十个控件的表单,有人想要保存并稍后恢复其内容和设置 - 选择了哪个单选按钮,向上/向下的位置是什么,等等。

我还想存储在运行时添加到列表框中的所有条目。

最简单的方法是什么? DfmToString 和反向?写入/读取 .INI?还有别的吗?

最佳答案

PRUZ 的解决方案是现成的解决方案; JVCL 是开源的,并且使用 JvFormStorage 很简单。但您也可以使用Delphi自己的流机制,而不使用任何第三方组件。这是一个例子:

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 采用组件实例和文件名,并将组件以人类可读的文本形式流式传输到文件中。

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

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 获取组件实例和文件名,然后将文件内容加载到组件实例中。为了避免命名冲突,在将文件数据加载到实例之前,我们释放实例的所有现有拥有的组件。

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

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

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

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

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

LoadComponentFromFile 需要先创建实例,因此我们检查 FSecondForm 是否已分配,如果没有,我们创建它的实例(它是 TfrmSecond 类的实例),然后将文件数据加载到其中。最终,我们显示加载的表单。

关于delphi - 如何保存和恢复表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3163586/

相关文章:

delphi - Indy IMAP4 通过 SSL

xml - 从Delphi中的IXMLDOMDOCUMENT删除空的<ul>节点

delphi - 如何安排非主窗体与任务栏按钮相关联?

delphi - 可以使用 VirtualProtect 更改 Delphi 中的资源吗?

delphi - 如果 eax 包含 self,为什么它给出零?

delphi - 如何将消息发布到需要自定义消息结构的句柄?

Delphi 编译器不会对此代码发出警告

sql - 内部数据库错误:SQLDA丢失或版本不正确,或变量的数量/类型不正确

delphi - 扩展类时的抽象错误

delphi - 在德尔福插入排序算法中找不到简单的错误