ehxz 发表于 2004-6-18 22:44:42

【转帖】PFC编程基础

  <B>概要: </B>

  这一章阐述了 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_SetData函数。这样w_master的所有子类中的关于of_SetData函数的指针都将被删除。这样当应用程序1运行时将会导致运行时错误与编译错误。

  <B>具体步骤</B>

  1. 打开应用程序画笔。

  2. 定义库文件列表。


<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0>

<TR>
<TD>PFCAPSRV.PBL
PFCDWSRV.PBL
PFCMAIN.PBL
PFCUTIL.PBL
PFCWNSRV.PBL
PFEAPSRV.PBL
PFEDWSRV.PBL
PFEMAIN.PBL
PFEUTIL.PBL
PFEWNSRC.PBL
PFCOLD.PBL(如果你的应用程序是使用老版本的PFC库那么请增加该文件到库列表 中) </TD></TR></TABLE>
  3. 在应用程序画笔中打开脚本画笔,定义n_cst_appmanager类型的全局变量gnv _app。

  n_cst_appmanger gnv_app 这个变量名必须是gnv_app,因为PFC的对象、函数、事件都需要这个n_cst_appm anager或它的子类的全局变量—gnv_app。

  4. 增加如下代码到应用程序对象的OPEN事件中。它的用途是创建n_cst_appmanager、调用pfc_Open事件。


<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0>

<TR>
<TD>gnv_app = Create n_cst_appmanager
gnv_app.Event pfc_Open(commandline) </TD></TR></TABLE>
  5. 增加如下代码到应用程序对象的CLOSE事件中。


<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0>

<TR>
<TD>gnv_app.Event pfc_Close()
Destroy gnv_app </TD></TR></TABLE>
  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 Window)或者调用显示快闪窗口的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)(根据不同的应用程序有不同的变化!)

  <B>如何显示登录窗口 </B>

  1. 在框架窗口的Open事件中调用of_LogonDlg函数:


<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0>

<TR>
<TD>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 </TD></TR></TABLE>
  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制定的书屋对象类型 )。


<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0>

<TR>
<TD>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</TD></TR></TABLE>

ehxz 发表于 2004-6-18 22:45:03

  <B>建立应用程序 </B>

  <B>建立一个MDI应用程序 </B>

  使用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 。

  <B>在MDI应用程序中打开表单窗口: </B>

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

<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0><TR><TD>n_cst_menu lnv_menu
Message.StringParm = "w_products"
lnv_menu.of_SendMessage(this,”pfc_Open”) </TD></TR></TABLE>
  2. 在w_frame的pfc_Open事件中访问Message.StringParm,打开指定的表单窗口。

<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0><TR><TD>String ls_sheet
w_sheet lw_sheet

ls_sheet = Message.StringParm
OpenSheet(lw_sheet, ls_sheet, this, 0, Layered!) </TD></TR></TABLE>
  <B>建立一个SDI应用程序 </B>

  在使用PFC建立SDI应用程序中,你将使用w_main窗口作为你的所有main类型窗口的父类。为了使得你的事件、函数、实例变量能够在所有的窗口中都有效,只需将它们加到w_main中。

  如果你的窗口需要菜单,那么你必须为每一个窗口定义菜单。

  具体步骤

  1. 继承w_main窗口,建立一个main类型窗口,最为主窗口。最好是直接修改w_main窗口。
  2. 建立一个主菜单。
  3. 根据需要建立其他的菜单与窗口。
  4. 在n_cst_appmanager的pfc_Open事件中编写打开主窗口的脚本。

  <B>PFC编程过程中的函数使用方法 </B>

  几乎所有的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的那个列使用下拉日历。

<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0><TR><TD>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). </TD></TR></TABLE>

ehxz 发表于 2004-6-18 22:45:28

  <B>调用PFC对象函数</B>

  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的列名、排序已显示值、 实现当用户点击后排序。同时可以在菜单栏上显示下拉对话框。

<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0><TR><TD>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) </TD></TR></TABLE>
  函数重载PFC使用函数重载提供了一个丰富的、富有弹性的编程接口。它通过两种方法实现函数重载。

  l_ 多种语法 多个函数具有不同的参数类型、不同的参数顺序。这使得PFC的函数可以处理多种数据类型的参数。
  l_ 随意的参数数目 许多函数拥有一个具有相同数据类型、相同顺序、参数数目可以变化的参数。它同时还允许PFC为常用的参数提供默认值。

  只用于内部处理所重载的函数

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


  <B>关于PFC事件的编程</B>

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

  “预代码事件”与其他的用户自定义事件

  预代码事件指的是那些已经在PFC层对象中编号代码的事件。PFC拥有许多具有一定功能的“预代码事件”。这意味着如果你开启了一个Service ,PFC的对象发现该Service已开启了,那么这些“预代码事件”将会执行其中的代码。

  例如:u_dw的Clicked事件就是一个“预代码事件”,它会自动调用那些开启的Service函数。你可以扩展这些事件,但是不可以覆盖它们。

  <B>空的用户自定义事件 </B>

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

  例如:

  在u_dw中有一个用户自定义事件pfc_Retrieve ,你可以在其中加入检索数据的代码。

  Return this.Retrieve()

  有关更多的关于PFC事件的内容请参考PFC Object Reference

  <B>PFC中的事件是如何起作用的
</B>
  PFC是采用如下的方式调用Services中的事件的

  1. 当用户触发某个对象的某个事件时,PFC将会调用相应的Service 的自定义事件,同时传递相应的参数。例如:u_dw的clicked事件会调用n_cst_dwsrv_sort的pfc_Clicked事件,同时传递X坐标、Y坐标、DW对象(这些其实也是DW的Clicked 事件的参数)。

  2. 这些Services的事件同时还有可能调用其他对象函数。例如,n_cst_dwsrv_sort的pfc_Clicked事件中还调用了n_cst_dwsrv_sort的函数。

  尽管你可以直接调用PFC的对象函数,但是调用相应的事件显得更简单,因为这些事件中已经包括了错误检测代码。

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

<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0><TR><TD>pfc_PreAbout
pfc_PreClose
pfc_PreLogonDlg
pfc_PreOpen
pfc_PrePageSetupDlg
pfc_PrePrintDlg
pfc_PreRestoreRow
pfc_PreSplash
pfc_PreToolbar
pfc_PreUpdate </TD></TR></TABLE>
  通常,这些事件中都有一个已经自动实例化了的用户对象的引用变量。这个对象的属性可以影响这个事件的运行。你可以修改这个用户对象的属性,从而达到改变事件的运行或扩展事件的运行效果。有些时候你还需要修改一些其他的对象。

  例如,当你需要控制About对话框中的一个附加控件的显示效果时,你需要:

  1. 扩展用户对象n_cst_aboutattrib ,在其中增加一个用于在w_about中代表显示效果的实例变量(一个 user ID)。
  2. 在w_about中增加控件(sle_userid)
  3. 在w_about的Open事件中编写代码,将user ID的值放入单行编辑框中(sle_userid)
sle_userid.text = inv_aboutattrib.is_userid
  4. 在n_cst_appmanager的pfc_PreAbout事件中编写初始化代码:
  inv_aboutattrib.is_userid = this.of_GetUserID()
  然后当你需要显示w_about时,调用应用程序管理器的of_About函数即可。

ehxz 发表于 2004-6-18 22:46:17

  <B>如何使用属性对象 </B>

  PFC提供了许多专门的属性用户对象。这些用户对象有如下特征:

  l_ 包含公有性质的实例变量
  l_ 自动实例化
  l_ 名称以attrib结尾
  l_ 通常用于向PFC的pre_event传递信息,例如pfc_PreAbout
  l_ 可扩展,你可以在其中自己定义其他的实例变量。

  因为,你有可能会扩展这些对象。因此,PFC使用对象而不使用对象。
  同样你还可以定义对象函数,做到更随意的控制这些对象。

  这些属性对象有:

  属性对象有关的用法

<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0><TR><TD>n_cst_aboutattrib Pfc_Pre_About(n_cst_appmanager) 调用n_cst_appmanager的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_appmanager的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_Toolbars事件打开w_toolbars 。
n_cst_zoomattrib DataWindow print preview service 内部自动调用 </TD></TR></TABLE>
  <B>PFC的常量 </B>

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

<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0><TR><TD>// 1 = Filter linkage style.
dw_emp.inv_linkage.of_SetStyle(1)

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

  <B>消息路由 </B>

  消息路由器可以用于任何一个对象与窗体之间的通讯。不过,大部分时候都是用于菜单与窗体之间的消息传递。它提供了一种查找算法用于确定哪个对象来接收消息。

  使用消息路由时:

  l_ 你菜单中的代码只需要知道代用哪个事件,你无须知道当前的窗口时哪个,或者与其相关的对象名称。
  l_ 你的窗口无须维护用户事件,只需简单调用DataWindow的事件即可。从而减少了窗口需要维护的事件数量。

  Message = user event

  经过消息路由传递的消息实际上就是用户事件名。窗口、控件收到这些消息后就会调用相应的事件。

  内置的debug消息

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

  <B>函数of_SendMessage的工作流程</B>

  当用户选择菜单项时,Clicked事件中的代码便以欲触发的用户事件名为参数(字符串的形式)调用of_SendMessage函数。Of_SendMessage调用n_cst_menu的of_SendMessage函数,n_cst_menu的of_SendMessage将会调用窗体的pfc_MessageRou ter事件,pfc_MessageRouter事件将会调用你所要触发的用户事件(即在Clicke d中传递字符串参数)。

  在MDI与SDI应用程序中,函数Of_SendMessage调用pfc_MessageRouter时将有所不同。

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

ehxz 发表于 2004-6-18 22:47:00

  <B>PFC中的事务对象 </B>

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

  <B>用户自定义对象n_tr </B>

  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函数初始化事务对象的属性

<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0><TR><TD>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 </TD></TR></TABLE>
  4. 调用of_Connect进行数据库连接

<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0><TR><TD>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 </TD></TR></TABLE>
  5. 调用n_tr的成员函数

  <B>调用父类的函数、事件</B>

  在扩充父类的函数和事件时,你有可能需要先调用父类的函数或事件,然后再依据返回值进行下面的处理。这对那些具有返回值前缀是PFC的事件特别有意义。你在执行子类的代码前必须先确认父类的代码是否执行成功。

  <B>覆盖父类的函数 </B>

  为了扩展父类的代码,获取父类的返回值。你必须覆盖父类的代码,然后显示的调用父类的函数或事件。

  采用如下的语法格式调用父类的事件,同时传递参数、获取返回值:
  Result = Super :: Event eventname(arguments

  采用如下的语法格式调用父类的函数,同时传递参数、获取返回值:
  result = Super :: Function functionname(arguments

  下面的例子则覆盖了u_dw的pfc_Update事件。当父类的事件处理成功时,子类将信息纪录到日志中。

<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0><TR><TD>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</TD></TR></TABLE>
  <B>在应用程序中增加联机帮助 </B>

  联机帮助是应用程序中非常重要的一部分。PFC提供了许多函数、事件使得你可以方便的将联机帮助添加到你的应用程序中。

  相关信息:有关PFC的帮助对话框请参考“Deploying PFC dialog box HELP” 。

  1. 使用n_cst_appmanager的of_SetHelpFile函数设置帮助文件。通常在构造事件中:

  this.of_SetHelpFile(“c:\eis\eisapp.hlp”)

  2. pfc_PreOpen是为窗口设置帮助主题的最好的地方

<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#ffffff border=0><TR><TD>Long ll_helpid
Ll_helpid = 1020 //1020是一个帮助主题的ID
Ia_helptypeid = ll_helpid </TD></TR></TABLE>
  采用这种方式你可以为用户选中的窗口提供详细的帮助。你可以将ia_helptypeid设置成长整形(此时PFC把它解释成帮助主题的ID),或者是字符串(此时PFC将它解释成关键字)。

  3.(可选)如果你没有使用PFC的m_master的子类。那么,在你的HELP菜单项中调用窗体的pfc_Help事件。因为,pfc_Help定义在窗口w_master中,所以所有的PFC窗口都具有事件。

  4. 对于对话框,则在其中的HELP按钮的Clicked事件中编写:
  Parent.Event pfc_Help()

  <B>PFC自动处理窗口级别的帮助</B>

  当你从m_master的子类的菜单中选择Help-&gt;Help时,消息路由机制会自动的调用当前活动的窗口的pfc_help事件。

  <B>PFC的升级 </B>

  PFC在发布PowerBuilder的升级版本时同时也包括了PFC的升级文件。如何升级PFC,请按如下规则:

  l_ PFC的各层(PFC层、PFE层、中间层等)没有任何被修改时:你可以直接安装新的PBLs覆盖原有的PBLs。

  注意:每次升级PFC时都保留一份原有的文件备份

  l_ 如果你修改了PFC中的某一层:你必须保证你所作的修改不会被覆盖!请按如下的步骤进行:

  <B>将PFC升级到最新版本</B>

  1. 将所有扩展层的PBL文件移到一个不会被安装过程覆盖的目录中。

  说明:你不应该对PFC的最基类(以PFC为前缀的对象)作任何修改,这里假设你没有对PFC的最基类作任何修改

  2. 确定你当前的PFC的版本号。你可以在Readme.txt文件中查看,或者在pfc_n_cst_debug的实例变量中查看。版本号的格式:主版本号.次版本号.修正号

  3. 执行安装程序,将PFC安装口的PBL文件放到PFC所在的目录中,覆盖原有的PFC最基类的PBLS ,即以PFC开头的库文件。

  4. 合并已存在的扩展对象与新安装的扩展对象。首先详细阅读Readme.txt中说明的新扩展对象清单。然后按照一下的两种方法合并对象:
  l_ 将新的对象COPY到你的扩展PBLS中。
  l_ 将已经存在的对象COPY到新的扩展PBLS中。
  5. 启动PowerBuilder
  6. (可选)必要的时候调整一下应用程序的库列表
  7. 打开库画笔,从新编译一边所有的对象。

最真的梦 发表于 2005-9-9 10:42:54

<P>太深了~ 俺要好好学习了!</P>
页: [1]
查看完整版本: 【转帖】PFC编程基础

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com