向导的定义
所谓DELPHI 向导就是,就是指在设计期中可以调用一些专用的窗口去
编辑控件的某些属性。去弥补 object inspector 的局限。向导的分类
向导主要分五种:
1 Expert: IDE扩展,例如 palette properties,new items 这种窗口
2 Version Control
3 Component Editor 创建和控件相连的对话框,例如Tquery 在双击控件时出现
的窗口。
4 property editor 创建和属性相连的对话框,例如Tstrings这种,双击属性栏
(或点右边那个按钮)时出现的窗口。
5 Editors InterFaces Delphi编辑器的接口,允许第三方程序使用它
在编写控件中我们常用的是第3和第4种,所以下面也只讨论这二种
相关的概念
在delphi5中,和向导相关的类主要定义在 DsgnIntf.pas 文件中。
在学习设置向导之前,有三点是先要了解的:
第一是向导和控件一样,一定要向IDE注册后才能用
第二是向导最终目的的作用是把数据保存在DFM文件中,所以这是学习的关键
第三属性的字符串值,和属性值是不同的,字符值是用来显示于object inspector中的
属性值是指属性真正的值。例如 Tstrings的属性值是Tstrings类型的,字符值是
下面我们先初步了解二个重要的基类。
TPropertyEditor类
第一 TPropertyEditor //属性编辑的基类,所有属性编辑器都要从它继承
方法:
Activate
当你在object inspector中选择对应的属性,并且GetAttributes设置为 paSubProperties + paMultiSelect时,IDE就会调用这个方法
AllEqual
当你选择一个以上的控件,并 GetAttributes 设置为 paMultiSelect.IDE就会调用这个
方法,如果这些控件的该属性都相同就返回TRUE,并调用 GetValue 显示值,否则在
Object Inspector 中显示空白。
AutoFill
假如GetAttributes设置为 paValueList.本属性设置为 TRUE时,你在下拉选择属性值
的时候,当前选中的值会自动被填到Object Inspector中的对应属性栏中。
Edit
这个方法是在制作属性向导时必须重载(override)的 .
当你在对应的属性栏双击时,IDE就会调用这个方法,所以
在这个方法和我们就要完成数据读取,窗口初始化,显示等操作
GetAttributes
这个方河也是要重载(override)的 .用于设中属性的属性,如下:
TPropertyAttributes:
paValueList: 设置后,当你按属性栏右边的控钮时会弹出一个下拉框(如Tcolor的设置)
下控框的值由 GetValues 方法的 proc 参数设置。
paSortList: Object Inspector会把 GetValues 方法返回的值列表进后排序。
paSubProperties: 设置后,属性的左边会出现一个+号,单击加号,会展开其所有子属性
也就是该属性的所有 property 。(如字体的设置)
paDialog: 设置后,属性的右边会出现 '...' 按钮,单击后出现对话框。
paMultiSelect: 设置后,当你选择一个以上的控件时,这个属性仍允许显示在
Object Inspector中,(如 name属性等)
paAutoUpdate: 设置后,当你在设置属性值的过程中,每一次操作都会导致马上调用
SetValue 方法去改变属性值,而不是在你确认后(如回车后)再改变,
如 Caption 属性,
paReadOnly: 只读属性
paRevertable: 允许在按Esc键时恢复原来的值,崭套型的属性(如字体)
不能设置这个属性。
GetComponent
返回指定索引值的控件,主要用于在GetAttributes 设置为 paMultiSelect时,在
所选择的控件中找到某一个控件。
GetEditLimit
返回在 object inspector 中编辑属性时,所允许的最大长度,默认为 255.
GetName
所回属性名,如果你希望编辑属性时,在 Object Inspector 中显示属性名就重载它。
GetProperties
在属性有子属性(或崭套有属性时),可以重载这个方法,并通过设置 PropertyProc
参数为子属性分配 TPropertyEdtior 。例如集合属性向导就调用这个方法为每为子属性
分配一个向导,用于设置其为 TRUE 或 False来设置这个项是否在集合中。
GetPropType
返回正在编辑的属性的类信息指针
GetValue
所回属性的字符串值,默认是'(unknown)'.
GetValues
在 GetAttributes 设置为 paValueList 时使用 Proc 参数用于设置属性所能接受的
值列表。
Initialize
在 property editor 创造之后,使用之前会呼叫该方法。
SetValue(Value)
在设置属性的字符串值时会呼叫该方法. property editor应该可以传送这个字符串
并呼叫一个 SetXxxValue 方,如果字符串的格式或值范围不对,property editor应该可以
触发一个异常.
ListMeasureWidth(Value, Canvas, AWidth)
在计算属性下拉框的宽度时触发,以你可以改变下拉框的宽度。
ListMeasureHeight(Value, Canvas, AHeight)
在计算属性下拉框的高度时触发,以你可以改变下拉框的高度。
ListDrawValue(Value, Canvas, Rect, Selected)
在画下拉框的值单元时触发,这个和 TListBox 的 OnDrawItem 相似,
可以让你在下拉框上画图,(如光标设置的下拉框)
PropDrawName(Canvas, Rect, Selected)
在画属性列的名字单元时触发,这个和 TListBox 的 OnDrawItem 相似,
PropDrawValue(Canvas, Rect, Selected)
在画属性列的值单元时触发,这个和 TListBox 的 OnDrawItem 相似,
Name property
GetName 返回的值。
PrivateDirectory property
属性返回:
"HKEY_CURRENT_USER\Software\Borland\Delphi\*\Globals\PrivateDir"
中注册的EXE文件或一个目录。
如果你的 property editor 需要一些额外的文件 (模板,范例等),应该保存在该目录中
Value property
GetValue 返回的值。
Modified
通知IDE控件属性已被修改,在执行SetXxxValue 为方法时,会自动执行Modified。
GetXxxValue
获取属性值(多选时为第一个控件的值)你可以根据属性的值类型使用不同的 SetXxxxValue
SetXxxValue
设置属性值(多选时为所有控件同样设置),你可以根据属性的值类型使用不同的 SetXxxxValue
方法。
GetVisualValue
返回一个可显示的值,如果只有一个控件被选择,或多个被选择的控件的值都一样时
就返回属性的值,否则返回空字符串
TComponentEditor
ComponentEditor分配于控件,在你双击控件时弹出 。
Create(AComponent, ADesigner)
创造一个 component editor. AComponent 是激活它的控件. ADesigner 是IDE提供
的一个接口,提供一些设计期的信息。
Edit
在双击控件时IDE会调用这个方法. 如果GetVerbCount大于0, edit 将会调用 ExecuteVerb(0)。
ExecuteVerb(Index),GetVerb,GetVerbCount,PrepareItem
当你在某些控件(如Tdataset)上单击右键时,你发现菜单中会出现一些控件特有菜单项。
上面这四个方法就是用于控制,这些菜单项的。
GetVerbCount 用菜单项的数量。
GetVerb用于设置 Index 参数 指定的菜单项的Caption
Executeverb用于设置 Index 参数指定的菜单项要执行的操作
PrepareItem 在IDE准备创造菜单项时触发,让你可以定制菜单项的设置(如加上图片等)
IsInInlined
当控件在Frame实例上面时本函数返回TRUE.
以上这二个类和常规类的使用方法有点不同,它由用户按需要定义,由IDE进行调用,它们的函数
其实就等于IDE向我们要一个值,一个执行动作。
向导的注册
我们使用控件要先注册控件,同样要使用 向导同样要先注册,不然IDE怎么知道有什么向导。
和注册控件一样,注册向导同样执行于 procedure Register; 这个特殊方法中。
有二个相关的方法。
方法一:
procedure RegisterPropertyEditor(PropertyType: PTypeInfo; ComponentClass: TClass;
const PropertyName: string; EditorClass: TPropertyEditorClass);
用于注册一个属性编辑向导名。
其中
PropertyType
属性类的类信息,这个类信息可以用内部函数TypeInfo来获得 例如:TypeInfo(TMyRange) TypeInfo(TShapes)
ComponentClass
限制那一些控件可以使用这个属性编辑器。如果设置为 nil,则不管是那一种控件,只要其属性的
属性类是PropertyType所指定的类即会使用向导进行设置(除非控件有单独的设置).这个设置是范围
越小权限越高,范围相同的即用户定义的权限较高。
PropertyName
指定什么名字的属性可以使用这个属性编辑器,如果设置为''则可以使用该属性编辑器的属性由 PropertyType 和 ComponentClass 来确定。
以上三个参数用联合指定那一些属性可以使用本属性编辑器。也就是 ComponentClass中的、类为 PropertyType的、名字为PropertyName的属性使用本属性编辑器。
EditorClass
属性编辑器类。
方法二:
procedure RegisterComponentEditor(ComponentClass: TComponentClass;
ComponentEditor: TComponentEditorClass);
用于注册一个控件编辑器:
ComponentClass
使用该控件编辑器的控件
ComponentEditor
控件编辑器类。