⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pfc详细教程.txt

📁 PB常用技巧 PB常用技巧 PB常用技巧
💻 TXT
📖 第 1 页 / 共 5 页
字号:
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 + -