属性问题 ( 积分: 50 )

  • 主题发起人 主题发起人 liuchong
  • 开始时间 开始时间
L

liuchong

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TMyDate=class
private
FDate:Byte;
procedure SetDate(ADate:Byte);
public
property Date:Byte read FDate write SetDate default 12;
end;

{ TMyDate }

procedure TMyDate.SetDate(ADate: Byte);
begin
if ADate in [1..31] then
Self.FDate:=ADate;
end;

为什么default值没有保存下来啊?

procedure TForm1.btn1Click(Sender: TObject);
var
C1:TMyDate;
begin
C1:=TMyDate.Create;
try
//C1.Date:=10;
Caption:=IntToStr(C1.Date);
finally
FreeAndNil(C1);
end;
 
default关键字不是给属性默认值的意思.
给属性默认值,你要在构造函数里面给.
 
default是什么意思呢?
 
是写入窗体.dfm文件的意思
 
stored和default/nodefault统称为属性的存储指令(Storage specifiers)。它们只是影响属性值保存到dfm文件的方式以及运行时类型信息的生成和维护,不影响对象的运行过程。因此,它们只对published域的属性起作用。

存储指令主要是用在组件开发中。我们考虑下面一种情况。

已经开发了一个组件,并且在某些项目中已经使用了它:



TOneComponent = class(TComponent)

private

FB: Boolean;

public

constructor Create(AOwner: TComponent)
override;

published

property B: Boolean read FB write FB;

end;



implementation



constructor TOneComponent.Create(AOwner: TComponent);

begin

inherited;

FB := False
{属性B的默认值设为False}

end




如果项目中使用的组件TOneComponent的属性B默认值没有被改变,那么dfm文件中存储B = False。

有一天,我发现TOneComponent的属性B默认值设置为True会好一些,并希望打开已经开发的项目时,TOneComponent的属性B默认值也能自动变为True。这时候问题就来了,因为dfm文件已经存储B = False,所以TOneComponent的属性B不可能自动变为新的默认值True。这该怎么办呢?

利用存储指令可以解决这个问题。那就是首次开发TOneComponent时,就将B用如下格式声明:

property B: Boolean read FB write FB default False;

这样B = False不会被保存到dfm文件。现在要修改B的默认值,只须在构造函数Create中写:FB := True即可。
 
接受答案了.
 
打开.Dfm文件就知道了
比如一个窗体,里面有个属性AutoSize,默认为False,就是说在设计这个属性的时候,Default = False
如果你使用的时候这个属性的值是False在DFM文件中不必保存,若改变成了True,则在DFM文件中就保存这个值了

就是说Default提供了一个值,当你改变的时候会将改变后的值写入DFM文件
当你设计的类不需要持久化,就没有必要定义Default了
 
后退
顶部