精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Powerbuilder>>PFC>>PFC编程基础

主题:PFC编程基础
发信人: mrliuz()
整理人: leitiger(2002-06-06 00:06:06), 站内信件
概要:
这一章阐述了 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 
SQLCA.of_SetUser(as_userid, as_password) 
IF SQLCA.of_Connect() = -1 THEN
  Return -1 
ELSE
  gnv_app.of_SetUserID(as_userid)
   Return 1  
End If

建立应用程序
建立一个MDI应用程序
使用w_frame,w_sheet窗口作为你的框架窗口与表单窗口的父类。在w_sheet窗口
中增加你的应用程序中所有表单窗口需要的事件、实例变量、函数。
你必须为每一个表单窗口定义菜单。
具体步骤:
1. 为应用程序在w_frame窗口中作特定的修改。最好是建立一个w_frame窗口的子
类,然后再修改这子类。
2. (可选)在w_sheet中增加实例变量、函数、用户自定义事件。
3. 建立继承w_sheet的表单窗口。
4. 建立一个框架窗口(frame window)用的菜单,通常是选用w_frame 。
5. 为框架窗口指定相应的框架窗口菜单。
6. 建立表单窗口的菜单
7. 为表单窗口(sheet window)指定相应的表单菜单。
8. 在n_cst_appmanager的pfc_Open事件中加入打开框架窗口的代码。
9. (可选)在必要时候,开启框架窗口Service 。
l_ 调用w_frame的of_SetStatusBar函数开启状态条Service 。
l_ 调用w_frame的of_SetSheetManager函数开启表单管理Service 。

在MDI应用程序中打开表单窗口:
1. 在菜单项的Clicked事件中编写有关打开表单窗口的脚本。你需要将表单窗口
的名称以字符串的形式传递给Message.StringParm,然后以pfc_Open为参数调用
of_SendMessage函数:
n_cst_menu lnv_menu
Message.StringParm = "w_products" 
lnv_menu.of_SendMessage(this,”pfc_Open”)

2. 在w_frame的pfc_Open事件中访问Message.StringParm,打开指定的表单窗口

String ls_sheet
w_sheet lw_sheet

ls_sheet = Message.StringParm
OpenSheet(lw_sheet, ls_sheet, this, 0, Layered!)

建立一个SDI应用程序
在使用PFC建立SDI应用程序中,你将使用w_main窗口作为你的所有main类型窗口
的父类。为了使得你的事件、函数、实例变量能够在所有的窗口中都有效,只需
将它们加到w_main中。
如果你的窗口需要菜单,那么你必须为每一个窗口定义菜单。
具体步骤
1. 继承w_main窗口,建立一个main类型窗口,最为主窗口。最好是直接修改w_m
ain窗口。
2. 建立一个主菜单。
3. 根据需要建立其他的菜单与窗口。
4. 在n_cst_appmanager的pfc_Open事件中编写打开主窗口的脚本。

PFC编程过程中的函数使用方法
几乎所有的PFC函数都是对象级函数。这就意味着你必须定义POWERBUILDER对象后
才可以使用函数。经过PB封装后的函数使你很轻易的看到哪个函数属于哪个对象


PFC使用Set/Get/Is 命名规则来控制实例变量。
l_ of_Set函数允许你为实例变量赋值
l_ of_Get函数允许你获得一个非布尔类型的变量的值
l_ of_Is函数允许你确定一个布尔类型变量的真与假
其他类型实例变量的访问规则
PFC定义变量时同时指定为公共类型(public),那么你将可以随意直接访问。

    另外,有些变量由于只是在内部使用,因此不能通过函数进行访问。
除了Set/Get/Is命名规则以外,PFC在为某一Service定义入口参数时使用Regist
er/UnRegister规则。例如,你可以调用u_calculator对象的of_Register函数来
定义Datawindow的那个列使用下拉日历。

Object qualificationPFC uses access levels (public, private, protected
) to control your access to functions designed for 内部自动调用 use.

When you call these functions from outside the object, use dot notatio
n to qualify the function name. Qualify the function name with the ref
erence variable used to create the object (in some cases you qualify t
he function name with the actual object name).

调用PFC对象函数
1. 确认对象是已否被创建
PowerBuilder在当窗口打开的时候会建立窗口、菜单和可视的用户对象。你
要使用函数of_Setservicename来建立大部分的不可视的用户对象。例如,下面u
_dw的对象函数创建了排序Service(n_cst_dwsrv_sort user object),并且在
u_dw’s中的实例变量inv_sort中保留它的引用。通常这些代码都在Datawindow的
构造事件中:
this.of_SetSort(True)
自动实例化对象
某些PFC对象利用了Powerbuilder提供的自动实例化功能。这些对象没有Set函数
。PowerBuilder会在它们声明的时候自动实例化它们。

2. 在应用程序中调用适当的对象函数
这个例子展示了排序Service将利用DataWindow的列名、排序已显示值、
实现当用户点击后排序。同时可以在菜单栏上显示下拉对话框。

this.inv_sort.of_SetColumnNameSource(this.inv_sort.HEADER)  this.inv_s
ort.of_SetUseDisplay(TRUE)  this.inv_sort.of_SetColumnHeader(TRUE)
this.inv_sort.of_SetStyle(this.inv_sort.DRAGDROP)

函数重载PFC使用函数重载提供了一个丰富的、富有弹性的编程接口。它通过两种
方法实现函数重载。
l_ 多种语法 多个函数具有不同的参数类型、不同的参数顺序。这使得PFC的函数
可以处理多种数据类型的参数。
l_ 随意的参数数目 许多函数拥有一个具有相同数据类型、相同顺序、参数数目
可以变化的参数。它同时还允许PFC为常用的参数提供默认值。

只用于内部处理所重载的函数
除了公有类型的重载函数以外,PFC通常还有一个保护类型的版本,一般都是用
来进行内部调用的。例如,n_cst_dwsrv_report中的of_Addline函数有4个公有类
型的版本、一个保护类型的版本。这个保护类型的版本是供其他4个调用的。虽然
有些时候可以调用这些保护类型的版本,但是他们纯粹是为了内部调用而设计的


关于PFC事件的编程
PFC包括了预代码的事件、用于实现PFC Service的用户自定义事件。还有一些空
的事件,你可以在其中为你的应用程序加入特定的代码,或者执行一些特定的任
务。所有的事件都是公有的,你可以直接访问它们。

“预代码事件”与其他的用户自定义事件
预代码事件指的是那些已经在PFC层对象中编号代码的事件。PFC拥有许多具有一
定功能的“预代码事件”。这意味着如果你开启了一个Service ,PFC的对象发现
该Service已开启了,那么这些“预代码事件”将会执行其中的代码。
例如:u_dw的Clicked事件就是一个“预代码事件”,它会自动调用那些开启的S
ervice函数。你可以扩展这些事件,但是不可以覆盖它们。

空的用户自定义事件
PFC定义了许多空的用户自定义事件。你可以在其中为你的应用程序写入特定的
代码。许多这种事件都是通过菜单而触发的。另外一些则是应用程序代码触发的

例如:
在u_dw中有一个用户自定义事件pfc_Retrieve ,你可以在其中加入检索数据的
代码。
Return this.Retrieve()
有关更多的关于PFC事件的内容请参考PFC Object Reference

PFC中的事件是如何起作用的
PFC是采用如下的方式调用Services中的事件的
1. 当用户触发某个对象的某个事件时,PFC将会调用相应的Service 的自定义事
件,同时传递相应的参数。例如:u_dw的clicked事件会调用n_cst_dwsrv_sort的
pfc_Clicked事件,同时传递X坐标、Y坐标、DW对象(这些其实也是DW的Clicked
事件的参数)。
2. 这些Services的事件同时还有可能调用其他对象函数。例如,n_cst_dwsrv_s
ort的pfc_Clicked事件中还调用了n_cst_dwsrv_sort的函数。
尽管你可以直接调用PFC的对象函数,但是调用相应的事件显得更简单,因为这些
事件中已经包括了错误检测代码。

关于事件触发前的一些处理
PFC有一种自定义事件名是Prename 。这意味着这些事件是发生在事件name之前的
事件。我们把它叫做pre_event 。你可以随意在pre_event中增加代码用于扩充相
应的事件处理能力。这些pre_event有:

pfc_PreAbout
pfc_PreClose
pfc_PreLogonDlg
pfc_PreOpen
pfc_PrePageSetupDlg
pfc_PrePrintDlg
pfc_PreRestoreRow
pfc_PreSplash
pfc_PreToolbar
pfc_PreUpdate

通常,这些事件中都有一个已经自动实例化了的用户对象的引用变量。这个对象
的属性可以影响这个事件的运行。你可以修改这个用户对象的属性,从而达到改
变事件的运行或扩展事件的运行效果。有些时候你还需要修改一些其他的对象。
例如,当你需要控制About对话框中的一个附加控件的显示效果时,你需要:
1. 扩展用户对象n_cst_aboutattrib ,在其中增加一个用于在w_about中代表显
示效果的实例变量(一个 user ID)。
2. 在w_about中增加控件(sle_userid)
3. 在w_about的Open事件中编写代码,将user ID的值放入单行编辑框中(sle_u
serid)
sle_userid.text = inv_aboutattrib.is_userid
4. 在n_cst_appmanager的pfc_PreAbout事件中编写初始化代码:
inv_aboutattrib.is_userid = this.of_GetUserID()
然后当你需要显示w_about时,调用应用程序管理器的of_About函数即可。

如何使用属性对象
PFC提供了许多专门的属性用户对象。这些用户对象有如下特征:
l_ 包含公有性质的实例变量
l_ 自动实例化
l_ 名称以attrib结尾
l_ 通常用于向PFC的pre_event传递信息,例如pfc_PreAbout
l_ 可扩展,你可以在其中自己定义其他的实例变量。
因为,你有可能会扩展这些对象。因此,PFC使用对象而不使用对象。
同样你还可以定义对象函数,做到更随意的控制这些对象。
这些属性对象有:
属性对象 有关的 用法
n_cst_aboutattrib Pfc_Pre_About(n_cst_appmanager) 调用n_cst_appmanag
er的of_About函数打开about对话框
n_cst_calculatorattrib Constructor(u_calculator) 内部自动调用
n_cst_dirattrib File service object 内部自动调用
N_cst_dwobjectattrib Of_Describe(n_cst_dssrv与n_cst_dwsrv) 函数Of_De
scribe返回DataWindow中的对象属性。
n_cst_dwproperyattrib DataWindow Properties objects 内部自动调用
n_cst_errorattrib Error message service 用于传递显示内容到w_message窗口

n_cst_filterattrib DataWindow filter service 用于传递信息到filter对话框

n_cst_findattrib DataWindow find service 传递信息到Find对话框
n_cst_itemattrib PFC ListBox, PictureListBox, and TreeView 内部自动调用

n_cst_linkageattr b DataWindow linkage service 内部自动调用
n_cst_logonattrib Pfc_PreLogonDlg (n_cst_appman ger) 调用n_cst_appmana
ger的of_LogonDlg函数打开w_logon窗口
n_cst_mruattrib MRU service 用于窗体的pfc_MRUProcess和pfc_PreMRUSave事

n_cst_restoreroattrib DataWindow row manager service 内部自动调用
n_cst_returnattrib DataWindow filter and sort services 内部自动调用
n_cst_selectionattrib Selection service Populated with arguments to th
e n_cst_selection of_Open function
n_cst_sortattrib DataWindow sort service 用于传递信息到Sort对话框
n_cst_splashattrib Pfc_PreSplash event (n_cst_appman ger) 调用n_cst_ap
pmanager的of_Splash函数打开w_splash 。
n_cst_sqlattrib SQL service 该属性对象中含有SQL语句的部分内容。
n_cst_textstyleattrib PFC RichTextEdit control 用于设置和获取text属性(
黑体、斜体等)。
n_cst_toolbarattrib Pfc_PreToolbars event (w_frame) 调用w_frame的pfc_T
oolbars事件打开w_toolbars 。
n_cst_zoomattrib DataWindow print preview service 内部自动调用

PFC的常量
许多PFC对象都包含了常量。使用常量使得程序更加易读。例如:下面两段代码同
样是设置Datawindow的linkage风格,但是第二段则显得更加容易理解:
// 1 = Filter linkage style. 
dw_emp.inv_linkage.of_SetStyle(1)  

// FILTER 作为一个常量
dw_emp.inv_linkage.of_SetStyle (dw_emp.inv_linkage.FILTER)
约定:PFC的所有常量都采用大写。

消息路由 
消息路由器可以用于任何一个对象与窗体之间的通讯。不过,大部分时候都是用
于菜单与窗体之间的消息传递。它提供了一种查找算法用于确定哪个对象来接收
消息。
使用消息路由时:
l_ 你菜单中的代码只需要知道代用哪个事件,你无须知道当前的窗口时哪个,或
者与其相关的对象名称。
l_ 你的窗口无须维护用户事件,只需简单调用DataWindow的事件即可。从而减少
了窗口需要维护的事件数量。
Message = user event
经过消息路由传递的消息实际上就是用户事件名。窗口、控件收到这些消息后就
会调用相应的事件。

内置的debug消息
消息路由机制还提供了内置的debug

函数of_SendMessage的工作流程
当用户选择菜单项时,Clicked事件中的代码便以欲触发的用户事件名为参数(字
符串的形式)调用of_SendMessage函数。Of_SendMessage调用n_cst_menu的of_S
endMessage函数,n_cst_menu的of_SendMessage将会调用窗体的pfc_MessageRou
ter事件,pfc_MessageRouter事件将会调用你所要触发的用户事件(即在Clicke
d中传递字符串参数)。
在MDI与SDI应用程序中,函数Of_SendMessage调用pfc_MessageRouter时将有所不
同。如图:

pfc_MessageRouter的工作流程
如图:
菜单与窗口之间的消息传递
消息路由是菜单与窗口之间的通讯桥梁。你不可以通过按钮来触发pfc_MessageR
outer事件。因为,消息路由会调用GetFocus函数判断当前控件。这样当你按下按
钮时,按钮便成了当前控件。


PFC中的事务对象
PowerBuilder的强大功能之一就是可以快速便利的访问多种数据库。PowerBuild
er使用事务对象(Transaction Object)作为PowerBuilder与Database之间的桥
梁。SQLCA就是一个默认的事务对象。

用户自定义对象n_tr
PFC中有一个n_tr对象。它是标准事务对象的子类。其中设有实例变量、用户自定
义事件、函数,主要用于扩充与数据库的通讯能力。
N_tr提供了一套标准函数用于连接、切断、提交、回滚等数据库操作。使用这些
函数代替原有的数据库语句。例如使用of_Connect代替CONNECT语句。

两处地方使用n_tr
l_ 替代sqlca:在应用程序的属性对话框中将SQLCA的默认数据类型设为n_tr 。

l_ 附加的事务对象:当你需要访问多个数据库时,你可以再定义一个事务对象。

如果你使用了多个事务对象,你可以使用事务对象的registration service ,做
到一次提交全部已打开的事务对象,一次回滚所有已打开的事务对象。

将SQLCA设置为n_tr类型
1. 打开应用程序画笔
2. 显示属性窗口,选中Variable页
3. 在SQLCA框中输入n_tr
4. 点击OK

使用n_tr
1. 如果你不使用SQLCA ,而是使用其他的事务对象。
下面的例子假设itr_security是n_tr的实例变量
itr_security = CREATE n_tr
2. 初始化实例变量ib_autorollback 。这个变量的作用是当事务对象正处于连接
状态时应用程序被关闭了或者是该事务对象被删除了的时候,该事务对象应该如
何操作
itr_security.of_SetAutoRollback(FALSE)
关于初始化ib_autorollback的扩展
你可以在n_tr的构造事件中初始化ib_autorollback 。
3. 使用n_tr的of_Init函数初始化事务对象的属性
Integer  li_return
String  ls_inifile
ls_inifile = gnv_app.of_GetAppIniFile()
IF SQLCA.of_Init(ls_inifile,"Database") = -1 THEN
   MessageBox("Database","Error initializing from " + ls_inifile)
   HALT CLOSE 
End if
4. 调用of_Connect进行数据库连接
IF SQLCA.of_Connect() = -1 THEN
  MessageBox("Database","Unable to connect using " + ls_inifile)
  HALT CLOSE
ELSE
  gnv_app.of_GetFrame().SetMicroHelp("Connection complete") 
End if
5. 调用n_tr的成员函数

调用父类的函数、事件
在扩充父类的函数和事件时,你有可能需要先调用父类的函数或事件,然后再依
据返回值进行下面的处理。这对那些具有返回值前缀是PFC的事件特别有意义。你
在执行子类的代码前必须先确认父类的代码是否执行成功。
覆盖父类的函数
为了扩展父类的代码,获取父类的返回值。你必须覆盖父类的代码,然后显示的
调用父类的函数或事件。
采用如下的语法格式调用父类的事件,同时传递参数、获取返回值:
Result = Super :: Event eventname(arguments叄©
采用如下的语法格式调用父类的函数,同时传递参数、获取返回值:
result = Super :: Function functionname(arguments叄©
下面的例子则覆盖了u_dw的pfc_Update事件。当父类的事件处理成功时,子类将
信息纪录到日志中。
Integer  li_return
// Call ancestor event, passing
// descendant's arguments. 
li_return = Super::Event pfc_Update(ab_accepttext, ab_resetflag)
IF li_return = 1 THEN
// ue_WriteLog is a user-defined event.
  li_return = this.Event ue_WriteLog
END IF
Return li_return

在应用程序中增加联机帮助
联机帮助是应用程序中非常重要的一部分。PFC提供了许多函数、事件使得你可以
方便的将联机帮助添加到你的应用程序中。
相关信息:有关PFC的帮助对话框请参考“Deploying PFC dialog box HELP” 。

1. 使用n_cst_appmanager的of_SetHelpFile函数设置帮助文件。通常在构造事件
中:
this.of_SetHelpFile(“c:\eis\eisapp.hlp”)
2. pfc_PreOpen是为窗口设置帮助主题的最好的地方
Long ll_helpid
Ll_helpid = 1020 //1020是一个帮助主题的ID
Ia_helptypeid = ll_helpid
采用这种方式你可以为用户选中的窗口提供详细的帮助。你可以将ia_helptypei
d设置成长整形(此时PFC把它解释成帮助主题的ID),或者是字符串(此时PFC将
它解释成关键字)。
3. (可选)如果你没有使用PFC的m_master的子类。那么,在你的HELP菜单项中
调用窗体的pfc_Help事件。因为,pfc_Help定义在窗口w_master中,所以所有的
PFC窗口都具有事件。
4. 对于对话框,则在其中的HELP按钮的Clicked事件中编写:
Parent.Event pfc_Help()
PFC自动处理窗口级别的帮助
当你从m_master的子类的菜单中选择Help->Help时,消息路由机制会自动的调用
当前活动的窗口的pfc_help事件。

PFC的升级
PFC在发布PowerBuilder的升级版本时同时也包括了PFC的升级文件。如何升级PF
C,请按如下规则:
l_ PFC的各层(PFC层、PFE层、中间层等)没有任何被修改时:你可以直接安装
新的PBLs覆盖原有的PBLs 。
注意:每次升级PFC时都保留一份原有的文件备份
l_ 如果你修改了PFC中的某一层:你必须保证你所作的修改不会被覆盖!请按如
下的步骤进行:

将PFC升级到最新版本
1. 将所有扩展层的PBL文件移到一个不会被安装过程覆盖的目录中。
说明:你不应该对PFC的最基类(以PFC为前缀的对象)作任何修改,这里假设你
没有对PFC的最基类作任何修改
2. 确定你当前的PFC的版本号。你可以在Readme.txt文件中查看,或者在pfc_n_
cst_debug的实例变量中查看。版本号的格式:主版本号.次版本号.修正号
3. 执行安装程序,将PFC安装口的PBL文件放到PFC所在的目录中,覆盖原有的PF
C最基类的PBLS ,即以PFC开头的库文件。
4. 合并已存在的扩展对象与新安装的扩展对象。首先详细阅读Readme.txt中说明
的新扩展对象清单。然后按照一下的两种方法合并对象:
l_ 将新的对象COPY到你的扩展PBLS中。
l_ 将已经存在的对象COPY到新的扩展PBLS中。
5. 启动PowerBuilder
6. (可选)必要的时候调整一下应用程序的库列表
7. 打开库画笔,从新编译一边所有的对象。

--
迎着太阳,我们怒放

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.137.136.66]

[关闭][返回]