📄 pfc详细教程.txt
字号:
关于PFC
这一章介绍的是PFC的基础,PB的首要概念,面向对象的内容,并附有一个PFC的
组成图。
理解PFC:
PFC是一组PowerBulider的对象,它可以由用户自己定制,扩充。你可以象搭积木
一样使用它,使程序紧密的连接起来。PFC还包括许多有用的对象,例如:debug对
象。
PFC是由PowerBuilder提供的PB对象,并支持PowerScript 源代码。它使用的是先
进的PowerBuilder面向对象技术,其一个特征是面向服务设计。确使你的程序占
用最少的计算机资源。
PFC使用了许多先进的编码技巧,你可以使用PowerBuilder的PowerScript编译器
来检查对象,实例,事件,和继承PFC父类的函数。
这本书说的是PFC的概念(PFC是什么东西和你为什么使用它)还有使用信息(如何计
划.使用PFC)
为了更详细的了解PFC的对象,实例,事件,和继承PFC父类的函数,请看PFC Object
Reference 。
理解PowerBuilder:
使用PFC可以创建先进的面向对象式的PowerBuild类库。要想掌握PFC和它的面向
对象特征,首先需要了解PowerBuilder和它的面向对象特征。这一节将告诉你应
该熟悉PowerBuilder的基本概念。
PFC原是为建类库准备的,但并不是不让你用它创建应用程序。通过看PowerBuild
er User's Guide可以完全了解的PowerBuilder的概念。
PowerBuilder类库和对象:
PFC是作为PowerBuilder Libraries(PBLS)发行的。PBLs包括你用于写程序的父类
和派生类对象。在使用任何PFC对象之前,你一定要在你的应用程序库的搜索路径
中把PFC类库加进去。PowerBuilder在执行程序时通过搜索路径找到程序所引用的
对象。
PB标准对象 用途
Windows PowerBuilder应用程序和它的用户之间的联系界面。
Menus 用户在当前活动窗口用来搜索命令的表。
DataWindow objects 用于接收,实时处理数据。
User objects 由用户自己定义的对象(一次定义可以重复使用)。
User objects 有两种类型:
(一):Visual user objects (可视化用户对象)
一个可视化用户对象是一个可以重复使用的可视化控制,或者是一批预先确定的可
视化控制.PFC包括两种可视化用户对象类型.
1.标准的可视化用户对象类:
PFC提供了一套丰富的标准的可视化用户对象.每个PFC的标准的可视化用户对象都
相当于一个PowerBuilder的窗口控件.这些对象包括以PFC服务预想确定完全的综
合操作。 特别值得一提的是u_dw DataWindow 用户对象,这是以PFC服务来提供
广泛的综合功能。
2.用户自定义的可视化用户对象
PFC也提供了用户自定义的可视化用户对象,这些对象包括一组窗口控件,并提供
先进的函数用在某些特别情况。 (PFC没有使用外部用户对象和VBX用户对象,要
想进 一步了解可视化用户对象,请看"PowerBuilder User's Guide")
(二):Class user objects(非可视用户对象类)
一个非可视用户对象是一个用来实现非可视的处理时使用的控件。PFC包括两种非
可视用户对象类型。
1.标准的非可视用户对象:
标准的非可视用户对象是继承 PowerBuilder内嵌的系统对象而来。PFC提供了许
多标准的非可视用户对象,例如:处理事务,错误对象,和其他所有的扩展系统对
象。
2.用户自定义的非可视用户对象:
用户自定义的非可视用户对象是继承 PowerBuilder非可视对象类而来,它把数据
和代码进行封装。这种类型的用户对象允许你从SCRATCH定义一个对象。
PFC用Class user objects来执行它的许多服务以及提供这些服务对象的函数。它
也提供?reference variables(引用变量),何谓 rdference variables呢?即是
一个对象指针。你可以用它来存取一个对象的实例变量,函数,事件。
Functions(函数):
PowerBuilder支持全局函数和对象函数。PFC通过user_object function执行它的
处理。一个函数就是执行一些处理的PowerScript语句的集合,你可以传递数据或
者是什么也不传,它来返回一个值。
详细信息册参考PFC Object Reference。
Events and user events(事件和用户事件):
PowerBuilder的Windows,user objects,contols,都有一些预先设定的事件。PFC
通过定义用户事件为许多PFC 对象增加事件。事件可以接受数据和返回值。共有
三种PFC 事件:
事件类型 触发时间
PowerBuilder预先设定的事件 某个动作导致操作系统调用事件
预先编好代码的用户事件 某个动作(例如选择一个菜单)导致PFC触发用户事件
空的用户事件(可以加入代码) 某个动作(例如选择一个菜单)导致PFC触发用
户事件
除非另有说明,本书的event都指的是这三种。
Function and events compared (函数和事件比较)
函数和事件在许多方面都是相似的:
(1)他们都可以接收数据,返回值;
(2)他们都由PowerBuilder语句构成;
(3)他们都可以被调用,触发,传递。
但他们还是有些不同的:
使用特征 函数 事件
调用一个不存在的 将会出现运行时错误 TriggerEvent返回-1
覆盖父类脚本 直接覆盖父类脚本 可以扩展或者覆盖
访问 可以是Public、Private、Protected 永远是Public
重载 可以重载 不可以重载
面向对象式的设计
面向对象的编程工具支持三个基本规则:inheritance(继承),encapsulation
(封装),polymorphism(多态)。
如何使用PFC扩展层:
在PFC中没有类库完全适合你的需要,你可以代表性的修改PFC来满足你的程序的
需要。假如没有PFC扩展层,就会出现一个问题:当PFC版本升级时,新版本的PF
C恢复该这些修改,而你不得不用手工改变。
一个特别的扩展层:
PFC产生一个扩展层是通过继承所有的层实现的。所有的扩展对象都在单独的PBL
S,这在PFC升级时不会影响。
内容 祖先层
Application and global services PFCAPPSRV.PBL
DataWindow services PFCDWSRVPBL
Visual and standard class user objects PFCMAIN.PBL
Utility services PFCUTIL.PBL
Window services PFCWNSRV.PBL
祖先层的类库中的对象包括所有的实例变量,事件,函数;扩展层的类库中的对
象是相应祖先层类库中的对象的不可修改的子类。即使是继承,也可以访问祖先
的实际变量,事件和函数。
通过PowerBuilder Bowser来察看子类的对象的实际变量,事件和函数。
使用扩展层有二个优点:
1. 你可以增加一些点,部门,还有程序逻辑。
2. 不会影响版本升级。
旧版本对象:
PFCOLD。PBL Library包含旧的对象。如果你有一个存在的PFC程序,你有可能需
要把他加在你的library list.
注意:
你要通过修改扩展层的对象来定制PFC程序。千万不要轻易修改祖先对象。你的程
序中的对象要使用扩展层的对象并且继承扩展层的窗口。
迅速开始:
在用PFC编程时,程序经常需要修改,存取,以及从扩展层中继承对象。PFC装置
中有一套扩展库(PFC Quickstart Libraries)。它包括扩展层的基本功能,使
你的程序快速发展。
PFC命名规则:
PFC遵循以下命名规则:
Level Name
PFC层对象 用前缀pfc_
扩展层对象 和它的祖先有同样的名字但没有前缀pfc_
例如:DataWindow selection service object的祖先是pfc_n_cst_dwsrv,扩展层
的子类是
n_cst_dwsrv.Pfc_n_cst_dwsrv 包括所有服务的代码。n_cst_dwsrv 是不可修改
的子类(你可以在假如程序指定的实例变量和代码。)。
PFC定义的用户事件:
PFC定义用户实践也用前缀pfc_prefix.这使得你的应用程序的用户事件和PFC 的
用户事件更加容易。
PFC文档使用扩展层名字
当指定一个服务对象时,PFC文档总是用扩张层命名。例如:当论述基类窗口时这
书指向w_master不是pfc_w_master.但要记住,w_master的实际变量,事件和可用
函数实际上是在pfc_w_master定义的。
PFC命名习惯详细资料请看PFC Object Reference
我们不难想到:
PFC的对象继承允许你在每一层假如扩展逻辑。例如:pfc_w_sheet是从w_master
继承的,w_master的实际变量,函数,你加在它的事件在它的子类窗口中都已存
在。
如何加扩展层
扩展层通过PFC升级类有效的实现应用程序内部的重用和单个程序的重用。但是,
在大部门或者是多部门合作时,一定要考虑好扩展的标准,方法,注意部门的规
则和商业规律。
如果你是在一个组织里使用PFC,你要考虑创建一个新层(包括这个组织的所有的
变量函数,事件)。应用程序还是使用PFC扩展库的对象,可是调用实例变量,事
件,函数的祖先变了。
PFC构成:
PFC是由以下构成的:
l 一套PBLS
l 一个数据库
l Quickstart PBLS
l 实例代码
l 一个简单的应用程序
Localized PFC(局部化的PFC)
局部化的PFC 将会在PFC新版本公布后升级。
The PFC PBLs
PFC是分布在PBLS包含的祖先对象和PBLS扩展层包含的对象。每个祖先对象扩张层
包含提供以下服务的对象
Libraries Contents
PFCAPSRV.PBLPFEAPSRV.PBL 应用程序管理器,应用程序服务对象和全局服务对象
。
PFCMAIN.PBLPFEMAIN.PBL 标准可视化用户对象,自定义可视化用户对象,标准用
户对象类。
PFCUTIL.PBLPFEUTIL.PBL 有用的对象和服务。
PFCWNSRV.PBLPFEWNSRV.PBL 窗口服务,包括用户对象和有用的窗口。
PFCOLC.PBL 旧的用户对象。(基层和扩展层的对象)
使用library画笔:
使用library画笔来看到PFC中所有对象
PFC 数据库
PFC装载了pfc.db本地数据库。这个数据库包括以下几个表:
Table Usage
Messages 错误信息服务。
Security_apps 安全服务。
Security_groupings 安全服务。
Security_info 安全服务。
Security_template 安全服务。
Security_users 安全服务。
PFC本地数据库是由开发者预先设定的,如果你要使用错误信息服务和安全服务一
定要在你的数据库中复制指定的表。连接”Deploying database tables”
The PFC Quickstart PBLs
使用PFC Quickstart libraries用来是程序配置和运行迅速。他们包括经过挑选
的PFC扩展层对象的保护子集。
做一个PFC Quickstart libraries备份,你就有了后援了。
The PFC code example
使用它是为了了解PFC的对象和服务。学习如何编码并且实现PFC的基本功能。Th
e PFC Quickstart有广泛的参照和使用资料。
The PFC sample application
使用PEAT可以看到PFC的例子是如何进行工程预算和跟踪系统的。
PFC编程基础
概要:
这一章阐述了 PFC 编程的基本技巧,同时也告诉了你如何开始运用 PFC 编写应
用程序。
设置应用程序管理器
首先建立一个PFC应用程序的第一步就是配置应用程序以及建立应用程序管理器-
-n_cst_appmanager。应用程序管理器将替代原来的应用程序对象。原来在应用程
序对象中编写的脚本将全部改写在应用程序管理器中。应用程序管理器中同时还
通过实例变量、函数来维护应用程序的属性。其中有框架窗口、应用程序与用户
的INI文件或注册键以及帮助文件等。
注意:
使用分开的物理文件
每个独立的应用程序都必须拥有自己独立的一套文件。你不可以共享父类文件,
也就是那些以PFC开头的文件。这是由PFC的内部继承关系而决定的。
例如,假设应用程序1与应用程序2都拥有它们自己的一套扩展的PFC库文件,但
是它们共享父类文件(PFC库文件)。这时应用程序1在自己的PFE(PFC扩展库)
的w_master中增加了一个函数名为of_SetData。这样这个函数将在w_master的所
有子类中都有效,这些子类是pfc_w_main,pfc_w_frame,pfc_w_sheet 等。而这
些对象恰恰在这两个应用程序共享的父类文件(PFC库文件)中。这样当应用程序
2重新生成应用程序时(regenerate)由于应用程序2的PFE文件中没有of_SetDat
a函数。这样w_master的所有子类中的关于of_SetData函数的指针都将被删除。这
样当应用程序1运行时将会导致运行时错误与编译错误。
具体步骤
1. 打开应用程序画笔。
2. 定义库文件列表。
PFCAPSRV.PBL
PFCDWSRV.PBL
PFCMAIN.PBL
PFCUTIL.PBL
PFCWNSRV.PBL
PFEAPSRV.PBL
PFEDWSRV.PBL
PFEMAIN.PBL
PFEUTIL.PBL
PFEWNSRC.PBL
PFCOLD.PBL(如果你的应用程序是使用老版本的PFC库那么请增加该文件到库列表
中)
3. 在应用程序画笔中打开脚本画笔,定义n_cst_appmanager类型的全局变量gnv
_app。
n_cst_appmanger gnv_app
这个变量名必须是gnv_app,因为PFC的对象、函数、事件都需要这个n_cst_appm
anager或它的子类的全局变量—gnv_app。
4. 增加如下代码到应用程序对象的OPEN事件中。它的用途是创建n_cst_appmana
ger、调用pfc_Open事件。
gnv_app = Create n_cst_appmanager
gnv_app.Event pfc_Open(commandline)
5. 增加如下代码到应用程序对象的CLOSE事件中。
gnv_app.Event pfc_Close()
Destroy gnv_app
6. 增加如下代码到应用程序对象的SystemError事件中。调用pfc_SystemError事
件。
gnv_app.Event pfc_SystemError()
7. 关闭应用程序画笔,保存所作的修改。
8. 打开用户自定义对象画笔。在PFEAPSRV.PBL中找到n_cst_appmanager并打开,
或者是它的子类。
9. 在n_cst_appmanager的构造事件(Constructor Event)中调用它的函数来初
始化关于软件版本号、公司、和INI文件的实例变量。
10. 在 n_cst_appmanager的pfc_Open事件中打开你所想要的应用程序Service 。
你所想打开的Service 调用函数
Application preference of_SetAppPreference
DataWindow caching of_SetDWCache
Error of_SetError
Most recently used object of_SetMRU
Transaction registration of_SetSecurity
Debug of_SetDebug
11. 在pfc_Open事件中增加打开你的初始窗口的代码,例如框架窗口(Frame Wi
ndow)或者调用显示快闪窗口的of_Splash()函数。
12. (可选)增加代码到pfc_PreAbout,pfc_PreLogonDlg,pfc_PreSplash事件
中,用于定制关于对话框(About box)、登录对话框(Logon box)、快闪窗口
(splash screen)。
13. (可选)增加代码到pfc_idle,pfc_ConnectionBegin,pfc_ConnectionEnd
事件中。
l_ 在应用程序对象的idle事件中调用pfc_idle事件。
l_ 在应用程序对象的ConnectionBegin事件中调用pfc_ConnectionBegin事件。
l_ 在应用程序对象的 ConnectionEnd事件中调用pfc_ConnectionEnd事件。
14. 保存n_cst_appmanager
如何显示快闪窗口
非常简单,只需在pfc_Open事件中,在打开第一个窗口的代码之前写上如下代码
:
this.of_Splash(1)
Open(w_tut_frame)(根据不同的应用程序有不同的变化!)
如何显示登录窗口
1. 在框架窗口的Open事件中调用of_LogonDlg函数:
Integer li_return
li_return = gnv_app.of_LogonDlg( )
IF li_return = 1 THEN
this.SetMicroHelp("Logon successful")
ELSE
MessageBox("Logon", "Logon failed")
Close(this)
End If
Of_LogonDlg函数将显示w_logon对话框,同时还会提示输入用户名、密码,当用
户点击OK按钮时还会触发n_cst_appmanager的pfc_Logon事件。
同样,你也可以在n_cst_appmanager的pfc_Open事件中的打开框架窗口之后立即
调用Of_LogonDlg函数。但是绝对不要在Of_Splash之后立即调用Of_LogonDlg 。
2. 在n_cst_appmanager的pfc_logon事件中编写登录到数据库的代码。这个例子
假设有一个INI文件,它包含了所有的需要登录到数据库的信息,除了用户名、密
码以外。同时还假设你已将SQLCA的默认类型改为n_tr(PFC制定的书屋对象类型
)。
Integer li_returnString ls_inifile, ls_userid, ls_password
ls_inifile = gnv_app.of_GetAppIniFile()
IF SQLCA.of_Init(ls_inifile,"Database") = -1 THEN
Return -1
END IF
// as_userid and as_password are arguments
// to the pfc_Logon event
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -