Delphi自定义控件开发Word文档下载推荐.docx
- 文档编号:4457396
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:45
- 大小:145.69KB
Delphi自定义控件开发Word文档下载推荐.docx
《Delphi自定义控件开发Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Delphi自定义控件开发Word文档下载推荐.docx(45页珍藏版)》请在冰点文库上搜索。
我们制作控件的时候,如果覆盖了父类的构造函数,那么在新的构造函数中一定要首先调用父类的构造函数,否则会引起错误。
这是很多初学控件开发的人常常遇到的问题。
当您把自己开发的控件从面板上拖放到窗体时,如果跳出一个“AccessViolent”的错误对话框的话,那么十有八九是因为您忘了调用父类的构造函数。
(2)Cursor:
Font.Style:
这三句的意思是修改标签的视觉效果。
Cursor:
是设定当鼠标移动到控件上时鼠标的形状为“手型”;
是设定文字的下划线效果。
3、既然是超链接控件,那么我们肯定要能使用户在使用控件的时候能在“ObjectInspector”中对超链接的URL进行修改,所以我们应该为控件增加一个Url属性。
属性是访问控件字段的接口。
通过属性,控件使用者可以间接读或者写控件的内部字段改变控件的状态。
组件属性的声明需要以下几部分:
属性名、属性类型、读方法(或读字段)、写方法(或写字段。
如果没有写方法或写字段,则该属性为只读属性)。
属性在控件类声明的Published部分声明。
在Published中声明的属性可以在设计期通过“ObjectInspector”对属性值进行修改。
如果声明在Public部分则不可以在设计期通过“ObjectInspector”对属性值进行修改,但是可以在运行时通过代码进行读写。
在类声明的Private访问区域中添加如下字段声明:
FUrl:
String;
在类声明中添加Published访问区域,并添加如下代码
propertyUrl:
StringreadFUrlwriteFUrl;
这段声明的意思是为控件添加一个Url属性,属性的类型是string,在读Url属性时返回Furl的值,在写Url属性时设定Furl的值。
4、超链接的视觉效果有了,下面使它点击时调用浏览器打开Url指定的网址。
在Delphi控件的事件处理中很多事件都有对应的一个调度方法(这是设计模式中模板模式的典型应用)。
比如在鼠标点击控件时,控件会首先调用Click方法,由Click方法进行相应的处理,而绝大多数调度方法都会引发一个事件句柄(关于事件句柄我们后边有深入的介绍)。
比如Tlabel控件中在用户用点击Label时会首先调用控件的Click方法(被声明为Protected级别),Click方法再触发OnClick事件。
所以我们只要覆盖Tlabel的Click方法进行我们自己的处理就可以了。
在Protected部分添加如下的声明:
procedureClick;
override;
在实现部分为Click方法写如下的代码:
procedureTUrlLabel.Click;
ShellExecute(Application.Handle,nil,PChar(Url),nil,nil,SW_NORMAL);
inherited;
end;
ShellExecute的作用是用默认的程序打开第三个参数指定的文件。
所以当第三个参数为一个URL时,则用浏览器打开这个网址。
关于ShellExecute其他参数的使用方法可以查阅MSDN或其他相关资料。
(2)
Inherited;
的作用是调用父类的Click方法来由父类来对鼠标单击事件做其他的处理。
5、源代码。
下面给出这个控件的全部源代码:
unitUrlLabel;
interface
uses
Windows,Messages,SysUtils,Classes,Controls,StdCtrls,Shellapi,
Graphics,Forms;
type
TUrlLabel=class(TLabel)
private
AnsiString;
protected
procedureClick;
public
constructorCreate(AOwner:
published
propertyUrl:
AnsiStringreadFUrlwriteFUrl;
procedureRegister;
implementation
=[fsUnderline];
RegisterComponents('
Linco'
[TUrlLabel]);
//控件生成向导生成的注册控件用代码
end.
6、为控件添加图标。
如果没有给自定义的控件定义图标,出现在控件面板上的自定义图标的图标是默认的图标,很没有“个性”,也不容易被用户与其他控件区别开来,所以我们需要给组件指定一个图标。
首先利用Delphi的ImageEditor创建一个24*24的位图,并把它保存到一个DCR文件中。
创建了一个位图后,就需要给位图命名了。
位图的名称必须和控件的类名相同,且为大写,而DCR文件的名字则必须与控件所在单元的单元名相同。
如我们上边定义的控件,位图的名字应该为TURLLABEL,DCR文件的名字应该是UrlLabel.dcr,此DCR文件应该与组件的单元文件放在同一个目录下。
打开ImageEditor,选择”File”->
“New”->
“ComponentResourceFile(.dcr)”,如下图:
在“Contents”上单击鼠标右键,选择“New”->
“BitMap”:
在Width,Height中都填入24,点“OK”即可。
可以在Bitmap1上点右键选择“Rename”为位图重命名为TURLLABEL,然后双击TURLLABEL,就可以像使用“画图”一样为您的控件设计图标了。
7、注册组件。
点击Componet->
InstallComponet进行自定义组件安装,此时将出现组件安装对话框。
在UnitFilName中输入控件单元文件的文件名(包括路径),点击“OK”,在弹出的PackageEditor中按下Install按钮。
如果安装成功系统就会提示安装成功。
关闭PackageEditor时,会提示您是否保存修改,点击Yes即可。
安装成功,建立一个测试程序。
将URLLabel控件放到窗体上,设定Url属性为运行程序,点击此Label,就会弹出浏览器打开这个网址。
思考题:
1、如何为控件添加一个图标?
2、Delphi中的控件的共同基类是哪个类?
3、请做一个编辑框控件,当控件中输入的字符串是网址(以http:
//开头)且用户在编辑框上按回车时,用浏览器打开此网址。
Delphi控件开发浅入深出
(二)
二、控件开发纵览
通过开发上边这个控件,我们已经对Delphi控件开发有了基本的认识。
下面我们将系统的讲述一下控件开发的知识。
制作控件第一件事就是选择适当的Delphi对象类型作为父对象,以派生新的对象。
子对象可以继承父对象的全部非private部件,但不能摆脱不需要的部件。
因此,所选父对象应尽可能多地包含子对象所需的属性、事件和方法,但不应包含子对象不需要的东西。
Delphi必须从Tcomponent或Tcomponent的子类派生。
TComponent是所有Delphi控件的基点,但若直接从TComponent派生新控件,很多东西就需要自己从头做起。
一般只有非可视控件才直接从TComponent派生。
Delphi提供了若干专门用于制作控件(可视控件)的对象类型,都是从TControl和TWinControl派生而来。
TControl的子类型用于非窗口式控件,TWinControl的子类型则用于窗口式控件。
除非特殊需要,一般不直接从TControl和TWinControl派生新控件,而是从其子类型派生。
这样可以充分利用原有的属性、事件和方法,减少很多工作量。
在这些控件类型中,非通用的属性、事件和方法都声明为protected。
这样可以禁止控件用户访问,又能被子类型继承和修改。
在新控件中,可以简单地把继承来的属性和事件重新声明为published,使控件用户能在设计期通过对象编辑窗口访问,也可以进而修改属性的默认值和读写方式,或是重载(override)事件处理子过程和其他控件方法,以修改其中的程序代码。
重声明可以放宽访问权限,但不能相反,例如,不可能把published属性重声明为private或protected。
Delphi控件也是Delphi的类,所有的控件都有特定的结构。
一般控件包括三大组成部分:
属性、方法和事件,下面先介绍初学控件开发的最难懂的属性部分,其他部分我们将在以后章节为大家介绍。
属性主要部分就是属性的读写方法(或读写字段)。
前面的例子用的是读写字段,也就是对属性的读写都通过对字段的读写来完成。
下面为大家讲解一下读写方法的使用方法:
TmyComponent=class(TComponent)
Private
Fcount:
Integer;
ProcedureSetCount(Avalue:
Integer);
Pulbished
PropertyCount:
IntegerreadFcountwriteSetCount;
End;
这个例子中当执行MyComponent1.Count:
=1;
这样的代码时,将会导致SetCount方法执行,并且参数Avalue被指定为1;
当执行I:
=MyComponent1.Count;
方法时,会将Fcount的值返回给I。
属性的声明语法允许属性声明的Read和Write部分用访问方法取代对象私有数据域。
属性的读方法是不带参数的函数,返回同属性相同类型的值。
通常读方法以Get开头。
属性的写方法总是带一个参数的过程。
写方法常常以Set开头。
1、
如何为控件添加属性?
2、
从TwinControl类派生的控件的特点是什么?
Delphi控件开发浅入深出(三)
三、开关控件TlincoSwitch
用过Delphi1(好古老的东东呀!
)的人相信都记得这个开关控件
,不知道当初Borland为什么把这么一个在开发普通应用程序中应用不到的工控控件放到Delphi中,而且在Delphi2及其以后的版本中再也没有见过它的身影。
让我们怀着怀旧的心情把这位“开国元老”请出来吧!
1、建立位图资源文件:
用ImageEditor建立一个Res文件,并在文件中分别建立下面两个位图
,并分别命名为SWITCHON、SWITCHOFF。
保存此Res到控件单元所在目录下。
2、写控件代码。
unitLincoSwitch;
SysUtils,Classes,Controls,Graphics,Windows;
TLincoSwitch=class(TCustomControl)
FIsOn:
Boolean;
FPicOn:
Graphics.TBitmap;
FPicOff:
procedureFSetIsOn(AValue:
Boolean);
procedurePaint;
TComponent);
destructorDestroy;
propertyIsOn:
BooleanreadFIsOnwriteFSetIsOn;
propertyOnClick;
propertyOnKeyDown;
propertyOnKeyPress;
propertyOnKeyUp;
propertyOnCanResize;
propertyOnDblClick;
propertyOnMouseDown;
propertyOnMouseMove;
propertyOnMouseUp;
propertyOnMouseWheel;
propertyOnResize;
{$R*.res}
procedureLoadBitmapFromRes(ABitmapId:
string;
ABitmap:
Graphics.TBitmap);
ABitmap.LoadFromResourceName(hInstance,ABitmapId);
//从资源文件中读取位图
constructorTLincoSwitch.Create(AOwner:
FPicOn:
=Graphics.TBitmap.Create;
FPicOff:
LoadBitmapFromRes('
SWITCHON'
FPicOn);
SWITCHOFF'
FPicOff);
Invalidate;
destructorTLincoSwitch.Destroy;
FPicOn.Free;
FPicOff.Free;
procedureTLincoSwitch.Click;
IsOn:
=notIsOn;
//改变按钮的状态
procedureTLincoSwitch.Paint;
//画开关图案
ifIsOnthen
StretchBlt(Canvas.Handle,0,0,self.Width,self.Height,FPicOn.Canvas.Handle,
0,0,FPicOn.Width,FPicOn.Height,SRCCOPY)
else
StretchBlt(Canvas.Handle,0,0,self.Width,self.Height,FPicOff.Canvas.Handle,
0,0,FPicOff.Width,FPicOff.Height,SRCCOPY);
procedureTLincoSwitch.FSetIsOn(AValue:
FIson:
=AValue;
[TLincoSwitch]);
3、代码分析
(1)、因为我们要在控件表面上将按钮的图案画出来,所以我们选择TcustomControl做为父类控件,因为它有个Canvas属性,我们可以利用Canvas在控件表面作图。
不选用Tcontrol的原因是因为它有很多我们不需要的属性。
(2)、ABitmap.LoadFromResourceName(hInstance,ABitmapId);
是从资源文件中读取Id为AbitmapId的位图,关于资源文件的使用请参考其他相关资料。
注意代码中的“{$R*.res}”,它的作用是将资源文件编译到程序文件中,如果没有这个预编译条件,程序将会出现错误。
(3)、StretchBlt是将位图画到画板上,使用方法请参考MSDN。
(4)、我们为控件增加了IsOn属性。
这个布尔属性用来表示开关的状态(开/关)。
从propertyIsOn:
我们可以看出这个属性是个可读可写的属性。
当读这个属性时会将FisOn的值返回给调用者,而写属性时则会调用FsetIsOn方法,并将赋给属性的值做为参数传递给FsetIsOn。
在FsetIsOn方法中,有如下实现代码:
首先将Fison设置为参数传递来的值,然后调用Invalidate;
要求重画控件,以告诉用户控件的状态已经改变,这一点是使用写字段无法做到的。
(5)
FPicOff:
是声明两个.Tbitmap类型变量以保存控件的开关两种状态的图案。
(6)
procedurePaint;
分别是覆盖父类中相应的调度方法。
当控件被鼠标单击时,Click方法会被调用,我们将在Click中改变控件的开关状态;
Paint方法则在用户调用Invalidate方法或控件发生重画时调用,我们一般在这个方法绘制控件的图案。
(7)、TcustomControl中又很多事件处理句柄。
比如OnClick、OnKeyDown等,但是它把他们声明成了Protected保护级别,所以我们在ObjectInspector中看不到他们,如果我们要他们可以在ObjectInspector中被用户编辑的话,只要在Published中重新声明他们即可,不用写他们的读写方法,只要使用:
Property属性名;
这样的方法就可以。
比如这个例子中的:
PropertyOnclick;
做一个有特效的按钮控件,当鼠标按下时按钮是一个红色边框的空心圆,当鼠标松开时按钮是一个淡绿色边框的空心圆。
对于父类控件中为protected的属性,如果想将它在子类控件中公布,应该怎么做?
请思考Delphi为什么要将一些属性设为protected级别?
Delphi控件开发浅入深出(四)
四、对特定字符串敏感的Edit控件
我们这个控件将演示控件的自定义事件的书写。
这个控件有一个类型为string的SensitiveText属性,当用户在输入框中输入的文字为InvalidText时就会触发OnSensitiveText事件。
按照惯例,我先把源码展示给大家:
unitTextSenseEdit;
SysUtils,Classes,Controls,StdCtrls;
TSensitiveTextEvent=procedure(AText:
string)ofobject;
//方法指针
TTextSenseEdit=class(TEdit)
FSensitiveText:
FOnSensitiveText:
TSensitiveTextEvent;
procedureSetSensitiveText(AValue:
string);
procedureChange;
propertySensitiveText:
stringreadFSensitiveTextwriteSetSensitiveText;
propertyOnSensitiveText:
TSensitiveTextEventreadFOnSensitiveTextwriteFOnSensitiveText;
[TTextSenseEdit]);
procedureTTextSenseEdit.Change;
ifText=SensitiveTextthen
ifAssigned(OnSensitiveText)then
OnSensitiveText(T
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi 自定义 控件 开发