所以,我有一个十几个控件的表单,有人想保存,然后恢复其内容和设置 – 哪个单选按钮被选中,上/下的位置等等.
我也想在运行时存储添加到列表框中的任何条目.
最简单的做法是什么? DfmToString和反向?写/读一个.INI?还有什么?
@H_301_6@解决方法
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类的一个实例),然后将文件数据加载到它中.最后,我们显示加载的表单.
@H_301_6@ @H_301_6@