所以,我有一个带有几十个控件的表单,有人想要保存并稍后恢复其内容和设置 - 选择哪个单选按钮,上/下的位置是什么等等.
我还想在运行时存储添加到列表框的任何条目.
最简单的方法是什么?DfmToString和反向?写/读一个.INI?别的什么?
vcl*_*per 24
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;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
LoadComponentFromFile接受组件实例和文件名,然后将文件内容加载到组件实例中.为了避免命名冲突,在将文件数据加载到实例之前,我们释放实例的所有现有拥有组件.
现在您可以使用上面的代码将表单保存到文件中:
SaveComponentToFile(FSecondForm,ExtractFilePath(Application.ExeName)+ 'formdata.txt');
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
LoadComponentFromFile需要首先创建实例,因此我们检查是否分配了FSecondForm,如果没有,我们创建它的实例(它是TfrmSecond类的实例),然后将文件数据加载到其中.最后,我们展示了加载的表单.
| 归档时间: |
|
| 查看次数: |
11845 次 |
| 最近记录: |