📄 pfc详细教程.txt
字号:
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菜单项中
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -