资源目录
压缩包内文档预览:(预览前20页/共77页)
编号:67664802
类型:共享资源
大小:6.93MB
格式:ZIP
上传时间:2020-04-06
上传人:独**
认证信息
个人认证
王**(实名认证)
江苏
IP属地:江苏
20
积分
- 关 键 词:
-
C++Builder
6.0程序设计
Builder
6.0
程序设计
- 资源描述:
-
C++Builder 6.0程序设计,C++Builder,6.0程序设计,Builder,6.0,程序设计
- 内容简介:
-
第10章自定义组件与ActiveX组件 10 1组件与包10 2自定义组件范例10 3ActiveX组件与ActiveForm习题 10 1组件与包 本节介绍BCB组件的一些基本特征以及开发组件的基本步骤 因为组件通常存放在包 Package 中 所以我们还要介绍一点有关包的知识 10 1 1组件是特殊的类组件在BCB中被定义为类 与一般的C 类相比 组件类有以下特点 1 组件类除了拥有数据成员和方法外 更多地使用属性和事件 2 组件类的对象 特别是可视组件对象 除了在程序的运行阶段能正常工作外 还要在程序设计阶段具有一定的交互能力 因此它们具有复杂而精巧的结构 3 组件类在类的声明部分除了具有一般C 类具有的private public protected段外 还有 published段 该段下的成员在程序设计阶段可以用ObjectInspector进行编辑 4 BCB的基础是VCL 所有的组件类都是由VCL中少数几个基类派生的 5 组件类要经过注册和安装才能使用 BCB组件类具有用C 语言写成的源代码 通常 一个组件类的源代码由两个与组件类同名的文件组成 其中一个是头文件 扩展名 h 用于保存有关类成员的声明 另一个是单元文件 扩展名 cpp 用于保存有关类方法与属性的具体实现 如果该组件有一个专用的图标 用于在组件面板上显示 那么该图标文件也应与组件类同名 扩展名为 dcr 用BCB的ImageEditor可生成该类文件 这些文件应放到同一个目录下 10 1 2组件的注册与安装BCB的组件类必须经过编译 注册与安装过程方能使用 经过编译的组件存放在包 Package 中 一个包可以存放许多组件 注册与安装都可以用IDE的菜单命令完成 用户不必了解其实际过程 组件类在完成注册与安装后 就会出现在组件面板上 如果组件没有自己的图标 IDE会为其指派一个图标 通常为该类祖先的图标 10 1 3包的建立与管理包 Package 在BCB中的作用很大 本质上包就是DLL 动态链接库 但其中含有一些只有BCB能识别的格式 它的扩展名也不使用一般DLL常用的 dll而是用 bpl 通常BCB在包里放入经过编译的组件 一个包里面可以放许多组件 IDE提供的有关工具可以方便地从包中动态地存入或取出组件 BCB的包可以分为运行时包与设计时包 通常前者尺寸较小 但仅能用于支持应用程序的运行 而后者则还能用于支持在BCBIDE中进行程序设计 BCB自有的组件大部分都存放在C Windows System下的一组 bpl文件中 其中最主要的是Vcl60 bpl 这些 bpl文件是在BCB安装时复制到System目录的运行时包 BCB编译器可设置 执行Project Options菜单命令设置 是否在链接时将存放在运行时包中的代码加入到 exe文件中 如果设置成不加入包中的代码 则生成的 exe尺寸较小 但必须在目标机器上复制运行时包 或安装BCB 在编译器缺省状态下程序中不会加入运行时包代码 定义包时使用的源文件具有扩展名 bpk 与此相关的还有一个同名的 cpp文件 包的源文件经编译后即成为 bpl文件 对修改后的包应重新编译一次 由用户自定义的组件可以存放到BCB现有的某个包中 也可以放入到一个新建的包中 通常在创建自定义组件时BCB会缺省提供一个名为DCLUSR60的包 新建一个空的包很容易 先执行File CloseAll 关闭当前项目和其它一切文件 再执行File New Other命令 并选择位于 New 页上的Package图标即可自动生成文件 默认的文件名为Package1 Package2 此时 BCB打开一个称为 包管理器 的窗口 有关包的操作都可以在该窗口下进行 如图10 1所示 图10 1包管理器窗口 在包管理器窗口中右击Package1 cpp 执行快捷菜单上的 Open 命令打开源文件 可以看到以下的代码 include pragmahdrstop pragmapackage smart init Packagesource pragmaargsusedintWINAPIDllEntryPoint HINSTANCEhinst unsignedlongreason void return1 我们发现 这是类似DLL框架的一段代码 我们执行File SaveAll保存该文件 通常应该为此创建一个子目录 该文件不需要作任何修改即可编译 编译包时只要在 包管理器 上点击 Compile 按钮即可 10 1 4开发组件的一般步骤自定义一个组件类是有一定难度的 一方面需要精通BCB面向对象编程的语法 另一方面 如果要使被定义的组件具有一定的使用价值 还必须精通某一领域的专业知识 但相对于在某些编程环境下需要使用另一种语言编写组件 在BCB向导的帮助下使用C 语言编写组件还是比较容易的 而且 一旦入了门 就能成为真正的高手 一般 可通过修改现有的VCL组件得到自定义组件 从C 的观点来说就是选择一个现有的VCL类作为自定义组件类的祖先 在继承该VCL类的基础上 增加一些属性或给某些属性赋初值 重置某些方法或属性 以此得到一个新类 BCB的向导可以帮助我们完成这一任务 执行File CloseAll关闭当前项目 然后执行Component NewComponent 菜单命令 此时系统弹出如图10 2所示的 NewComponent 对话框 图10 2 NewComponent 对话框 在AncestorType组合框选择一个VCL类作为我们自定义组件类的祖先 例如可选择TListBox类 在ClassName框内输入自定义组件类名称 例如名称可以为MyListBox 在PalettePage组合框选择组件面板上的一个页 新的组件在安装后将出现在该页上 该项被缺省设置为 Samples 页 如果用户在此框内输入一个新的页名 则生成的代码能在安装过程中为组件面板新建一个页 在Unitfilename框内输入新组件源程序的文件名 文件的扩展名一般由系统自动给出 右侧的 按钮可通过浏览确定存放文件的目录 在SearchPath框输入的是系统在编译 链接时查找文件所需使用的搜索路径 一般由系统自动管理 必要时也可进行修改 当输入以上内容后选择 OK 系统就会生成两个源文件 其中包含了新组件的框架代码 下面是为MyListBox组件生成的两个源文件的清单 MyListBox h文件 ifndefMyListBoxH defineMyListBoxH include include include include classPACKAGEMyListBox publicTListBox private protected public fastcallMyListBox TComponent Owner published endif MyListBox cpp文件 include pragmahdrstop include MyListBox h pragmapackage smart init ValidCtrCheckisusedtoassurethatthecomponentscreateddonothave anypurevirtualfunctions staticinlinevoidValidCtrCheck MyListBox newMyListBox NULL fastcallMyListBox MyListBox TComponent Owner TListBox Owner namespaceMylistbox void fastcallPACKAGERegister TComponentClassclasses 1 classid MyListBox RegisterComponents Samples classes 0 评析 1 头文件中classPACKAGEMyListBox publicTListBox表示新组件MyListBox继承自TListBox类 其中PACKAGE表示组件将存放在包里面 2 文件中 fastcallMyListBox MyListBox TComponent Owner TListBox Owner 为新类定义构造函数 3 void fastcallPACKAGERegister 用于向IDE注册组件 RegisterComponents Samples classes 0 中的参数 Samples 表示要将该组件安装到 Samples 组件页上 用户可在该文件框架内填入代码 这部分的工作是最富于挑战性的 它检验你的面向对象编程的能力和对VCL的理解力 读者可尝试由简入繁 逐步在实践中提高自己编写组件的水平 本章下一节提供的范例有很好的参考价值 希望能仔细阅读并实验 组件编写完成后应保存文件 然后可执行Component InstallComponent菜单命令进行安装 图10 3为 InstallComponent 对话框 系统通常按缺省值填入该对话框的内容 必要时用户可以修改 比如用户可以将该组件存放到前面例子中创建的包文件Package1里面 只要在 Packagefilename 框内输入该包的文件名和路径即可 输入后按 OK 按钮即开始编译和安装 当出现如图10 4所示的信息框时说明安装已完成 图10 4BCB信息框显示组件安装已完成 此时 打开组件面板的Samples页 就能看到该页上增加了一个名为 MyListBox 的图标 因为我们没有专门为新组件提供一个图标 所以系统使用了其祖先类 ListBox 的图标 如图10 5所示 该组件可以添加到窗体上 和BCB的其它组件一起工作 当然实际使用时该组件与TListBox组件毫无区别 这早已在我们的意料之中 因为MyListBox只是简单地继承了TListBox类 图10 5新组件已安装到 Samples 页 10 1 5组件的测试要完整地测试一个组件 必须在其注册 安装完成后进行 但如果组件有问题 就可能在安装时引起失败 安装后的组件修改不便 多次安装 卸载也容易由误操作引起其它错误 因此 明智的做法是先对组件类测试 待基本没有问题了再进行安装 具体可参照以下做法 将待测试组件类的单元文件和头文件放在一个目录下 并在同一目录下新建一个应用程序项目 在该项目中包括组件类的头文件 可使用菜单命令或include语句 在应用程序中动态创建该类的实例 并进行测试以确保该类能正常使用 读者可能会发现 在这种方法下进行的测试是不完整的 因此 组件类在通过了安装前的测试后 一般仍需要在安装完成后继续进行严格测试 10 2自定义组件范例 我们要创建的是一个会移动的标签组件 它继承自TCustomLabel类 该类也是TLabel类的祖先 由于本例仅作为示例 我们尽可能简化它 所以假定移动的方向只能始终固定为从左到右 并且当它移动到窗体右侧时 会重新绕回到左侧 例10 1 我们为组件类取名为TMovingLabel 它将被安装到 Samples 组件页上 为了让标签会自己移动 我们在一个定时器的控制下 每隔一定时间 将标签的Left属性增加一个步长 为了控制移动的步长和速率我们为组件设计了相应的属性 此外 还要有一个MoveEnabled属性用于启动或关闭移动功能 为了示例如何在组件中加入事件 我们设计了一个OnEndReached事件 移动的标签每次到达窗体右端时触发该事件 操作要点 1 建立一个新的子目录MovingLabel 2 在BCB中执行File CloseAll关闭当前项目 然后执行Component NewComponent菜单命令打开创建新组件对话框 3 该对话框的AncestorType选择TCustomLabel StdCtrls ClassName输入TMovingLabel PalettePage选择Samples Unitfilename通过浏览定位到MovingLabel子目录 并使用系统缺省提供的文件名MovingLabel cpp 按 OK 即可生成源文件 4 参照下列程序清单在组件类源文件框架上进行修改 修改涉及到在TMovingLabel中添加一个定时器 以及为该类定义新属性 事件及重载构造函数等 5 执行File Save菜单命令保存文件 6 执行Component InstallComponent菜单命令安装该组件 安装完成后即能使用 本范例源文件清单如下 文件MovingLabel h ifndefMovingLabelH defineMovingLabelH include include include include classPACKAGETMovingLabel publicTCustomLabel private TTimer Timer 加入一个定时器用于控制闪烁boolFMoveEnabled 新增的数据成员 给属性MoveEnabled存放数据intFMoveRate 新增的数据成员 给属性MoveRate存放数据intFMoveStep 新增的数据成员 给属性MoveStep存放数据TNotifyEventFOnEndReached 用于事件OnEndReached的函数指针 protected void fastcallSetMoveEnabled boolAMoveEnabled 用于写属性MoveEnabledvoid fastcallSetMoveRate intAMoveRate 用于写属性MoveRatevoid fastcallOnTimer TObject Sender 定时控制移动public fastcallTMovingLabel TComponent Owner published propertyboolMoveEnabled read FMoveEnabled write SetMoveEnabled default true 声明MoveEnabled属性 propertyintMoveStep read FMoveStep write FMoveStep default 4 声明MoveStep属性 propertyintMoveRate read FMoveRate write SetMoveRate default 100 声明MoveRate属性 propertyTNotifyEventOnEndReached read FOnEndReached write FOnEndReached 声明OnEndReached事件 以下属性与事件在TCustomLabel中已有定义 在 published段再次声明后 propertyAlign 就能在设计阶段通过ObjectInspector进行设置 propertyAlignment propertyAutoSize propertyCaption propertyColor propertyEnabled propertyFont propertyShowHint propertyTransparent propertyVisible propertyWordWrap propertyOnClick propertyOnMouseDown propertyOnMouseMove propertyOnMouseUp endif 文件MovingLabel cpp include pragmahdrstop include MovingLabel h pragmapackage smart init staticinlinevoidValidCtrCheck TMovingLabel newTMovingLabel NULL fastcallTMovingLabel TMovingLabel TComponent Owner TCustomLabel Owner FMoveEnabled true 为属性MoveEnabled赋初值FMoveRate 100 为属性MoveRate赋初值FMoveStep 4 为属性MoveStep赋初值Timer newTTimer this 创建定时器对象实例Timer Interval MoveRate 为定时器Interval属性赋值Timer OnTimer OnTimer 为定时器的OnTimer事件设置处理句柄 void fastcallTMovingLabel SetMoveEnabled boolAMoveEnabled FMoveEnabled AMoveEnabled if ComponentState Contains csDesigning 判断运行环境是否为BCB设计阶段return 在设计阶段不执行以下代码Timer Enabled FMoveEnabled 设置定时器的Enabled void fastcallTMovingLabel SetMoveRate intAMoveRate Timer Interval FMoveRate AMoveRate 设置MoveRate控制定时器间隔 void fastcallTMovingLabel OnTimer TObject Sender if ComponentState Contains csDesigning Timer Enabled false return 使设计阶段不执行后面语句 Left MoveStep 标签向右移动一步长if Left Parent Width Left 0 if OnEndReached OnEndReached this 调用OnEndReached事件 namespaceMovinglabel void fastcallPACKAGERegister TComponentClassclasses 1 classid TMovingLabel RegisterComponents Samples classes 0 为了测试该组件 我们新建一个应用程序项目 在窗体Form1上放入一个MovingLabel组件 在ObjectInspector中输入它的Caption属性为 ThisisaMovingLabel 再往窗体上放一个按钮以及一个滚动条 将Form1的AutoScroll属性设置为false 将该滚动条的MAX属性设置为1000 MIN属性设置为25 我们还可以在ObjectInspector中设置MovingLabel1组件的OnEndReached事件 以下是测试程序代码 void fastcallTForm1 Button1Click TObject Sender MovingLabel1 MoveEnabled MovingLabel1 MoveEnabled void fastcallTForm1 ScrollBar1Change TObject Sender MovingLabel1 MoveRate ScrollBar1 Position void fastcallTForm1 MovingLabel1EndReached TObject Sender MessageBeep 0 运行该程序 点击按钮和移动滚动条能分别测试该组件的两个属性 每当标签移动至窗体右端会发出 嘟 的一声 显然这是OnEndReached事件起了作用 评析 1 BCB提供了几个名称以 TCustom 开头的类 它们是TCustomLabel TCustomEdit TCustomListBox等 这些类的主要作用就是按用户需要派生新类 从技术上讲TMovingLabel派生于TCustomLabel而不是Tlabel 可以具有更多灵活性 2 为了新增一个MoveRate属性 我们首先为TMovingLabel类加入一个数据成员FMoveRate 按VCL习惯 该数据成员的名称为相应属性名之前加一个F 但这一规则不是强制的 我们把FMoveRate放在 private 段内以保护其中的数据 然后在public段内用 propertyintMoveRate read FMoveRate write SetMoveRate default 100 语句声明MoveRate属性 该语句表明MoveRate属性可读写 其数据存放在FMoveRate内 对该属性进行写操作时要调用SetMoveRate方法 属性缺省值设置为100 我们还要在类声明的protected段内加入对SetMoveRate方法的声明 并在单元文件中实现该方法 MoveEnabled属性也是以类似方法定义的 读者从中可学会在BCB类中定义属性的方法 3 propertyTNotifyEventOnEndReached read FOnEndReached write FonEnd Reached 语句定义OnEndReached事件 如本篇第一章所述 VCL是将事件定义为属性的 TNotifyEvent是最常用的事件类型 它只允许处理函数带一个TObject类型的参数 如果需要其它形式的参数 可以自定义一个事件类型 必须是某种函数指针类型 4 fastcallTMovingLabel TMovingLabel TComponent Owner TCustomLabel Owner 语句为TMovingLabel类的构造函数 该函数首先调用TCustomLabel类的构造函数 然后对有关属性进行初始化 并创建了一个定时器用于标签移动的控制 其中 语句 Timer OnTimer OnTimer 为定时器的OnTimer设置事件句柄 5 void fastcallTMovingLabel SetMoveEnabled boolAMoveEnabled 方法用于对MoveEnabled属性的写操作 Timer Enabled FMoveEnabled 语句使定时器的开关由属性MoveEnabled的值确定 6 void fastcallTMovingLabel OnTimer TObject Sender 定义OnTimer方法 使定时器按时调用该方法改变标签的位置以达到移动的效果 由于该组件用于程序设计阶段时不需要标签移动 由于种种原因 设计时不便支持组件的移动 所以用 if ComponentState Contains csDesigning 语句进行判别是否处于设计阶段 若是 则执行 Timer Enabled false 语句关闭定时器使随后不再产生OnTimer事件 7 在 OnTimer方法中 if OnEndReached OnEndReached this 语句是触发OnEndReached事件的代码 if Left Parent Width 语句是该事件触发的条件 Parent在这里代表MovingLabel组件所在的容器 如Form1 8 对于在应用程序运行过程中产生的事件 如上述OnEndReached 采用本例的方法 对于可直接由Windows消息触发的事件 则应使用BEGIN MESSAGE MAP宏进行消息映射 有兴趣的读者可参阅Help或其它有关材料 10 3ActiveX组件与ActiveForm ActiveX从本质上讲是MicrosoftCOM技术的一部分 ActiveX组件有尺寸小 交互性强 与编程语言无关等特点 特别适合在网络上运用 ActiveForm则是特殊的ActiveX组件 在Intranet上的使用价值较高 10 3 1将BCB组件转换成ActiveX组件一般来说 编写ActiveX组件不是一件简单的工作 但在BCB的支持下 用户可以很方便地将一个BCB组件转换为ActiveX组件 具体做法如下 在BCB中关闭现有项目 执行File New Other菜单命令 在 NewItems 窗口中选择ActiveX页 再选中ActiveXControl对象图标 当点击 OK 按钮后出现如图10 6所示的对话框 在该对话框的VCLClassName框内选取一个现有的VCL类 可以是已安装的自定义类 的名称 在NewActiveXName框输入该ActiveX组件的名称 其余几个框可以使用系统默认值 按 OK 按钮即能由系统自动生成源代码文件 将这些文件保存到某一目录下 然后执行Project BuildProject菜单命令编译该项目 当编译完成后就可得到ActiveX的 ocx文件了 图10 6创建ActiveX组件 10 3 2ActiveForm及应用ActiveForm是一种特殊形式的ActiveX组件 它是由BCB 或Delphi 的窗体类 即TForm的派生类 转换而成的 我们可以利用BCB强大的可视化开发环境快速创建具有特定功能的窗体类 然后在BCB 向导 的帮助下将该窗体转换为ActiveForm ActiveForm通常用在网络上 优点为开发方便 运行效率高 界面美观等 缺点为只能在Windows平台上运行 文件较大影响传输速度等 但如果在企业内部的Intranet网上使用则能扬长避短 在BCB中创建一个ActiveForm的步骤如下 1 为将要创建的ActiveForm建立一个子目录 在BCB中关闭现有项目 2 执行File New Other命令并选择ActiveX页 选中ActiveXForm对象图标后点击 OK 此时出现如图10 7所示的对话框 在对话框内填入NewActiveXName等内容 按 OK 后就由系统生成一个ActiveForm空窗体和相应的源代码 3 在该空窗体内放入各种组件 为某些事件编写代码 就像设计一个普通的BCB窗体那样去做 但应注意不要随意修改由系统生成的框架代码 4 窗体设计完成后 将文件保存到上述子目录 图10 7创建ActiveForm对话框 5 执行Project BuildProject菜单命令编译该ActiveForm项目 6 执行Project WebDeploymentOptions菜单命令 打开 WebDeploymentOptions 对话框进行设置 如图10 8所示 该对话框内需要填写TargetURL等项 由于是在单机环境下开发ActiveForm 为测试方便可将Targetdir TargetURL和HTMLdir都设置为该ActiveForm项目的目录 如D ActiveForm 若选择UseCABfilecompression框可使生成的库文件为压缩文件 有利于网络传送速度的提高 图10 8
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。