property 限定符

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中定义多个需要保存的属性。]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值