PFC编程快速入门☆☆☆

PFC编程快速入门前言及PFC的编程特点概述(暂不详述) 俗话说:实践出真知所以,笔者一开始并不打算和大家讲什么高深的理论,而是和大家从PFC的实际应用编程着手,带领大家一步一步由浅入深、由点到面地用PFC编写一个实用的MIS(信息管理系统)至于理论方面的知识,在程序编写的过程中遇到时才结合应用中的实例给大家讲解当你跟着笔者完成这个PFC实战之旅后,相信你已经能够系统地掌握PFC的编程思想和方法了 虽然现在市面上已经有一些关于PFC的书了,但它们都是着重于介绍理论的,对于实际应用于编程的方法的书则没有由于缺少实践机会,令读者读起来比较难明所以,我想,我们可以写一本一开始就以PFC的实际应用编程为主,带领读者一步一步由浅入深、由点到面地用PFC编写一个实用的MIS的书至于理论方面的知识,在程序编写的过程中遇到时才结合应用中的实例给大家讲解当读者依书完成这个PFC的应用编程后,相信已经能够系统地掌握PFC的编程思想和方法了然后,我们可以将PFC中各个对象、服务中常用、主要、重要的功能介绍给大家(就不像那本PFC手册那样,什么都写),可能更受大家的欢迎最后,还以介绍一些高级的编程方法及理论,如:快速开发的理论等。
在开始编程之前,请大家先准备好以下的编程环境: 1、PowerBuilder7.0,并且安装了最新的补丁: 2、数据库系统: 3、数据库:本文所有的例子均是基于该数据库进行的 作为一种可视化的、面向对象的快速应用开发(RAD)工具,PowerBuilder已被广大数据库应用于开发人员所使用,并获得好评PowerBuilder全面支持面向对象编程,是集成强大并易于使用的编程语言,内置包括数据窗口(DataWindow)在内的多种对象类,可以方便地访问数据库 对于一个数据库应用系统来说,选择PowerBuilder开发工具进行程序设计与开发,是一种快速、高效、省时、省力的方法PowerBuilder以简洁、直观、实用的编程方式为程序员节约了大量的时间和精力,使得程序员可以把大部分业务放在提高程序执行效率和完善系统功能上,这样做的结果使程序开发时间缩短,开发成本降低,程序编制质量也会大大提高 开发一个小型的数据库应用系统,使用PowerBuilder提供的菜单编辑器、窗口编辑器、数据窗口生成器等可视化编程工具,结合PowerBuilder Script脚本语言直接开始程序的编制工作,并不会影响程序的开发效率。
然而,对于一个大(中)型数据库应用系统,并使用这种原始的编程方式进行开发与充分利用PowerBuilder提供的基础类库进行开发相比,在程序开发时间、效率、成本等方面,都会有明显的差别 PowerBuilder基础类库(PFC)是基于面向对象程序设计的思想而设计的,PFC封装PB Script它包含了大多数应用共有的内容,例如各种菜单、窗口、用户对象、数据窗口以及错误处理、报表预览、打印、主细录入、查询等等通过继承,程序员可以方便地把这些类加载到自己的程序中,从而达到提高开发效率的目的 作为一种可视化的、面向对象的快速应用开发(RAD)工具,PowerBuilder已被广大数据库应用于开发人员所使用,并获得好评PowerBuilder全面支持面向对象编程,是集成强大并易于使用的编程语言,内置包括数据窗口(DataWindow)在内的多种对象类,可以方便地访问数据库 对于一个数据库应用系统来说,选择PowerBuilder开发工具进行程序设计与开发,是一种快速、高效、省时、省力的方法PowerBuilder以简洁、直观、实用的编程方式为程序员节约了大量的时间和精力,使得程序员可以把大部分业务放在提高程序执行效率和完善系统功能上,这样做的结果使程序开发时间缩短,开发成本降低,程序编制质量也会大大提高。
开发一个小型的数据库应用系统,使用PowerBuilder提供的菜单编辑器、窗口编辑器、数据窗口生成器等可视化编程工具,结合PowerBuilder Script脚本语言直接开始程序的编制工作,并不会影响程序的开发效率然而,对于一个大(中)型数据库应用系统,并使用这种原始的编程方式进行开发与充分利用PowerBuilder提供的基础类库进行开发相比,在程序开发时间、效率、成本等方面,都会有明显的差别 PowerBuilder基础类库(PFC)是基于面向对象程序设计的思想而设计的,PFC封装PB Script它包含了大多数应用共有的内容,例如各种菜单、窗口、用户对象、数据窗口以及错误处理、报表预览、打印、主细录入、查询等等通过继承,程序员可以方便地把这些类加载到自己的程序中,从而达到提高开发效率的目的一、PFC编程的总原则: 1、任何时候也不能对以“pfc”开头的库文件进行修改 2、必须遵守PFC的命名约定 3、任何时候创建对象(如:菜单、窗口)时,都不要用“New”(新建),而应该用“Inherit”(继承),从PFC的扩展层中继承父类 4、任何时候使用控件时,都不要用标准的控件,而应该选“user object”,再从PFC的扩展层中选择相应的对象。
5、(更多的有待补充)二、PFC的命名约定Naming conventions命名约定:Object naming conventions对象命名约定PFC uses the following prefix standard for object names:PFC使用以下的前缀作为对象命名的标准: pfcobject_type_objectname Pfc_对象类型_对象名称where:其中:?pfcobject indicates whether the object is part of the PFC level or the extension level. Objects that are part of the PFC level have the prefix PFC_ “pfcobject”指出该对象是PFC层的对象如果该对象是PFC层的,则该对象的名称必须以“PFC_”作为前缀如果是非PFC层的对象,则可以省略该前缀type indicates the object type “type”指出该对象的类型This table describes the object types.下表列出了所有对象的命名规则:Prefix Description前缀 说明m_ Menum_ 菜单(Menu)n_ Standard class user objectn_ 标准类用户对象(Standard class user object)n_cst Custom class user objectn_cst 定制类用户对象(Custom class user object)s_ Global structures_ 全局结构体(Global structure)u_ Visual user objectu_ 可视用户对象(Visual user object)w_ Windoww_ 窗口(Window)For example:例如:?Pfc_w_master is the master window and is in the PFC level Pfc_w_master 代表PFC层的主窗口对象。
Pfc_u_tvs is the TreeView visual user object and is in the PFC level Pfc_u_tv 代表PFC层的树状浏览(TreeView)可视用户对象U_dw is the DataWindow visual user object and is in the extension level U_dw 代表扩展层的数据窗口(DataWindow)可视用户对象N_cst_dwsrv is the custom class user object for DataWindow services and is in the extension level N_cst_dwsrv 代表扩展层的提供数据窗口服务(DataWindow services)的定制类用户对象N_tr is the transaction standard class user object and is in the extension level N_tr 代表扩展层的事务处理标准类用户对象Variable naming conventions变量的命名约定:PFC uses the following standard for variable names:PFC使用以下的前缀作为变量命名的标准:
对象函数(object functions):使用“of_”作为函数的前缀 三、PFC的面向对象特点 PFC的面向对象特点是学习PFC编程中一定要重点掌握的知识可以这么说:PFC的应用,实际上就是面向对象技术的应用PFC的一切,就是面向对象技术PFC是PowerBuilder面向对象技术的体现 由于PFC采用了面向对象的程序设计方法,程序的封装性和继承性使得程序的后期维护工作变得更为轻松,性能价格比更为优越这完全得益于面向对象这种程序设计方法的合理性,它把一个复杂的问题分解成与该问题相关的各个部分的子模块,再把这些子模块抽象为对象若一个由祖先继承而来的对象出现错误,可以简单地对该于对象进行修改而不必去涉及其祖先对象,反之,若对处于同一层次的全部子对象进行类似的修改,可直接修改其祖先对象 PowerBuilder面向对象的特点主要体现在用户对象的技术运用上PFC基础类库把PowerBuilder的多种对象以类的形式存储在库文件中,要正确有效地利用PowerBuilder基础类库进行程序的开发设计,必须了解面向对象的编程技术,了解PFC基础类库的面向对象特点 PowerBuilder把一些常用的、具有共性特征的对象(例如:窗口、菜单、数据窗口、用户对象等)提炼出来,并在每个对象中封装了不同的服务,构造了PFC基本类库。
PFC基础类库完美地体现了面向对象程序设计的三方面重要特征: ·继承性(Inheritance) ·封装性(Encapsulation) ·多态性(Polymorphism) 用户对象是PFC面向对象的具体表现,PFC的面向对象特点完全在用户对象中表现出来 以下着重介绍PFC中常用的用户对象: 用户对象有两种类型:可视的用户对象(Visua1 user object)和类用户对象(Class user object) (1)可视用户对象指的是一个可重用的可视控件或一个含有预定义行为的可视控件 PFC包含了两种类型的可视用户对象: 标准可视用户对象 PFC标准可视用户对象由PowerBuilder的标准可视控件继承而来,通过扩充标准控件的定义,完成特定的功能每个PFC的标准可视用户对象都与窗口控件进行通信,这些对象中包含了预定义的程序,实现各种PFC应用服务 定制可视用户对象 PFC定制的可视用户对象是将几个可视控件打包成一组的对象,它将多种服务有计划地组合在一起,完成一个复杂的功能 (2)类用户对象指的是在不使用可视用户对象时,完成一个执行过程而定义的可重用的不可视控制,它是不可见的,无法在窗口上直接看到,需通过程序来调用。
PFC包含了两种类型的类用户对象: 标准的类用户对象 PFC标准的类用户对象由PowerBuilder的不可视标准控件继承而来,通过扩充标准控件的定义,完成特定的功能 PFC为事务传输、错误处理和其他所有的扩展系统对象都提供了标准的类用户对象 定制的类用户对象 从PowerBuilder的非可视对象类中继承了各种定义,封装了数据和代码 定制的类用户对象允许程序员定义自己的对象类 PFC使用定制的类用户对象执行多种服务,它还提供了一些接口参数,程序员可以通过这些接口参数与对象内部的实例变量、函数和事件进行通信 应用PFC编程时,在面向对象程序设计的三方面主要特征中,我们接触最广泛的是“继承”特征了可以这么说:在构成应用界面的每一个元素,如:窗口、菜单、控件等等,无一不是从PFC的对象中继承而来的所以,在这里,将给大家详细讲下PFC中的继承特性,请大家一定要注意体会掌握,因为,在以后的编程中,你无时无刻不都在与“继承”打交道 继承是一对象获取另一对象之性质的过程,它使得那些与基本类共享的性质能很方便地进行延续和扩展继承对象类具备被继承对象类的所有属性、变量、函数、结构、控件和程序。
对祖先对象的修改会使其所有子孙对象做相应的修改,子孙对象可修改或扩充祖先对象的属性和服务,但不能对祖先对象的控件进行删减正是这种继承机制才使得一个对象成为某一基础类的实例 继承具有以下优点: ·可充分利用系统资源,减少程序的重复开发,大大提高了开发效率; ·使应用的对象保持一致,维护了系统的整体一致性; ·减少了人为程序错误的发生概率; ·使程序更易于维护 在PFC基础类库中,各种基础类的对象均可以被继承,如窗口、菜单、结构、数据窗口、用户对象等等由继承而来的子孙对象包含了祖先对象的所有属性、变量、函数、结构、控件和程序,并可对它们进行修改和扩充对于一个通过继承创建的后代窗口,可以进行如下进一步的处理:改变窗口的属性;在窗口中增加新的控件;在窗口中修改现存控件;改变窗口的大小和位置;改变窗口中控件的大小和位置;为窗口及控件编制新的处理程序;为窗口和控件扩展继承来的处理程序;用新的处理程序覆盖继承来的处理程序;引用祖先的函数、结构和变量;为该窗口定义新的函数、结构和变量 对于一个通过继承创建的后代菜单,可以进行如下进一步的处理:改变菜单项的属性;在菜单中插入菜单项;修改菜单项;为没有处理程序的菜单项增加处理程序;扩展继承来的处理程序;用新的处理程序覆盖继承来的处理程序。
对于一个通过继承创建的后代用户对象,可以进行如下进一步的处理:改变属性和变量的值;为没有事件处理程序的事件增加处理程序;扩展继承来的事件处理程序;用新的处理程序覆盖继承来的处理程序;为可视用户对象添加控件;引用祖先的函数、事件和结构 值得注意的是,对于继承来的可视对象不能对其包含的控件进行删减,若某一控件确实不用,可通过修改其属性使之不可用或不可见 四、PFC的结构是一种基于服务的结构(Service-Based Architecture),PowerBuilder提供了各种类库和它们的源代码,程序员可以很方便地对类中的程序和控件进行修改和扩充,使之符合自己的需求 PFC基础类库基于服务的结构模式为基础类库的扩展提供了广阔的空间,它包含了PowerBuilder提供的多种对象以及它们各自所封装的多种服务,分别完成特定的功能 在PFC对象内封装的函数、事件和实例变量能够完成许多与应用环境无关的操作,称之为服务程序员通过调用基础类对象来获得封装在对象中的服务 具体的服务有以下几种:应用服务;数据窗口服务;菜单服务;窗口服务;尺寸调整服务;转换服务;日期/时间服务;文件服务;INI文件服务;数据服务;平台服务;选择服务;SQL解析服务;字符串处理服务;元类服务;逻辑单元服务等。
四、实战之旅: 一、更新库的搜索路径 1、为应用程序创建一个新的库文件打开库管理面板(Library),点击工具条上的“Create Library”图标,并从弹出的“Create Library”对话框(如图所示)中选择新库的保存路径,输入新库的名称这里我们假设将库保存到D:根目录下,并命名为:Design.pbl 2、创建应用对象点击工具条上的“New”图标,从弹出的对话框中选择“Start Wizards”页面,双击“Application”图标我们将看到如图所示的界面,在“Application Name”下输入应用对象的名称,我们这里命名为:design;并在“Library”下选择将该应用对象保存到什么库中我们这里当然是将其保存到D:根目录下的Design.pbl中单击“Finish”完成应用对象的创建 3、选择“File”菜单下的“Library List...”命令,在弹出的“Library List”窗口中单击“Browse...”按钮,如图所示 4、从弹出的“Select Library”对话框中选择需要的库文件:进入存放PFC库文件的目录下,按下[Ctrl]键并点击鼠标来选中下列文件:Pfcapsrv.pbl、PfcDwsrv.pbl、Pfcmain.pbl、Pfcutil.pbl、Pfcwnsrv.pbl、Pfeapsrv.pbl、Pfedwsrv.pbl、Pfemain.pbl、Pfeutil.pbl、Pfewnsrv.pbl。
如图所示 5、点击“Open”按钮,选中的库文件就显示到库文件的搜索路径列表中 6、点击“Apply”按钮,PowerBuilder将上述PFC文件添加到应用文件列表中 ***理论知识:(这里要介绍的知识比较多,主要涉及到PFC的面向对象的特点、PFC各个库文件所包含的内容及作用、如何扩展PFC、如何升级PFC等,我还没整理好 根据基础类实现的阶段划分为如下两类: ·基础类库文件:放置基础类对象的原始设计; ·扩展基础类库文件:放置继承基础类进行扩展设计后的扩展对象 没有任何一种类库能够包容用户所有的需求,典型的做法是把PFC库中的对象进行修改和扩充,使它和应用中的函数、对象融合为一体,如果没有基础类库的扩展层,就会导致这样一个问题:如何升级一个新版的PFC库,新版的应用将覆盖以前定制的类,迫使你重新进行手工改动以适应新的版本 PFC利用其继承性建立了扩展层,如下表所示所有的扩展对象都放置在相对独立的PBL文件中,对扩展层可方便地进行升级和更新,而不会对其祖先层产生任何影响 表 PFC提供的服务在PBL库文件中的分布内容 祖先层 扩展层应用和全局性服务 PFCAPSRV.PBL PFEAAPSRV.PBL数据窗口服务 PFCDWSRV.PBL PFEDWSRV.PBL可视的和标准的类用户对象 PFCMAIN.PBL PFEAMIN.PBL实用程序的服务 PFCUTIL.PBL PFEUTIL.PBL窗口服务 PFCWNSRV.PBL PFEWNSRV.PBL 祖先层类库中的对象包含了所有的实例变量、事件和函数;扩展层类库中的对象是祖先库中相应对象的子孙对象,通过继承它们可以调用祖先对象的实例变量、事件和函数。
可以使用PowerBuilder Browse浏览子孙对象内含的实例变量、事件和函数 使用扩展层有两个突出的优点: ·可以增加控件、部件和特殊逻辑的应用到扩展层对象; ·对扩展层进行升级不会影响类库程序的兼容性 需要注意的是: (1)为保持与旧版程序的兼容,在PFCOLD.PBL中存放了新版已放弃使用的对象如果运行一个旧版的PFC程序,需要将PFCOLD.PBL加入到应用的搜索路径中去; (2)程序员可以通过修改扩展层的对象来定制PFC应用,但不能去修改祖先层的对象例如:应用程序可以使用扩展层的用户对象并且从扩展层继承一个窗口 基础类库的部件 PFC由以下几个部件构成: ·一组PBL类库文件; ·一个PFC数据库; ·一组支持快速开发的PBL库(Quickstart PBLS); ·PFC编程示例; ·一个简单的应用 PFC基础类库的库结构及其存放位置 PowerBuilder的基础类库文件和扩展基础类库文件共有十三个,根据所包含基础类的不同功能进行了划分,其中以PFC开头的是基础类库文件,以PFE开头的是扩展基础类库文件,具体说明如下表所示 表 PowerBuilder基础类库在PBL文件中的分布库文件名 说 明 安装路径PFCMAIN.PBL 包含标准类用户对象、窗口对象、菜单 ..\pb6\adk\pfcPFEMAIN.PBL 对象和标准可视类用户对象 ..\pb6\adk\pfcPFCAPSRV.PBL 包含提供应用服务所必须的定制类用 ..\pb6\adk\pfcPFEAPSRV.PBL 户对象 ..\pb6\adk\pfcPFCDWSRV.PBL 包含提供数据窗口服务需要的定制类 ..\pb6\adk\pfcPFEDWSRV.PBL 用户对象 ..\pb6\adk\pfcPFCWNSRV.PBL 包含窗口服务需要的定制类用户对象 ..\pb6\adk\pfcPFEWNSRV.PBL ..\pb6\adk\pfc PFCUTIL.PBL 其他服务需要的对象,例如DEBUG服 ..\pb6\adk\pfcPFEUTIL.PBL 务和SQL测试服务等 ..\pb6\adk\pfcPFESECAD.PBL 包含安全管理服务需要的各类对象 ..\pb6\adk\pfc\securityPFCECSC.PBL 包含安全检测需要的各类对象 ..\pb6\adk\pfc\securityPFCOLD.PBL 存放新版PB基础类库淘汰的各种对象 ..\pb6\adk\pfc 注:基于PowerBuilder5.0版基础类库开发的应用升级到6.0版时,用户必须将PFCOLD.PBL添加到检索路径当中才能够顺利地实现升级。
以上是PowerBuilder基础类库在PBL文件中的分布 如何安装PFC的升级版 在PowerBuilder从一个正式版本升级到另一个正式版本时,还定期发布一些修正版本作为PowerBuilder升级版的附加部份,每个修正版也包括了新的PFC升级版,对使用旧版PFC编制的应用程序来说,将面临一个PFC的升级问题但由于PFC这种将不同层次的对象存放在不同的库文件中给我们的升级带来了极大的方便 这可能出现以下两种情况: (1)使用旧版PFC时,并没有对PFC的祖先层和扩展层做任何扩充和修改,只是直接通过继承使用PFC如果是这种情况,简单地安装新版的文件覆盖旧版的文件 (2)使用旧版PFC时,创建了一个或多个中间扩展层,或对PFC的扩展层进行了修改和扩充如果是这种情况,需确保新建的中间层和所做的扩充不被新版程序覆盖可以按以下步骤进行版本升级: a. 将所有的PFC扩展文件备份到另外一个目录,确保新程序安装时不被覆盖 b. 查看当前的版本信息可以在当前PFC的Readme.txt文件中找到有关的版本信息,或者在pfc_n_cst_debug中定义的实例变量majorrevision . minorrevision . fixesrevision中得到当前的版本信息。
c. 运行新版的安装程序,用新的PFC文件覆盖旧的文件,PFC祖先层得到更新 d. 合并新的扩展层对象和旧的扩展层对象查看新版PFC的Readme.txt文件,有一个新增扩展层对象的列表,可用以下两种方法进行合并: <1>把新增的扩展层对象全部全部复制到以前定制的PFC扩展层PBL文件中从新版的PFC扩展层PBL文件中找出新添加的对象,并反它复制到以前定制的PFC扩展层PBL文件中然后将新版的PFC扩展层文件移走,将备份的扩展层文件恢复到PFC路径下; <2>将定制的对象复制到新版的PFC扩展层中将备份的PFC扩展层PBL文件中的所有对象复制到新版PFC的扩展层PBL文件中 e 启动PowerBuilder f (可选地)根据情况更新应用物搜索路径 g 打开库管理面板,将应用重建 二、使用n_tr与SQLCA建立链接 1、打开应用对象面板,打开“Properties”(属性)设置窗口 2、点击“General”页面的“Additional Properties”按钮,我们将看到如图5所示的设置窗口 3、切换到“Variable Types”标签页,,如图6所示 4、将“SQLCA”下的输入框中的“transaction”改为“n_tr”。
5、点击“OK”按钮,返回到应用对象设计面板,保存修改 ***理论知识:关于n_tr n_tr是一个从系统事务对象继承而来的定制的事务对象这个定制的事务对象中包含了实例变量、事件和函数,扩展并封装了数据通信服务 n_tr提供了一套标准的函数完成数据库的链接、断开、提交和恢复,可帮助程序员管理事务对象 程序员可用n_tr内的函数代替原先的SQLCA事务对象管理命令例如:链接数据库用of_Connect函数取代CONNECT命令语句 假设应用程序使用了多个事务对象,程序员可以使用事务对象注册服务提供的函数,完成对多个事务对象的管理如:提交所有打开的事务或回滚所有打开的事务 三、创建一个应用管理器 ㈠关于应用管理器: PFC在应用管理器中控制各种应用的处理过程这策略的优点有:1、可扩充性;2、可重用性 ㈡我们通过继承n_cst_appmanager创建应用管理器具体步骤如下: 1、点击工具条上的“Inherit”(继承)按钮,弹出“Inherit From Object”对话框,如图所示 2、在“Application Libraries:”下的库文件列表中选中Pfeapsrv.pbl,在显示的用户对象列表中选中。
然后,在显示的用户对象列表中选中“n_cst_appmanager”,点击“OK”按钮,将出现如图所示的用户对象设计面板 3、保存该用户对象:将其保存到Design.pbl库中,命名为:n_cst_designmanager ㈢应用管理器一般用于完成以下功能: 1、初始化应用程序的全局变量,如:帮助文件名;INI文件名;注册信息等等在Constructor事件中完成) 2、(可选)控制用户的登录在pfc_open事件中完成) 3、使用事务对象注册服务注册SQLCA如果需要控制用户的登陆,则该事件在pfc_LogonDlg事件中写,否则在pfc_open中写 4、打开应用程序的初始化窗口这一事件一般就在pfc_open事件中完成 具体分析及代码: 1、Constructor事件的代码: this.of_SetAppIniFile("Design.ini") this.of_SetHelpFile("Design.hlp") this.of_SetLogo("Design.bmp") this.of_SetCopyRight("CopyRight by BS2001") this.of_SetVersion("版本 0.1") ***理论知识: 注意以述代码,这里使用了调用PFC对象里封装了服务、功能的最基本、直接的方法:通过调用PFC函数启用相应功能。
几乎所有的PFC函数都是对象函数,这些函数都定义在PowerBuilder的对象(如:窗口、菜单和用户对象)中封装在PowerBuilder的对象中的函数可以使用户很快地明白该对象提供了什么样的功能 PFC函数使用了Set/Get/Is的命名规则来控制对实例变量的访问: of_Set 函数可设置实例变量的值 of_Get 函数可访问非布尔型的实例变量 of_Is 函数可确定布尔型的实例变量的状态值 对于其他类型的实例变量,例如公用的实例变量,可以直接对它们进行操作此外,还有一些变量仅供内部使用,外部函数不需也不能对它们进行操作 调用PFC对象函数的注意事项: (1)首先要确信已创建了该对象的一个实例 PowerBuilder在窗口打开时创建窗口、菜单和可视用户对象,还可以使用of_Setservicename函数(定义在u_dw、n_cst_appmanager和w_master中)创建更多的类用户对象例如,u_dw对象函数产生一个排序的服务并在实例变量inv_sort中存入一个该服务的引用,程序员可以把调用这个函数的代码写在数据窗口的Constructor事件中如: this.of_Setsort(TURE) 一些PFC对象使用了PowerBuilder的自动实例化特性,这些对象没有设置实例化函数,PowerBuilder在使用它们定义一个变量时自动为其创建实例对象。
(2)在应用程序中正确地调用对象函数 下面的例子使用了排序服务,指定了按数据窗口的列名进行排序、按显示的值或点击的列进行排序,当用户选择菜单条的“View”-“Sort”项时,显示一个具有拖动风格的对话框: this.inv_sort.of_SetColumnNameSource(This.inv_sort.HEADER) this.inv_sort.of_SetUseDisplay(TRUE) this.inv_sort.of_SetColumnHeader(TRUE) this.inv_sort.of_Style(This.inv_sort.DRAGDROP) 2、控制用户的登陆: 在应用管理器的pfc_open中写如下代码: integer li_rc li_rc=of_LogonDlg() if li_rc=1 then //写成功登陆的代码... open(w_design_frame) //这是最常见的成功登陆后的事件:完成上述第4步的工作:打开应用程序的初始化窗口具体分析见下面的“创建一个框架(frame)窗口”部份 end if 代码分析: of_LogonDlg函数的使用:该函数会调用w_logon(PFC中的登陆窗口)。
当用户输入的必要信息:用户名称及登陆密码后,并按下该窗口中的“确定”按钮,程序会调用该窗口的pfc_default事件,其中一行关键代码会调用应用管理器中的pfc_Logon事件,并会传递两个参数:sle_userid.text和sle_password.text给pfc_Logon事件而且,w_logon的pfc_default事件会接收pfc_Logon的返回值作相应的处理,主要是:用户输入信息合法的处理及如果用户输入的信息不合法,还可以重试的次数(详见以下的代码分析)当w_logon关闭时,它会返回一个整型的值给of_LogonDlg:返回值为1时,代表用户信息合法;为0时,表示用户按了“取消”按钮,取消登陆;为-1时,表示用户信息不合法所以,在调用of_LogonDlg后,可以作相应的处理,见上述代码 注意:如果你调用了of_LogonDlg函数,一定要在应用管理器的pfc_Logon事件中写相应的连接数据库的代码,也就是完成第3步的工作:使用事务对象注册服务注册SQLCAof_LogonDlg执行的第一个代码就是调用pfc_Logon事件初始化登陆参数见以下代码: 在应用管理器的pfc_LogonDlg中写如下代码: SQLCA.DBMS = "ODBC" SQLCA.AutoCommit = False SQLCA.DBParm = "ConnectString='DSN=New_City;UID=' " + as_userid + " ' ;PWD=' " + as_password + " ' '" //以下4行代码就是判断是否成功登陆,如果是,则返回1给w_logon,否则,返回-1。
if SQLCA.of_Connect() <> 0 THEN Return -1 else Return 1 end if ***小技巧:在用户登陆数据库时,当用户输入的信息不合法时,如何控制用户重试的次数? w_logon中的pfc_default事件是通过一个变量:ii_logonattempts来控制的要设置该变量的值,可以在应用管理器的pfc_prelogondlg事件中写如下代码: anv_logonattrib.ii_logonattempts = 3 //“3”就代表用户可以重试的次数是3次 anv_logonattrib.is_logo ="logo.bmp" //指定显示在登陆窗口上的图片 anv_logonattrib是一个n_cst_logonattrib类型的对象,是pfc_prelogondlg事件的一个参数,当调用(触发)pfc_prelogondlg事件时,会传递这个参数过来n_cst_logonattrib中封装了如下的变量: Public: integer ii_rc = -99 integer ii_logonattempts = 1 string is_userid string is_password string is_logo string is_appname powerobject ipo_source 以上各个参数一般都于pfc_prelogondlg事件中设置。
以上各个参数的含义及作用请参阅n_cst_logonattrib的帮助 ***触类旁通: 与n_cst_logonattrib相类似的结构还有很多,它们主要用于控制一些属性的设置具体请参阅PB的在线帮助:PowerBuilder Foundation Class Library (PFC)下的Global Structures and Structure Objects项 这些结构对象统称为属性对象(attribute object)PFC包含了一些专门提供属性服务的用户对象这些用户对象特有以下特点: a. 内含共有的实例变量; b. 可自动实例化; c. 对象名以attrib结尾; d. 经常被用来为pfc_pre事件处理程序传递消息,如:pfc_preAbout事件; e. 具备了可扩充性可以追加自定义的实例变量 鉴于这些对象可以灵活方便地进行扩展,PFC使用它们代替了结构 除了可定义附加的公共实例变量以外,还可以使用可存取级控制和对象函数进一步定制对象的行为,如下表所示: 一般来说,还经常在应用管理器中设置的的全局变量还有: ①n_cst_aboutattrib:在pfc_preabout事件中设置,主要用于控制“关于”的信息。
要在程序启动时调用“关于”窗口,请于pfc_open中调用函数of_about下文还有详细介绍“关于”窗口的使用的内容) ②n_cst_splashattrib:在pfc_presplash事件中设置,主要用于控制“启动屏幕”的信息要在程序启动时显示“启动屏幕”,请于pfc_open中调用函数of_splash下文还有详细介绍“启动屏幕”窗口的使用的内容) 四、定义全局变量 PFC在程序运行时使用全局变量gnv_app来实现应用管理器的功能,具体步骤如下: 1、打开应用对象设计面板 2、定义全局变量,并将其类型设为:n_cst_designmanager(即第三步里设计的用户自定义对象): n_cst_designmanager gnv_app 注意:这个全局变量的名称一定要为gnv_app,不可更改定义gnv_app为n_cst_designmanager的类型后,程序员可以象访问n_cst_designmanager一样访问在n_cst_designmanager中新增的变量、用户事件和函数 3、在“Open”事件中加入如下代码: gnv_app = CREATE n_cst_designmanager gnv_app.Event pfc_open(commandl。