delphi
编程技巧
源代码在线查看: 《新》编写控件的高级技巧修改稿 (2001年2月22.txt
《新》编写控件的高级技巧 (2001年2月22日)
网友更新 分类:控件制作 作者:宋爽 推荐:ss 阅读次数:729
(http://www.codesky.net)
--------------------------------------------------------------------------------
在DELPHI中编写控件,即如何定义一个新的属性类型,来实现自己的目的?例如有的控件在DELPHI的IDE中的属性窗口中加上作者的信息或者双击控件弹出关于窗口等。下面就以“关于”窗口来说明该技巧的实现方法。
先定义一个新的控件“TTestComponent”。所有代码均在里面加入。
1、让我们先定义一个新的属性类型“TTestAbout”。
type
TTestAbout = class(TPropertyEditor)
public
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
function GetValue:string; override;
end;
{ TsongAbout }
当用户双击或单击带有3个小圆点的按扭时,EDIT方法被调用。下面的TquickAboutBox为事先做好的窗体单元。
procedure TTestAbout.Edit;
var
dd:TQuickAboutBox;
begin
inherited;
try
dd:=TQuickAboutBox.Create(Application);
dd.ShowModal;
finally
dd.free ;
end;
end;
GetAttributes方法返回一个TpropertyAttributes集,指明属性编辑器的一些特性,决定了属性是否有下拉列表、是否能多重选择等。我们指定为[paDialog],使对象检查器中出现(厎)按扭。
function TTestAbout.GetAttributes: TPropertyAttributes;
begin
result:=[paDialog];
end;
GetValue方法返回该属性出现在对象检查器中出现的字符串。
function TTestAbout.GetValue: string;
begin
result:='About';
end;
2、下面是实现在DELPHI的IDE环境下鼠标右击控件弹出的菜单加入新的命令。
type
TTesteditor = class(Tdefaulteditor)
public
function getverb(index:integer):string;override;
function getverbcount:integer;override;
procedure executeVerb(index:integer);override;
procedure edit;override;
end;
{ Tmyeditor }
当用户双击一个控件时,EDIT方法被调用,告诉控件做的事件。
procedure Testeditor.edit;
var
dd:TQuickAboutBox;
begin
inherited;
try
dd:=TQuickAboutBox.Create(Application);
dd.ShowModal;
finally
dd.free ;
end;
end;
当用户选择窗体编辑器的弹出菜单中为控件定义的菜单项时,executeVerb方法 被调用,他传递一个从0开始的Index参数。本方法作为TcomponentEditor的EDIT方法的缺省动作被调用
procedure Testeditor.executeVerb(index: integer);
begin
inherited;
EDIT;
end;
当用户右键单击控件时Getverb方法被调用,他根据Index参数返回需要被添加到弹出菜单上项目的字符值。
function Testeditor.getverb(index: integer): string;
begin
case index of
0:result:='关于(&A)...';
end;
end;
每当用户右键单击控件时调用GetverbCount方法,它返回需要添加到窗体编辑器的弹出菜单里的菜单项数目,缺省值为0。
function Testeditor.getverbcount: integer;
begin
result:=1;
end;
3、控件中如何调用此属性。
type
TMyAbout=Class(TClassProperty)
end;
type
TTestComponent = class(TComponent)
private
Ftest: TMyAbout;
卨och卲ar published
property sabout:TMyAbout read Ftest ;
卨och卲ar end;
卨och卲ar
4、最重要的一步是要分别注册它们。
procedure Register;
begin
RegisterComponents('MyAbout', [TTestComponent]);
RegisterPropertyEditor(TypeInfo( TMyAbout ), TTestComponent, '', TTestAbout );
RegisterComponentEditor(TTestComponent, TTestEditor);
end;
注册控件编辑器函数 procedure RegisterComponentEditor(ComponentClass:TcomponentClass; ComponentEditor: TcomponentEditorClass);第一个参数是控件类名,第二个是控件编辑器类名。
注册控件属性编辑器函数procedure RegisterPropertyEditor(PropertyType: PTypeInfo; ComponentClass: TClass; const PropertyName: string; EditorClass: TPropertyEditorClass); 第一个参数是一个指针,可以把属性类型强制转换为TypeInfo得到;第二个是所适用的空间类型。如为NULL,则所适用于第一个参数所指的所有属性;第三是所适用的属性名; 第四是给定属性的属性编辑器类型。
在控件编译器中编译安装之后,就可以应用刚才做的控件了。《此程序在Windows98,Delphi 5.0下调试通过。》
江苏常州托普软件园研究院开发一室 宋爽 [213000] songshuang@topgroup.com.cn