📄 048.htm
字号:
<p>4. </font><font face="宋体" lang="ZH-CN" size="3">定义部件属性</p>
<p> ⑴</font><font size="3"> </font><font face="宋体" lang="ZH-CN" size="3">属性的声明</p>
<p> 声明部件的属性,你要描述:</font><font face="Arial" size="3"></p>
<p></font><font face="宋体" lang="ZH-CN" size="3"> ●</font><font size="3"> </font><font
face="宋体" lang="ZH-CN" size="3">属性名</p>
<p> </font><font size="3"> </font><font face="宋体" lang="ZH-CN" size="3">●</font><font
size="3"> </font><font face="宋体" lang="ZH-CN" size="3">属性的类型</p>
<p> ●</font><font size="3"> </font><font face="宋体" lang="ZH-CN" size="3">读和设置属性值的方法</p>
<p> </p>
<p> 至少,部件属性应当定义在部件对象声明的</font><font
face="Arial" size="3">public</font><font face="宋体" lang="ZH-CN" size="3">部分,这样可以在运行时很方便地从外部访问;为了能在设计时编辑属性,应当将属性在</font><font
face="Arial" size="3">published</font><font face="宋体" lang="ZH-CN" size="3">部分声明,这样属性能自动显示在</font><font
face="Arial" size="3">Object Inspector</font><font face="宋体" lang="ZH-CN" size="3">窗口中。下面是典型的属性声明:</p>
<p> </p>
<p> </font><font face="Arial" size="3">type</p>
<p>TYourComponent=class(TComponent)</p>
<p></font><font face="宋体" lang="ZH-CN" size="3">…</font><font face="Arial" size="3"></p>
<p>private</p>
<p>FCount: Integer { </font><font face="宋体" lang="ZH-CN" size="3">内部存储域</font><font
size="3"> </font><font face="Arial" size="3">}</p>
<p>function GetCount: Integer; { </font><font face="宋体" lang="ZH-CN" size="3">读方法</font><font
size="3"> </font><font face="Arial" size="3">}</p>
<p>procedure SetCount(ACount: Integer); { </font><font face="宋体" lang="ZH-CN" size="3">写方法</font><font
size="3"> </font><font face="Arial" size="3">}</p>
<p>pubilic</p>
<p>property Count: Integer read GetCount write SetCount;</p>
<p>end; </p>
<p></font><font face="宋体" lang="ZH-CN" size="3"> </p>
<p> ⑵</font><font size="3"> </font><font face="宋体" lang="ZH-CN" size="3">内部数据存储</p>
<p> 关于如何存储属性的数据值,</font><font face="Arial" size="3">Delphi</font><font
face="宋体" lang="ZH-CN" size="3">没有特别的规定,通常</font><font
face="Arial" size="3">Delphi</font><font face="宋体" lang="ZH-CN" size="3">部件遵循下列规定:</font><font
face="Arial" size="3"></p>
<p></font><font face="宋体" lang="ZH-CN" size="3"> ●</font><font size="3"> </font><font
face="宋体" lang="ZH-CN" size="3">属性数据存储在对象的数据域处</p>
<p> </font><font size="3"> </font><font face="宋体" lang="ZH-CN" size="3">●</font><font
size="3"> </font><font face="宋体" lang="ZH-CN" size="3">属性对象域的标识符以</font><font
face="Arial" size="3">F</font><font face="宋体" lang="ZH-CN" size="3">开头,例如定义在</font><font
face="Arial" size="3">TControl</font><font face="宋体" lang="ZH-CN" size="3">中的属性</font><font
face="Arial" size="3">FWidth</font><font face="宋体" lang="ZH-CN" size="3"></p>
<p> ●</font><font size="3"> </font><font face="宋体" lang="ZH-CN" size="3">属性数据的对象域应声明在</font><font
face="Arial" size="3">private</font><font face="宋体" lang="ZH-CN" size="3">部分</p>
<p> </p>
<p> 后代部件只应使用继承的属性自身,而不能直接访问内部的数据存储。</p>
<p> ⑶</font><font size="3"> </font><font face="宋体" lang="ZH-CN" size="3">直接访问</p>
<p> 使属性数据可用的最简单的办法是直接访问。属性声明的</font><font
face="Arial" size="3">read </font><font face="宋体" lang="ZH-CN" size="3">和</font><font
face="Arial" size="3">write</font><font face="宋体" lang="ZH-CN" size="3">部分描述了怎样不通过调用访问方法来给内部数据域赋值。但一般都用</font><font
face="Arial" size="3">read</font><font face="宋体" lang="ZH-CN" size="3">进行直接访问,而用</font><font
face="Arial" size="3">write</font><font face="宋体" lang="ZH-CN" size="3">进行方法访问,以改变部件的状态。</p>
<p> 下面的部件声明演示了怎样在属性定义的</font><font face="Arial"
size="3">read </font><font face="宋体" lang="ZH-CN" size="3">和</font><font
face="Arial" size="3">write</font><font face="宋体" lang="ZH-CN" size="3">部分都采用直接访问:</p>
<p> </p>
<p> </font><font face="Arial" size="3">type</p>
<p>TYourComponent=class(TComponent)</p>
<p></font><font face="宋体" lang="ZH-CN" size="3">…</font><font face="Arial" size="3"></p>
<p>private { </font><font face="宋体" lang="ZH-CN" size="3">内部存储是私有</font><font
size="3"> </font><font face="Arial" size="3">}</p>
<p>FReadOnly: Boolean; { </font><font face="宋体" lang="ZH-CN" size="3">声明保存属性值的域</font><font
size="3"> </font><font face="Arial" size="3">}</p>
<p>published { </font><font face="宋体" lang="ZH-CN" size="3">使属性在设计时可用</font><font
size="3"> </font><font face="Arial" size="3">}</p>
<p>property ReadOnly: Boolean read FReadOnly write FReadOnly; </p>
<p>end;</font><font face="宋体" lang="ZH-CN" size="3"></p>
<p> </p>
<p> ⑷</font><font size="3"> </font><font face="宋体" lang="ZH-CN" size="3">访问方法</p>
<p> 属性的声明语法允许属性声明的</font><font face="Arial" size="3">read</font><font
face="宋体" lang="ZH-CN" size="3">和</font><font face="Arial" size="3">write</font><font
face="宋体" lang="ZH-CN" size="3">部分用访问方法取代对象私有数据域。不管属性是如何实现它的</font><font
face="Arial" size="3">read </font><font face="宋体" lang="ZH-CN" size="3">和</font><font
face="Arial" size="3">write</font><font face="宋体" lang="ZH-CN" size="3">部分,方法实现应当是</font><font
face="Arial" size="3">private</font><font face="宋体" lang="ZH-CN" size="3">,后代部件只能使用继承的属性访问。</p>
<p> ①</font><font size="3"> </font><font face="宋体" lang="ZH-CN" size="3">读方法</font><font
face="Arial" size="3"></p>
<p></font><font face="宋体" lang="ZH-CN" size="3">属性的读方法是不带参数的函数,并且返回同属性相同类型的值。通常读函数的名字是“</font><font
face="Arial" size="3">Get</font><font face="宋体" lang="ZH-CN" size="3">”后加属性名,例如,属性</font><font
face="Arial" size="3">Count</font><font face="宋体" lang="ZH-CN" size="3">的读方法是</font><font
face="Arial" size="3">GetCount</font><font face="宋体" lang="ZH-CN" size="3">。不带参数的唯一例外是数组属性。如果你不定义</font><font
face="Arial" size="3">read</font><font face="宋体" lang="ZH-CN" size="3">方法,则属性是只写的。</p>
<p> ②</font><font size="3"> </font><font face="宋体" lang="ZH-CN" size="3">写方法</p>
<p> 属性的写方法总是只带一个参数的过程。参数可以是引用或值。通常过程名是</font><font
face="Arial" size="3">"Set"</font><font face="宋体" lang="ZH-CN" size="3">加属性名。例如,属性</font><font
face="Arial" size="3">Count</font><font face="宋体" lang="ZH-CN" size="3">的写方法名是</font><font
face="Arial" size="3">SetCount</font><font face="宋体" lang="ZH-CN" size="3">。参数的值采用设置属性的新值,因此,写方法需要执行在内部存储数据中写的操作。</p>
<p> 如果没有声明写方法,那么属性是只读的。</p>
<p> 通常在设置新值前要检测新值是否与当前值不同。</p>
<p> 下面是一个简单的整数属性</font><font face="Arial" size="3">Count</font><font
face="宋体" lang="ZH-CN" size="3">的写方法:</p>
<p> </p>
<p> </font><font face="Arial" size="3">procedure TMyComponent.SetCount( value:
Integer); </p>
<p>begin</p>
<p>if value <>FCount then </p>
<p>begin</p>
<p>FCount := Value; </p>
<p>update; </p>
<p>end; </p>
<p>end; </p>
<p></font><font size="3"> </font><font face="Arial" size="3"></p>
<p></font><font face="宋体" lang="ZH-CN" size="3">⑸</font><font size="3"> </font><font
face="宋体" lang="ZH-CN" size="3">缺省属性值</p>
<p> 当声明一个属性,能有选择地声明属性的缺省值。部件属性的缺省值是部件构造方法中的属性值集。例如,当从</font><font
face="Arial" size="3">Component Palette</font><font face="宋体" lang="ZH-CN" size="3">选择某部件置于窗体中时,</font><font
face="Arial" size="3">Delphi</font><font face="宋体" lang="ZH-CN" size="3">通过调用部件构造方法创建部件,并决定部件属性初始值。</p>
<p> </font><font face="Arial" size="3">Delphi</font><font face="宋体" lang="ZH-CN"
size="3">使用声明缺省值决定是否将属性值存在</font><font face="Arial"
size="3">DFM</font><font face="宋体" lang="ZH-CN" size="3">文件中。如果不描述缺省值,</font><font
face="Arial" size="3">Delphi</font><font face="宋体" lang="ZH-CN" size="3">将总是保存该属性值。声明缺省值的方法是在属性声明后加</font><font
face="Arial" size="3">default</font><font face="宋体" lang="ZH-CN" size="3">指令,再跟缺省值。</p>
<p> 当重声明一个属性时,能够描述没有缺省值的属性。如果继承的属性已有一个,则设立没有缺省值的属性的方法是在属性声明后加</font><font
face="Arial" size="3">nodefault</font><font face="宋体" lang="ZH-CN" size="3">指令。如果是第一次声明属性,则没有必要加</font><font
face="Arial" size="3">nodefault</font><font face="宋体" lang="ZH-CN" size="3">指令,因为没有</font><font
face="Arial" size="3">default</font><font face="宋体" lang="ZH-CN" size="3">指令即表示如此。</p>
<p> 下例是名为</font><font face="Arial" size="3">IsTrue</font><font
face="宋体" lang="ZH-CN" size="3">的布尔类型属性设置缺省值</font><font
face="Arial" size="3">True</font><font face="宋体" lang="ZH-CN" size="3">的过程:</p>
<p> </p>
<p> </font><font face="Arial" size="3">type</p>
<p>TSampleComponent=class(TComponent)</p>
<p>private</p>
<p>FIsaTrue: Boolean; </p>
<p>pubilic</p>
<p>constructor Create (AOwner: TComponent); Overvide; </p>
<p>published</p>
<p>property Istrue: Boolean read FIsTrue write FIsTrue default True; </p>
<p>end; </p>
<p></font><font size="3"> </font><font face="Arial" size="3"></p>
<p>constructor TSampleComponent.Create (AOwner: TComponent);</p>
<p>begin</p>
<p>inherited Create ( Aowner); </p>
<p>Fistvue := True; { </font><font face="宋体" lang="ZH-CN" size="3">设置缺省值</font><font
size="3"> </font><font face="Arial" size="3">}</p>
<p>end; </p>
<p></font><font size="3"> </font><font face="Arial" size="3"></p>
<p>5. </font><font face="宋体" lang="ZH-CN" size="3">编写属性编辑器</font><font
face="Arial" size="3"></p>
<p>Object Inspector</font><font face="宋体" lang="ZH-CN" size="3">提供所有类型属性的缺省编辑器,</font><font
face="Arial" size="3">Delphi</font><font face="宋体" lang="ZH-CN" size="3">也支持通过编写和注册属性编辑器的方法为属性设计自己的编辑器。可以注册专门为自定义部件的属性设计的编辑器,也可设计用于所有某类型的属性。编写属性编辑器需要下列五个步骤:</font><font
face="Arial" size="3"></p>
<p></font><font face="宋体" lang="ZH-CN" size="3">●</font><font size="3"> </font><font
face="宋体" lang="ZH-CN" size="3">继承一个属性编辑器对象</font><font
face="Arial" size="3"></p>
<p></font><font face="宋体" lang="ZH-CN" size="3"> ●</font><font size="3"> </font><font
face="宋体" lang="ZH-CN" size="3">将属性作为文本编辑</p>
<p> </font><font size="3"> </font><font face="宋体" lang="ZH-CN" size="3">●</font><font
size="3"> </font><font face="宋体" lang="ZH-CN" size="3">将属性作为整体编辑</p>
<p> ●</font><font size="3"> </font><font face="宋体" lang="ZH-CN" size="3">描述编辑器属性</font><font
face="Arial" size="3"></p>
<p></font><font face="宋体" lang="ZH-CN" size="3"> ●</font><font size="3"> </font><font
face="宋体" lang="ZH-CN" size="3">注册属性编辑器</p>
<p> </p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -