property中的read和write问题(100分)

  • 主题发起人 主题发起人 deardragon_2002
  • 开始时间 开始时间
D

deardragon_2002

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠,兄弟刚接触delphi,请问property中的getter和setter什么时候该用getter,什么时候该用setter,什么时候两者都用,什么时候两者都不用,谢谢!
 
o := x.property;
那么需要read
x.property := o;
那么需要write
 
在 pulished 下的 property 是在控件属性编辑器中可见的属性。read 是必须的。write 就看你是否让该属性可修改,可修改就用 write 否则不用。
 
如果你只地读写该值,那么不用Get和Set方法,
比如那种没有取值范围的属性,完全可以用字段来存取.
不过当需要属性的取值范围,或者需要执行一些附加的操作时,通常用方法来存取.
 
好,大哥们回答的都很好,我上了一课,补补上学时逃课的缺陷[:)]
 
小弟还是有点 困惑
property FileName: string read FFileName;

constructor TDbReader.Create(AFileName: string
AHaveTitle: Boolean);
begin
FFileName := AFileName;
end;

procedure TDBFDbReader.InternalOpen;
begin
if not FileExists(FFileName) then
raise EDBReader.CreateFmt(SFileNotExist, [FFileName]);
end


1,上面第一处用到的不是对属性进行“写”操作,第二处好像是“读”操作,为什么上面的定义只有read而没write呢?
2,为什么用FFileName := AFileName
而不用 FileName := AFileName
呢?

谢谢,小弟在线等回答。
 
FFileName 是控件内部使用的(对用户不可见)。控件创建时必须初始化,所以 FFileName := AFileName;
FileName 是控件发布的属性,对用户可见。但因为文件名不允许更改,所以只有 read 没有 write。
 
FFileName 是一个变量 FFileName := AFileName正确,由于在控件内部所以可以赋值,如果在外部就不行了,而且FFileName在部是不可见的。
FileName是一个属性, FileName := AFileName就是给属性赋值,这个过程就用到了属性的write,因为定义中FileName没有write,所有对其赋值就会产生错误,编译是不能通过的。
假设FileName 有个write SetFileName如下:
procedure TDBRead.SetFileName(Value: string);
begin
if Value <> FFileName then
begin
FFileName := Value;
// Can do other thing;
end;
end;
那么执行FFileName := AFileName FileName := AFileName后FFileName都=AFileName,但是后者要执行SetFileName过程,而前者则不。
 
偶这次彻底明白了,再次谢谢,接分了,呵呵
 
多人接受答案了。
 
后退
顶部