⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 007.htm

📁 Delphi书籍--Delphi网上教程
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<br> 
<strong>事件与事件处理过程</strong><br> 
创建构件时,事件也被当做属性来处理,区别仅在于事件必须定义为过程类型,使其成为一个隐蔽指针,指向某个潜在的过程。当构件用户为事件指定处理子程序后,事件便成为指向该子程序的指针。事件的定义方式如下:<br> 
type<br> 
private<br> 
FOnClick:TNotifyEvent;{声明事件变量以保存过程指针}<br> 
published<br> 
propertyOnClick:TNotifyEventreadFOnClickwriteFOnClick;<br> 
end;<br> 
此例正是Delphi标准控件中Click事件的定义方式。可以看出,除了OnClick被定义为过程类型外,其定义格式与一般属性的直接访问格式几乎完全相同。Delphi预定义了所有标准事件的过程类型及标准事件所引发的虚方法。其中,Click事件将引发如下虚方法:<br> 
procedureTControl.Click;<br> 
begin<br> 
ifAssigned(OnClick)thenOnClick(Self);<br> 
{以下是默认处理部分}<br> 
end;<br> 
&nbsp;&nbsp;&nbsp;&nbsp; 其中,Assigned函数检验OnClick是否已分配了事件处理过程。如果返回值为True,则调用用户指定的事件处理过程。通过重载此虚方法,可以修改Click事件的处理方式。在重载的方法中,一般应先调用用户处理程序,然后再安排后续处理。在本例中,首行代码应当是inheritedClick。<br> 
需要注意的是,构件用户不一定会给事件指定处理程序,因此事件不能定义为函数类型,否则可能会指向返回值类型不定的空函数。如果需要事件处理过程返回某个值,可以借助var参数。调用用户程序之前应确保此参数包含有效返回值,以免用户未指定事件处理过程时出错。<br> 
如果Delphi标准事件不能满足需要,也可以自己定义事件。其核心思想是选择适当的Windows消息来引发构件中的事件过程。篇幅所限,不拟详述,请读者参阅有关资料。<br> 
<br> 
<strong>方法处理要点</strong><br> 
&nbsp;&nbsp;&nbsp; 
方法处理在创建构件时和使用构件时没有多大区别,但有些问题仍需要注意。<br> 
&nbsp;&nbsp;&nbsp; 
首先要注意的是,构件通常是在事件处理过程中调用,而构件作者又无法预测用户将在什么环境下如何调用构件。因此,构件中的方法应尽量避免占用系统资源,避免使Windows停止对用户操作的反应。<br> 
&nbsp;&nbsp;&nbsp; 
创建构件时应随时意识到,此构件不仅可以直接调用,而且可用来创建别的构件。即使是对用户隐蔽的方法也应具有完整的功能和清晰的接口。除了属性读写方法之外,内部方法一般应声明为protected虚方法,以便被派生对象继承和重载。属性读写方法则应采用private声明严密保护。派生对象如果需要读写父对象的属性值,应该访问属性本身,没有必要直接访问其读写方法。<br> 
<br> 
<strong>构件测试</strong><br> 
&nbsp;&nbsp;&nbsp; 
制作构件的核心工作是编写构件单元,包括根据构件功能要求设定对用户开放的属性、事件和方法,设定用以实现这些部件的变量、过程和函数等等。除了属性和事件有 
特殊格式之外,构件单元的设计方式与一般Delphi单元没有什么不同,只是单元中不能包含窗体。<br> 
在编写构件单元的过程中,可以借助一个测试窗体直接对其测试。以可视化方法在窗体上安排构件,本质上不过是自动生成调用构件的代码。即使构件未并入VCL库,无法使用可视化操作,也可以手工编写这些调用代码。这样测试,可以免去反复修改而导致的反复安装。<br> 
测试时,需先建立一个窗体单元,然后进行以下操作:<br> 
&nbsp;&nbsp;&nbsp; 1.把被测构件单元名称加入窗体单元的uses语句中,并在public部分声明被测构件的对象实例。<br> 
&nbsp;&nbsp;&nbsp; 2.在窗体单元的FormCreate子程序中调用被测构件的Create方法,以构造构件实例,其Owner参数设置为Self,即窗体本身。然后给Parent属性赋值,并适当设置其他属性值。Parent是容纳构件的父对象,如果是窗体本身,应设置为Self。<br> 
&nbsp;&nbsp;&nbsp; 3.运行包含测试窗体的工程,找出构件程序中的错误。<br> 
<br> 
<strong>注册构件</strong><br> 
&nbsp;&nbsp;&nbsp; 注册构件用的程序代码可以放在构件单元中,但在Delphi下注册构件时要求提供包含注册代码的源程序文件(.PAS文件),因此,比较好的方式是把构件核心代码编译成.DCU文件或.DLL动态链接库,在注册源文件中只放注册代码和外围程序。下面是注册代码实例:<br> 
type<br> 
TMyPanelΚclass(TCustomPanel)<br> 
TMyLabelΚclass(TCustomLabel)<br> 
procedureRegister;<br> 
implementation<br> 
procedureRegister;<br> 
begin<br> 
RegisterComponents(′Samples′,[TMyPanel,TMyLabel]);<br> 
end;<br> 
&nbsp;&nbsp;&nbsp; 注册过程名必须是Register。过程体中调用Register Compnents,其中的两个参数分别指定Delphi构件工具条页名和要注册的构件类型。如果指定页不存在,Delphi将创建一个新页。<br> 
Delphi环境提供了一个构件生成器(componentexpert),可用来自动生成注册单元。<br> 
构件工具条上每个构件需要一个24×24点阵bitmap图标。图标可以借助Delphi的ImageEditor编辑生成,以.DCR资源文件的形式提供给构件用户,文件与注册单元文件相同。如果不提供此文件,Delphi将采用默认图标。<br> 
<strong><br> 
提供联机帮助</strong><br> 
&nbsp;&nbsp;&nbsp; 
一个成熟的构件,无论是用于开发群体还是用做商品软件,都要有联机帮助信息才能正常使用。Delphi的帮助信息与Windows一般帮助信息结构基本上相同,其编写方法可参见有关资料。但Delphi包含一个特殊的帮助搜索引擎,能跨越多个帮助文件搜索关键词。因此,在构件帮助文件中不仅要有普通K型关键词脚注,还要包含Delphi所用的B型关键词脚注。脚注内容有如下约定:<br> 
在Delphi的对象编辑窗口和代码编辑窗口中,用F1键可以引发帮助搜索引擎,通过B型关键词调出有关帮助主题。为了实现这种帮助机制,需借助KeywordGenerate程序来生成关键词文件(.KWF),与帮助信息文件(.HLP)一起交给构件用户。用户借助HelpInst程序把关键词文件内容并入Delphi主帮助索引文件(.HDX)中。<br> 
&nbsp;&nbsp;&nbsp; 构件联机帮助信息应当与Delphi标准构件帮助信息格式相同。编写帮助文件时最好遵循如下约定:<br> 
&nbsp;&nbsp;&nbsp; 1.每个构件有一个单独的帮助主题(Topic),内容包含构件简介及用户可见的属性、事件和方法列表。<br> 
&nbsp;&nbsp;&nbsp; 2.新增的及修改较大的属性、事件和方法均应有单独的帮助主题,其中应包含所属构件、用途、声明格式等内容。<br> 
&nbsp;&nbsp;&nbsp; 3.每个帮助主题都应包含K型脚注,以便用F1键引发。 </span> 
<hr color="#EE9B73" size="1" width="94%"> 
 
</TD> 
 
</TR> 
</table> 
</BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -