所以,我有一个包含几十个控件的表单,有人想要保存并稍后恢复其内容和设置 - 选择了哪个单选按钮,向上/向下的位置是什么,等等。
我还想存储在运行时添加到列表框中的所有条目。
最简单的方法是什么? 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/