Delphi会视需要保存组件的属性值到DFM文件中,对于published属性和非published属性将区别对待。
一、published属性
必须设置有 read 和 write 的属性才出现在属性编辑面板中,也才会保存。
Delphi会根据stored来判断是否需要保存属性的值,stored默认为True,如果为False则不保存。
property Caption: TCaption read FCaption write FCaption; //默认为True,保存
property State: TState read FState write FState stored False; //设置stored为False,不会保存
property Text: String read FText write FText stored IsTextStored; //根据IsTextStored返回的值决定是否保存
Delphi会自动保存以下类型属性的值
简单类型 (Integer、String等)
枚举类型 (TMyData = (DATA1, DATA2)
简单类型或枚举类型的 SET (TMyDatas = set of TMyData)
Delphi 已经定义的类 (property Label: TLabel read FLabel write SetLabel;)
property Width: Integer read FWidth write FWidth;
如果是record(结构),数组(array),则需要自己保存,保存方法与非published属性的保存方法相同。
如果是自定义的类,分两种情况
继承自TPersistent的类
会做为子组件保存在DFM文件中,类似:MyData.Text = 'aaa',存储的限制和组件的要求一样,不同的仅仅是它作为组件的子组件保存。
继承自TComponent的类
需要声明为子组件,使用SetSubComponent(True)进行声明,可以在创建属性对像后声明,也可以在子组件类的Create方法中。
constructor TMyData.Create(AOwner: TComponent);
inherited;
SetSubComponent(True);
end;
或者是
MyData := TMyData.Create(Self);
MyData.SetSubComponent(True);
二、非published属性
Delphi不会自动保存非published属性的值到DFM文件,为了保存这些属性,需要重写TPersistent的DefineProperties过程
procedure DefineProperties(Filer: TFiler); override;
TMyStruct.DefineProperties(Filer: TFiler);
begin
inherited;
Filer.DefineProperty('Str', ReadMyStr, WriteMyStr, FStr <> '');
end;
使用Filer.DefineProperty过程定义需要保存的属性,它需要四个参数,第一个是参数名,并不一定要与实际在组件中使用的属性名相同,第二个是一个Read过程,第二个是Write过程,最后一个是一个Boolean值或是返回Boolean的方法,实际使用时根据这个判断是否需要保存,与stored的功能相同。
Read过程与Write过程的格式如下
TReaderProc = procedure(Reader: TReader) of object;
TWriterProc = procedure(Writer: TWriter) of object;
可以在DefineProperties中定义多个需要保存的属性。]