发信人: mrliuz()
整理人: leitiger(2002-06-06 00:06:06), 站内信件
|
第6章 使用PFC窗口和菜单
关于本章 本章解释如何使用 PFC窗口和菜单.
使用 PFC窗口
PFC提供了一个基类祖先窗口(w_master)并为每种标准窗口类型提供了祖先窗口.
每个这样的窗口都继承自w_master:
PFC窗口包含实例变量、事件和提供高级功能并可与其它PFC对象通信的函数。
窗口的基本用法
开发应用程序,典型地:
创建基类和继承的窗口
启动窗口服务
从菜单选项中打开窗口
使用PFC窗口进行开发
当你开始一个应用程序的开发,你应考察需要的功能以决定哪一个实例变量、事件 以及函数应归入祖先窗口.
你定义特定应用程序祖先的不同行为取决于你的扩充策略:
策略
方法
创建中间扩展层 应用程序的祖先窗口使用PFC扩展层窗口.
例如,在 w_master定义共用的扩展和在 w_sheet定义工作表窗口扩展.
于是你的应用程序窗口从PFC扩展层窗口继承
典型地,因为在MDI应用程序中仅有一个框架窗口,你可以修改和使用w_frame代替 继承的窗口
使用存在的PFC扩展层 你可以通过继承PFC扩展层窗口来创建一组应用程序的祖 先窗口.
应用程序窗口于是继承自应用程序专有的祖先窗口 通过继承w_frame来创建框架 窗口
启动窗口服务
PFC提供各种窗口服务是你能用来加入产品化应用程序特性.
许多这样的服务要求极少甚至不须编码.
窗口服务有:
基本窗口服务
偏好服务
状态栏服务 (限于框架窗口)
工作表管理服务 (限于框架窗口)
调整大小服务 (也适合属性页、属性页页面以及自定义的可视用户对象)
使用窗口服务:
1为窗口确定适当的窗口服务.
2使用of_Setservicename函数启动适当的窗口服务(本例子从窗口的 pfc_PreOpe n事件启动偏好和调整大小服务):
this.of_SetPreference(TRUE)
this.of_SetResize(TRUE)
3按需要调用其它函数以初始化服务 (本例子为菜单项和工具栏启动偏好服务并为 DataWindow务和两个按钮提供启动调整大小服务):
this.inv_preference.of_SetMenuItems(TRUE) this.inv_preference.of_SetTo olbars(TRUE)
this.inv_resize.of_Register &
(dw_emplist,0,0,100,100) this.inv_resize.of_Register &
(cb_ok,0,100,0,0)
this.inv_resize.of_Register &
(cb_cancel,0,100,0,0)
参阅 有关每种窗口服务的具体用法,参见 "窗口服务" .
开启PFC窗口
在许多应用程序,用户通过选择菜单项打开窗口.
你能使用PFC消息路由器帮助以可变的和固定的方法处理本过程.
参阅 参见 "消息路由器" .
从菜单项打开PFC窗口:
1在该菜单项,将Message.StringParm设为窗口名并调用菜单服务of_SendMessage 函数:
n_cst_menu lnv_menu Message.StringParm = "w_emplist"
lnv_menu.of_SendMessage(this, "pfc_Open")
2在框架窗口的 pfc_Open事件,添加代码到存取消息对象并打开请求的窗口:
String ls_window
w_sheet lw_sheet
ls_window = Message.StringParm
OpenSheet(lw_sheet, ls_window,this, 4,Original!)
其他选项 打开 PFC窗口的其它 方法.
这些包含直接从菜单选项打开窗口,扩充消息对象以包含传递的参数,以及通过定 义框架窗口的附加用户事件打开窗口.
使用响应式窗口
典型地,你使用 w_response ( PFC响应式窗口)创建显示并收集数据、设置或参 数选择的响应式窗口。
w_response的另一个用途 你还能使用 w_response创建响应式窗口以取代 Mess ageBox.
但是通常最好使用 w_message对话框 (出错信息服务部分).
W_response包含三个处理用户动作的用户事件,你可以在其中添加代码:
事件 使用它 更多信息
pfc_Apply 处理窗口内容,保持窗口打开 当前许多的应用程序包含Apply按钮来 执行本功能
pfc_Cancel 忽略窗口内容并关闭窗口 你从赋与Cancel特性的按钮调用本事件
pfc_Default 处理窗口内容并关闭窗口 你从赋与Default特性的按钮调用本事 件
使用w_response事件:
1创建一个继承自w_response的窗口.
2添加控件以处理显示和用户输入.
使用PFC标准可视用户对象 你能使用同PFC一起使用PowerBuilder窗口控件.
但是最好使用继承自PFC标准可视用户对象 (u_dw, u_lb, u_sle, u_cb,等等)的 控件.
3添加代码支持这些控件.
例如,添加代码到窗口的pfc_PreOpen事件,存取在 INI文件值以显示在SingleLi neEdit控件上.
4按需要在pfc_Apply、pfc_Cancel和pfc_Default事件中添加代码。.
例如, 可以在pfc_Default事件中保存窗口内容到INI文件并关闭窗口:
ls_String ls_temp ls_temp = trim(sle_base.Text)
SetProfileString("eisapp.ini",&
"Files","base",ls_temp)
ls_temp=trim(sle_x1.Text)
SetProfileString("eisapp.ini",&
"Files","extra1",ls_temp) ls_temp = trim(sle_x2.Text)
SetProfileString("eisapp.ini",&
"Files", "extra2", ls_temp)
Close(this)
5添加按钮以触发相应事件.
例如,OK按钮应调用 pfc_Default事件:
parent.Event pfc_Default()
使用 pfc_Apply
到最大化 reusability,把处理放置于pfc_Apply内和调用 pfc_Apply从 pfc_Def ault.
使用 pfc_Save过程
w_master pfc_Save事件为窗口中所有PFC和非PFC的 DataWindows自动确认并保 存改动.
因为 pfc_Save调用许多其它事件, 保存大多数工作到工作服务的逻辑单元,你应 该将它看作一个过程而不是作为一个单一的事件.
工作服务的逻辑单元 pfc_Save使用你通过调用of_SetLogicalUnitOfWork函数启 动的工作服务逻辑单元,.
如果你启动工作服务的逻辑单元, w_master按需要自动启动它.
虽然有许多方法保存数据,最好使用 pfc_Save事件保存改动.
除了简单地调用w_master pfc_Save事件和检查返回值之外,你能通过定制和扩充 被pfc_Save过程调用的事件来对更新过程进行完全控制.
你能:
为其它自更新对象保存改动(包括n_ds DataStore、u_tvs TreeView和u_lvs Lis tview)
为其它控件保存改动
控制哪个对象被更新和指定它们被更新的顺序
为其它窗口的对象保存改动
自更新对象 PFC将更新机能与某些对象结合,称作自更新对象 .
你当调用 w_master pfc_Save事件,它自动更新窗口中的所有自更新对象.
所有 DataWindows都是自更新的.
你必须为n_ds、u_lvs、u_tab和u_tvs明确地启动自更新功能.
并且你能为任何可视的或非可视的控件添加自更新功能.
参阅 有关自更新对象的详细信息,参见 "工作服务的逻辑部件" .
pfc_Save过程
本是 w_master pfc_Save过程:
Pfc_Save事件
这些是 pfc_Save过程中的事件:
事件 用途 注解
pfc_AcceptText 为窗口中的所有自更新对象执行 AcceptText功能 被w_maste r of_AcceptText函数调用
pfc_UpdatesPending 确定哪一个自更新对象有未决的更新 被w_master of_Up datesPending函数调用
pfc_Validation 在所有包含未决更新的自更新对象上执行合法性检验 被of_V alidation函数调用 为非PFC DataWindows,编写一个返回值类型为Integer或L ong的用户事件ue_validation,大于或等于0表示成功
pfc_UpdatePrep 空的用户事件,你可以随意添加准备更新的处理代码 如果窗 口本身是自更新对象则扩充本事件
pfc_PreUpdate 空的事件,你可以添加附加的合法性检验代码 返回 1为成功;
返回别的值则终止 pfc_Save过程
pfc_BeginTran 空的事件,如果你的 DBMS需要,你可以添加代码开始数据库事 务。 返回 1为成功;
返回别的值则终止 pfc_Save过程
pfc_Update 为所有有改动的自更新对象执行数据库更新 你能扩充本事件更新 非自更新控件
返回 1为成功;
返回 -1为失败.
如果返回 -1,同样通过调用 of_SetDBErrorMsg函数产生一个出错信息.
pfc_DBError事件将显示本信息
pfc_EndTran 空的事件,你用来添加提交或回滚数据库事务的代码 提交或回滚 基于传递的参数 虽然你能在其它 地方使用COMMIT和ROLLBACK语句,但最好在此 处使用它们
pfc_DBError 若有更新失败的话,本事件显示有关信息 如果Error服务被启动, 本事件调用 of_Message函数;
否则,它调用 PowerScript MessageBox函数 PFC延迟显示出错信息 (相对于p fc_Update)以便你能在显示出错消息框前在 pfc_EndTran事件中回滚改动
pfc_PostUpdate 为所有已更新对象复位更新标志,如下 如果你扩充了pfc_Sav e处理以更新其它控件,扩充本事件复位更新标志
Pfc_Save返回值
Pfc_Save返回如下值 :
返回值含义注解
1成功
0没有未决的更新
-1 AcceptText错误 pfc_Save过程中断
-2错误在 pfc_UpdatesPending pfc_Save过程中断
-3合法性错误 pfc_Save过程中断
-4错误在 pfc_PreUpdate pfc_Save过程中断
-5错误在 pfc_BeginTran pfc_Save过程中断
-6错误在 pfc_Update pfc_EndTran和 pfc_DBError事件完成;
pfc_PostUpdate未被执行
-7错误在 pfc_EndTran pfc_PostUpdate未被执行
-8错误在 pfc_PostUpdate
-9错误在 pfc_UpdatePrep pfc_Save过程中断
添加代码扩充 pfc_Save事件
你能定制和扩充 pfc_Save过程.
例如,你能:
添加代码到 pfc_EndTran事件以提交或回滚事务
创建ue_Validation用户事件并编写代码,以在非PFC DataWindows执行合法性检 验
扩充 pfc_Save过程以包含其它类型的窗口控件
添加代码到 pfc_EndTran事件:
加代码到 pfc_EndTran事件,检验ai_update_results参数并按需要为每个可以被 更新事务对象提交或回滚改动:
Integer li_return IF ai_update_results = 1 THEN
li_return = SQLCA.of_Commit()
ELSE
li_return = SQLCA.of_Rollback()
END IF
IF li_return = 0 THEN
Return 1
ELSE
Return -1
END IF
启动自更新对象
默认的, DataWindows是唯一可更新的自更新对象
所有其它 (n_ds、u_lvs、u_tvs、u_tab,以及任何用户自定义的可视用户对象) 是不可更新的,必须被显式地启动.
启动自更新对象:
1调用自更新对象的 of_SetUpdatable函数:
ids_data.of_SetUpdateable(TRUE) lv_1.of_SetUpdateable(TRUE) tv_1.of_Se tUpdateable(TRUE)
2 (仅DataStores)添加 n_ds-based DataStore到将被更新的控件的列表中:
PowerObject lpo_objs[] Integer li_count // this = window
lpo_objs = this.control
li_count = UpperBound(lpo_objs)
lpo_objs[li_count + 1] = ids_data
this.of_SetUpdateObjects(lpo_objs)
启动一个单次更新
PFC允许你指定一组控件并一次更新它们.
执行一个单次更新:
1指定被更新的控件:
PowerObject lpo_objs[ ]
Integer li_return
lpo_objs[1] = lv_1
lpo_objs[2] = dw_1
lv_1.of_SetUpdateable(TRUE)
2通过调用 pfc_SaveObjects事件执行单次保存:
// this = window
li_return = this.Event
pfc_SaveObjects(lpo_objs)
// Check for return codes 1 to -8 ...
使用PFC菜单
PFC通过函数、菜单项以及在m_master事件中的代码来实现菜单服务.
M_master包含:
调用消息路由器的函数
通过使用消息路由器执行所需功能的菜单项
从扩充层菜单继承 当使用菜单时,总是从m_前缀的菜单继承(不从pfc_前缀的菜 单继承).
当你升级 PFC版本时Pfc_前缀对象受改动的影响.
两个菜单继承策略
你能使用PFC的菜单或写你自己的.
使用PFC菜单
你的应用程序能使用 PFC菜单作为它的菜单的基础.
在大多数情况下,你使用m_master作为你的应用程序工作表窗口菜单的祖先并使用 m_frame作为框架菜单.
你添加所有应用程序的工具栏项和菜单项到 m_master.
让工作表菜从 m_master单继承,并且按需要的启动和禁止菜单项.
在 m_frame按需要禁止工具栏项和菜单项.
创建你的自己菜单
选择性的,你能实现和m_master分开的你自己的定制菜单.
如果你这样做,考虑使用菜单服务 of_SendMessage菜单函数实现 PFC消息路由器 功能.
扩充 PFC菜单
如果你使用 PFC菜单,你将需要修改它们或它们的子孙提供应用程序特定的处理.
当你添加新工具栏项和菜单项, PFC使用 PowerBuilder Shift Over/Down归因于 控件在哪里菜单项被地方:
在本菜单 PowerBuilder插入新项
菜单栏位于工具和窗口
文件菜单在删除上方
编辑菜单在更新上方连接
查看菜单在标尺上方
工具菜单在定制上方工具栏
窗口菜单在撤消下面
帮助菜单在关于上方
为信息为完成有关信息 Shift高于/往下特性,看见 PowerBuilder使用手册 .
创造你的自己菜单
PFC菜单提供菜单项覆盖最事件在 PFC控件.
你的应用程序可能更多专用的要求那辩护创造菜单从头做起为使用和你的 PFC窗 口.
创造菜单
使用菜单画板创建你的菜单.
加仅仅项必需的为你的应用程序,定义快捷键,加速键,并且工具栏位图作为需要.
创造扩充级如果你是对象管理人创造菜单为使用通过多重的开发者和应用程序,考 虑创造祖先菜单 (和 PowerScript和 PFC代码)并且空的扩充级菜单为使用通过 d
通话窗口
取决于你的需要,你能使用或者你的自己菜单-窗口通信方法或 PFC消息路由器.
当使用消息路由器,它最好到使用菜单服务 of_SendMessage函数到调用事件在窗 口.
每个菜单选项调用 of_SendMessage,通过事件的名字到调用.
例如,单击事件为编辑>剪切菜单选项调用 of_SendMessage如下:
n_cst_menu lnv_menu
lnv_menu.of_SendMessage(this, "pfc_Cut")
有二菜单项那要求专用的注意:
文件>退出调用应用程序管理器 pfc_Exit事件:
gnv_app.Event pfc_Exit()
MRU菜单项 (文件菜单)在调用前复制菜单选项正文到 Message.StringParm of_S endMessage:
n_cst_menu lnv_menu
Message.StringParm = this.Text
lnv_menu.of_SendMessage(this, "pfc_MRUClicked")
复制和粘贴你能保存时间通过复制和粘贴菜单选项手写体从 pfc_m_master.
启动地址项在窗口菜单
当窗口工作表管理器服务被启动, PFC菜单自动启动和禁止窗口菜单项作为适当的 .
如果你在使用工作表管理器服务和想要那机能在你的菜单,复制代码从 pfc_m_ma ster窗口菜单项选定的事件.
使用标准的菜单选项
M_master包含菜单项那调用用户事件在对应窗口.
使用菜单项如下:
如果菜单选项不适用于窗口制作它看不见的.
如果菜单选项应用到窗口评论 PowerScript代码在对应用户事件为联合的窗口, DataWindow,或可视的控件.
每 m_master菜单项触发某一个事件.
某些这样的用户事件空的;
你必须加适当的 PowerScript代码执行应用程序-专用的处理.
为信息如需要更多信息在 PFC用户事件,看见 PFC对象引用 .
文件菜单
菜单选项事件触发对象(s)包含用户事件
新建 pfc_New w_master
打开 pfc_Open u_rte, w_master
结束 pfc_Close w_master
保存 pfc_Save u_rte, w_master
保存为 pfc_SaveAs u_rte, w_master
打印 pfc_Print u_dw, u_rte, w_master
打印预览 pfc_PrintPreview u_dw, u_rte
页面设置 pfc_PageSetup u_dw, w_master
打印立即 pfc_PrintImmediate u_dw, u_rte, w_master
删除空的菜单选项加你的拥有事件或函数
属性空的菜单选项加你的拥有事件或函数
退出 pfc_exit N_cst_appmanager
编辑菜单
菜单选项事件触发对象(s)包含用户事件
撤消 pfc_Undo U_dw, u_em, u_mle, u_rte,并且 u_sle
剪切 pfc_Cut U_ddlb, u_ddplb, u_dw, u_em, u_mle, u_oc, u_rte,并且 u_sl e
复制 pfc_Copy U_ddlb, u_ddplb, u_dw, u_em, u_mle, u_oc, u_rte,并且 u_s le
粘贴 pfc_Paste U_ddlb, u_ddplb, u_dw, u_em, u_mle, u_oc, u_rte,并且 u_ sle
选择性粘贴 pfc_PasteSpecial U_oc
清除 pfc_Clear U_ddlb, u_ddplb, u_dw, u_em, u_mle, u_oc, u_rte,并且 u_ sle
全部选定 pfc_SelectAll U_ddlb, u_ddplb, u_dw, u_em, u_mle, u_rte,并且 u_sle
查找 pfc_Find DlgU_dw和 u_rte
替换 pfc_ReplaceDlg U_dw和 u_rte
更新连接 pfc_UpdateLinks U_oc
对象>编辑 pfc_EditObject U_oc
对象>打开 pfc_OpenObject U_oc
查看菜单
菜单选项动作对象包含用户事件
标尺 pfc_Ruler U_dw和 u_rte
大图标空的菜单选项.
加逻辑到 u_lvs切换到大图标查看
小图标空的菜单选项加逻辑到 u_lvs切换到小的图标查看;
调用从本菜单选项
表格空的菜单选项加逻辑到 u_lvs切换到表格查看;
调用从本菜单选项
详细空的菜单选项加逻辑到 u_lvs切换到详述查看;
调用从本菜单选项
重排图标>通过空的菜单选项加逻辑到 u_lvs重排图标通过一些公用属性;
调用从本菜单选项
重排图标>自动排列空的菜单选项加逻辑到 u_lvs重排图标;
调用从本菜单选项
第一 pfc_FirstPage U_dw和 u_rte
下一个 pfc_NextPage U_dw和 u_rte
在pfc_PreviousPage之前 U_dw和 u_rte
上一 pfc_LastPage U_dw和 u_rte
分类 pfc_SortDlg U_dw
过滤器 pfc_FilterDlg U_dw
缩放 pfc_Zoom U_dw
插入菜单
菜单选项事件触发对象(s)包含用户事件
文件 pfc_InsertFile U_rte
PICT格式标准 pfc_InsertPicture U_rte
对象 pfc_InsertObject U_oc
工具菜单
菜单选项事件触发对象(s)包含用户事件
定制工具栏 pfc_Toolbars W_frame
窗口菜单
菜单选项动作对象包含用户事件
串联 pfc_Cascade W_frame
水平平铺 pfc_TileHorizontal W_frame
垂直排列 pfc_TileVertical W_frame
层 pfc_Layer W_frame
全部最小化窗口 pfc_MinimizeAll W_frame
撤消 pfc_UndoArrange W_frame
帮助菜单
菜单选项事件触发对象(s)包含用户事件
帮助主题 pfc_Help W_master
关于 of_About N_cst_appmanager
使用弹出菜单
PFC也提供弹出菜单为使用通过你的应用程序和 PFC服务:
弹出菜单它当显示如何禁止扩充容量
M_edit显示你按当右翼-鼠标器按钮高于下列之一可编辑的可视的控件:
U_ddlb U_ddplb U_em U_mle U_rte U_sle禁止本机能,放 ib_rmbmenu例子变量错 误在控件的构造函数 eventYou能扩充 m_edit加应用程序-专用的右鼠标器按钮机 能
M_dw显示你按当右翼 u_dw的鼠标器按钮 -基本 DataWindow禁止本机能,放 ib_r mbmenu例子变量错误在 u_dw构造函数事件你能扩充 m_dw加应用程序-专用的右
M_oc显示你按当右翼 u_oc的鼠标器按钮 -基本 OLE容器禁止本机能,放 ib_rmbm enu例子变量错误在 u_oc构造函数事件你能扩充 m_oc加应用程序-专用的装备
M_lvs显示你按当右翼 u_lvs的鼠标器按钮 -基本 ListView禁止本机能,放 ib_r mbmenu例子变量错误在 u_lvs构造函数事件你能扩充 m_lvs加应用程序-专用的r igh
M_tvs显示你按当右翼 u_tvs的鼠标器按钮 -基本 TreeView禁止本机能,放 ib_r mbmenu例子变量错误在 u_tvs构造函数事件你能扩充 m_tvs加应用程序-专用的r igh
-- 迎着太阳,我们怒放
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.137.136.66]
|
|