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