发信人: mrliuz()
整理人: leitiger(2002-06-06 00:06:06), 站内信件
|
第四章 PFC的服务
概要:
这一章主要介绍了什么是PFC的Services ,以及如何使用它们。
1 应用程序服务
PFC提供了以下各种应用程序Services :
DataWindow caching
Debugging
Error
Application preference
Most recently uesed object
Security
Transaction registration
你必须通过n_cst_appmanager(应用程序管理器)来控制这些Services (这些S ervices实际上是应用程序管理器的是数据成员)。应用程序管理器(applicati on manager)通过调用成员函数来开启与关闭Services 。由于它们在应用程序管 理器的范围内有效。而应用管理器是全局变量,因此你可以在你的应用程序的任 何地方是使用应用程序Services 。
1. DataWindow caching service
概要:
Datawindow caching service为Datawindow提供了数据缓冲。它将数据保存在内 存中,从而减少了程序访问数据库的频率,加快了程序的执行速度。Datawindow caching service支持如下的数据源:
l_ Datawindow对象,它的数据可以来自于数据库表也可以来自存储过程。
l_ SQL语句
l_ Datawindow控件
l_ DataStore对象
l_ 数组中的数据
l_ 文件
PFC使用Powerbuilder的Datastore来实现Datawindow caching service 。它对应 的对象是n_cst_dwcache 。
PFC的代码实际只在父类对象中
这本书讲述的都是扩展类的对象,就像n_cst_dwcache 。而实际上PFC的代码全在 父类的对象中(pfc_n_cst_dwcache)。
使用方法
使用DataWindow caching 可以将数据库访问频率降到最低,可以加快程序运行速 度。
² 开启DataWindow caching
l_ 调用n_cst_appmanager的of_SetDWCache函数
gnv_app.of_SetDWCache(TRUE)
² 使用Datawindow caching :
1. 调用of_Register函数进行数据缓存,同时依据不同的数据提供相应的参数。
l_ 缓存Datawindow对象从数据库中检索出的数据时:你需要传递标识符(ident ifier)、事务对象、Datawindow对象名、其他参数(如果存在的话)。
l_ 缓存SQL语句从数据库中检索出的数据时:你需要传递标识符(indentifier) 、事务对象、SQL语句。
l_ 将数据缓存到数组中:传递标识符(identifier)、Datawindow对象名、数据 。
l_ 缓存DataWindow控件中的数据:传递标识符(identifier)、Datawindow控件 。
l_ 缓存DataStore中的数据:传递标识符(identifier)、DataStore对象。
l_ 缓存文件中的数据:传递标识符(identifier)、文件名。
2. 你可以使用函数of_IsRegistered(参数是对象本身),确定DataWindow对象 是否已经在caching service中注册了。
3. 调用函数of_GetRegistered函数访问已经缓存的数据。
Gnv_app.inv_dwcache.of_GetRegistered(”d_emplist”,ids_datastore)
Ids_datastore.ShareData(dw_emplist)
4. 调用函数of_Refresh检索已经缓存数据的DataWindow 。
5. 调用函数of_UnRegister函数停止数据缓存服务。
6. (可选)调用n_cst_appmanager的of_SetDWCache函数关闭DataWindow cachi ng service 。
gnv_app.of_SetDWCache(FALSE)
通常你没必要显示的关闭DataWindow caching service 。PFC在删除对象n_cst_ dwcache时会自动的关闭它。
2. Debugging service
概要:
Debugging service 在应用程序遇到错误时会自动显示错误信息。PFC的消息路由 当发现需要调用的事件不存在时便会使用Debugging service显示出错信息。
重要说明:PFC debugging service 只是一个开发工具。在用户的应用程序中不 要开启它。
使用方法
使用debugging service 可以帮助你在PFC的开发过程中解决问题。
1. 调用n_cst_appmanager的of_SetDebug函数开启Debugging service 。
gnv_app.of_SetDebug(TRUE)
2. PFC的对象首先检测应用程序的debugging状态,然后在适当的情况下显示错误 信息。
3. (可选)调用n_cst_appmanager的 of_SetDebug函数关闭Debugging service 。
gnv_app.of_SetDebug(FALSE)
多数情况下,你不需要显示的关闭Debugging service 。
关于PFC提供的两个工具(SQL Spy 和DataWindow Property)的使用请参考第七 章“PFC Utilities”。
3. Application preference service
概要:
你可以利用Application preference service保存、恢复应用程序、用户的信息 到INI文件或WINDOWS的注册表中。保存和恢复应用程序设置有如下两个好处:
l_ 延续性:保存应用程序的设置可以使得用户在下次使用软件时可以看到他上次 关闭软件的样子。也就是说用户不必每次使用软件时都重新设置他的软件环境。
l_ 容易维护:你可以无须更改n_cst_appmanager的代码的情况下更新应用程序的 设置。
PFC通过用户自定义对象n_cst_apppreference提供Application preference ser vice 。
这个Service保存应用程序的如下信息:
用户键(User key)
MicroHelp
Help File
Version
Logo bitmap
Copyright notice
DDETimeOut property
DisplayName property
DWMessage Title property
MicrohelpDefault property
RightToLeft property
ToolbarFrameTitle property
ToolbarPopMenuText property
ToolbarSheetTitle property
ToolbarUserControl property
Application preference service 同时保存如下的用户信息
ToolbarText property
ToolbarTips property
User ID
保存、恢复设置
Application perference service 在应用程序开启的时候会自动恢复应用程序在 关闭时保存的设置。这些信息可以保存到注册表中(只限于Windows95和Windows NT)或者INI文件中。你可以按照如下说明:
l_ 保存到注册表中:调用函数of_SetUserKey ,指定你需要保存的键。
l_ 保存到INI文件中:调用函数of_SetUserINIFile ,指定用于保存信息的INI文 件名。
使用步骤:
1. 调用n_cst_appmanager的of_SetAppPref函数开启Application preference s ervice 。
gnv_app.of_SetAppPref(TURE)
2. 依据不同的执行平台采用不同的方式保存应用程序信息。下面的例子就是在应 用程序的构造事件中保存应用程序的信息。同时假设你已经在n_cst_appmanager 中建立好了应用程序信息键、用户信息键、应用程序INI文件、用户INI文件。
IF this.of_IsRegistryAvailable() THEN
this.inv_apppref.of_SetAppKey(this.of_GetAppKey()) this.inv_ apppref.of_SetUserKey(this.of_GetUserKey())
ELSE
this.inv_apppref.of_SetAppINIFile(this.of_GetAppINIFile()) this.inv_ap ppref.of_SetUserINIFile(this.of_GetUserINIFile())
END IF
3. 调用函数of_SetRestoreApp和of_SetRestoreUser函数设置需要保存信息的类 型:
this.inv_apppref.of_SetRestoreApp(TRUE)
this.inv_apppref.of_SetRestoreUser(TURE)
4. Most recentily used object service
概要
你可以使用Most recentily used object service(最近使用对象Service)将最 经使用的对象、表单列在文件菜单下。默认情况下只允许显示5个最经使用对象。 但是,你可以改变这个数量。
PFC 通过n_cst_mru用户自定义对象提供MRU Service(Most recentily uesd ob ject service)。
MRU Service在应用程序启动时会自动的将应用程序关闭时保存的最经使用过的对 象信息加载到应用程序中。这些信息可以保存到注册表或者INI文件中。你可以通 过如下的方式:
l_ 保存到注册表中:调用函数of_SetUserKey函数确定要保存到注册表中的MRU信 息。
l_ 保存到INI文件中:调用函数of_SetUserINIFile函数指定用于保存MRU信息的 INI文件。
l_
你必须还要额外编写代码:
为了使用MRU Service ,你必须在你想启用MRU Service的窗口的两个事件中编写 代码。
l_ pfc_MRUProcess :在窗口开启时加载MRU信息。
l_ pfc_PreMRUSave :在窗口关闭时保存MRU信息。
与PFC菜单的结合
PFC的m_master菜单的FILE菜单包括了五个MRU菜单项,你还可以自己添加。
如果你的应用程序没有使用PFC的菜单,那么请以m_master为模板建立你自己的M RU菜单项。
使用MRU Service步骤
1. 调用n_cst_appmanager中的of_SetMRU函数开启MRU Service 。
gnv_app.of_SetMRU(TRUE)
2. 调用n_cst_appmanager的函数of_SetUserKey(尽适用于WIN95与WINNT)或of _SetUserINIFile函数(使用于所有的平台)确定需要保留的信息。下面的例子假 设你已经为n_cst_appmanager建立好了的用户键(保存到注册表)或者INI文件( 保存到INI文件)。下面的代码位于应用程序管理器(n_cst_appmanager)的构造 事件。
IF this.of_IsRegistryAvailable() THEN
this.inv_mru.of_SetUserKey(this.of_GetUserKey())
ELSE
this.inv_mru.of_SetUserINIFile(this.of_GetUserINIFile())
END IF
3. Register IDs with the MRU service by calling the n_cst_mru of_Regis ter function. An ID is the identifier that the window will use to retr ieve information out of the MRU service. This is an example of code yo u can add to the pfc_PreOpen event of the MDI frame window:
IF IsValid(gnv_app.inv_mru) THEN gnv_app.inv_mru.of_Register("myapp") END IF
4. Extend the pfc_MRUProcess event in each window that uses exclusive processing, adding code to open the sheet passing the necessary argume nts (be sure to add similar code to the frame window if you want to sp ecify exclusive items on the frame menu):
Window lw_frame, lw_window n_cst_menu lnv_menu n_cst_mruattrib lnv_mru attrib // Check parameters. IF IsNull(ai_row) THEN Return -1 END IF IF NOT IsValid(gnv_app.inv_mru) THEN Return -1 END IF // Retrieve row from DataStore. gnv_app.inv_mru.of_GetItem & (ai_row, lnv_mruattri b) // Get the MDI frame, if necessary. lnv_menu.of_GetMDIFrame(this.me nuid, lw_frame) OpenSheet(lw_window, & lnv_mruattrib.is_classname, lw_frame) Return 1
Performing other actions in the pfc_MRUProcess eventTo see other types of processing you can perform in the pfc_MRUProcess event, see the co mments in the pfc_w_master pfc_MRUProcess event.5Extend the pfc_PreMRU Save event in each window that uses the MRU service. In this event, po pulate the n_cst_mruattrib object with the id, classname, key, item, a nd MicroHelp to be saved:
anv_mruattrib.is_id = "myapp" anv_mruattrib.is_classname = this.ClassN ame() anv_mruattrib.is_menuitemname = this.Title anv_mruattrib.is_menu itemkey = this.ClassName() anv_mruattrib.is_menuitemmhelp = & "O pens " + this.Title Return 1 6Extend the pfc_MRURestore event in eac h window that uses the MRU service. In this event, set the ID of the i nformation you want to display on the menu:
If IsValid(gnv_app.inv_mru) Then Return gnv_app.inv_mru.of_Restore ("myapp", This) End If
5. Error message service
概要
Error Message service提供了许多用于显示、纪录应用程序的错误信息。你既可 以显示PowerBuilder提供的标准的Message对话框,也可以显示PFC的W_Message对 话框。两种显示效果都具有如下的功能:
l_ 消息日志:将消息纪录到文件中,支持多种平台。PFC会自动的将严重级别大 于某个值的消息纪录到文件中。
l_ 支持MAPI:通过Email发出错误警告。PFC会自动将严重级别大于某个值的消息 作为邮件发出。
l_ 消息数据库:通过已经定义好的形式(可以是数据库或文件)来存取消息。定 义好了消息格式,使得消息有一种标准的形式、消息的重复减到最少、容易查询 。
l_ 参数替代:消息可以具有参数,这样它会依据程序运行而变化。
l_ 不显示,直接纪录:消息可以不显示直接纪录到日志中。
l_ 注释与打印:用户可以打印消息,甚至可以增加注释。对消息日志用于邮件时 非常有用的。
l_ 自动关闭:w_message过了数秒后会自动关闭。
W_message 位图
如果你使用w_message ,位图在运行时必须有效。
用法
Error service可以处理应用程序所有的错误信息。如果你打算将错误信息保存到 数据库中,你可以使用PFC.DB中关于消息的几个表,或使用消息管道将它传到你 的数据库中。
使用Messages表
大多数情况下,你应该将Messages表复制到你的数据库中。这个表已经包含了PF C的错误信息格式。
使用步骤:
1. 调用n_cst_appmanager的of_SetError函数开启error message service(创建 n_cst_error实例),下面的代码位于n_cst_appmanager的pfc_Open事件:
this.of_SetError(TRUE)
2. 定义错误消息的源:
l_ 如果消息源是文件,调用如下函数:
this.inv_error.of_SetPredefinedSource(“c:\eisapp\eiserr.txt”)
l_ 如果消息源是数据库,调用如下函数:
this.inv_error.of_SetPredefinedSource (itr_error)
消息源:当你使用文件作为消息源时,文件中必须包括PFC.DB中Messages表中的 所有数据。同时列必须由TAB键隔开。
PFC uses predefined messages in certain situations. If you enable the error message service and receive message display errors, make sure th e error message source has been established correctly. Additional user -defined messages must conform to the format of the messages table (al so used by the d_definedmessages DataWindow object).
l_ (可选)设置日志文件名(调用函数of_SetLogFile参数为空字符串可以不进 行日志纪录):
this.inv_error.of_SetLogFile(”C:\pb6\errlog.txt”)
l_ (可选)设置用户ID(用于日志文件):
this.inv_error.of_SetUser(this.of_GetUserID())
l_ (可选)设置什么类型的消息需要自动纪录:
this.inv_error.of_SetNotifySeverity(5)
this.inv_error.of_SetLogSeverity(4)
l_ (可选)如果你的应用程序使用了错误自动通告功能。你需要设置当前用户的 Email、密码。还可以设置其他的Email用户与密码。下面的例子展示了如何设置 Email ID与Password 。
this.inv_error.of_SetNotifyConnection(ims_mailsess) this.inv_error.of _SetNotifyWho(is_autonotify)
说明:以上的代码都可以在n_cst_appmanager的pfc_Open事件中。
l_ 在应用程序的错误检测中,使用函数of_Message显示对话框。同时你还可以将 它纪录到日志中。函数of_Message可以使用数据库中的消息,也可以动态的指定 消息。下面的例子就是使用数据库中的消息:
gnv_app.inv_error.of_Message(”EIS0210”)
使用参数表(只限于已定义的消息)
1. 在消息表中定义如下的数据。%运行时将被替换:
EIS1030 Unable to find the file % in %
2. 定义一个参数数组:
String ls_parms[]
ls_parms[1] = “Logfile.txt”
ls_parm[2] = “c:\windows\system”
3. 调用of_Message ,传递参数:
gnv_app.inv_error.of_Message(”EIS1030”,ls_parms)
PFC在显示消息时使用数组中的第一个元素替换第一个% ,第二元素替换第二个% 。
6. Security service
概要
PFC的安全机制可以处理许多你的应用程序安全性问题。它包括应用程序管理员组 件、安全对象(security object)n_cst_security 。
用法:在使用Security service时,你必须要定义用户组与用户,然后分别与窗 口、菜单、用户对象、控件相关联,然后再编写代码。
使用步骤:
1. 定义用户、用户组。参考第七章”PFC Utilities”
为你的窗口控件、菜单、用户对象、其他控件定义安全属性。参考第七章”PFC Utitities”
2. 调用n_cst_appmanager的of_SetSecurity函数创建安全对象
this.of_SetSecurity(TRUE)
3. 为安全对象建立一个事务对象。
Itr_sec = Create n_tr
Connect using itr_sec;
4. 调用函数of_InitSecurity初始化安全对象。
This.inv_security.of_InitSecurity(itr_sec.”EISAPP”,gnv_app.of_GetU serID(),”DEFAULT”)
5. 以上的代码全部在n_cst_appmanager的pfc_Open事件中编写。
6. 应用程序关闭时,断开事务对象的连接、删除事务对象。以下的例子在n_cst _appmanager的pfc_Close事件中。
Disconnect using itr_sec;
Destroy itr_sec
7. 在你需要使用安全对象的窗口的Open事件或pfc_PreOpen事件中调用函数of_S etSecurity()
IF NOT gnv_app.inv_security.of_SetSecurity(this) THEN
MessageBox("Security","Unable to set security")
Close(this)
End if
说明:你可以在其他对象(Datawindow、可视用户对象、菜单,所有你想实现安 全机制的对象)。
7. Transaction registration service
概要
Transaction registration service可以追踪你的应用程序中的事务对象的使用 过程。这个服务只对基于n_tr的对象有效。PFC使用n_cst_trregistration对象实 现Transaction registration service 。
用法
当应用程序中使用多个事务对象时,你应该使用Transaction registration ser vice跟踪所有的事务对象。当你的应用程序关闭时,该对象将会自动删除所有已 注册的事务对象。使用n_tr的函数of_SetAutoRollback设置ib_autorollback的值 。如果ib_SetAutoRollback的值为False ,则事务对象关闭时将会自动提交。如 果ib_SetAutoRollback的值为True ,则事务对象关闭时会自动回滚。
启动 Transaction registration service
l_ 调用n_cst_appmanager的of_SetTrRegistration函数
gnv_app.of_SetTrRegistration(True)
当应用程序关闭时,应用程序会自动删除 Trasaction registration service 。
注册事务对象:
l_ 调用n_cst_trregistration的of_Register函数
gnv_app.inv_trregistration.of_Register(SQLCA)
控制当事务对象正处于连接时被删除时的行为
l_ 调用n_tr的of_SetAutoRollback函数
SQLCA.of_SetAutoRollback(True)
如果你设置为True ,同时该对象正处于连接状态,当它被删除时Service会回滚 该事务。如果你设置为False ,Service回提交该事务。尽管如此,你应该显示的 提交或回滚、断开连接。
2 Datawindow服务
概要
大部分的PowerBuilder的应用程序都大量的使用了Datawindow控件。PFC因此提供 了功能强大的Datawindow Services 。大部分的Service使用时只需一点代码或者 根本不需要编码。PFC的Datawindow Servies实际上都是由一个公共的父类对象( 不可视用户自定义对象)继承而来。这个父类对象包括了许多Service的函数、事 件、实例变量。同时么每个Datawindow Service还有自己的函数、事件、实例变 量。
访问Datawindow Services
为了使用DataWindow Services,你应该建立基于u_dw的Datawindow对象。U_dw对 象包括:
l_ 用于开启、关闭Datawindow Services的函数。
l_ 用于调用各种Services的函数、事件、实例变量的引用变量。
l_ 调用Datawindow Service的函数、事件的Precoded事件、用户事件
l_ 可供你编写代码的空事件
在你的应用程序中所有的DataWindow控件都必须是u_dw的子类。
开启DataWindow Services
只开启Datawindow控件需要的Servie ,这样才能将应用程序的负荷将到最小。以 下表格列出了所有的Datawindow Service ,以及对应的对象。
DataWindow Service 对应的对象
Datawindow service的基类 n_cst_dwsrv
Dropdown search service n_cst_dwsrv_dropdownsearch
Filters service n_cst_dwsrv_filter
Find andreplace service n_cst_dwsrv_find
Linkage service n_cst_dwsrv_linkage
Multitable update service n_cst_dwsrv_multitable
Print preview service n_cst_dwsrv_printpreview
DataWindow property service n_cst_dwsrv_property
Querymode service n_cst_dwsrv_querymode
Reporting service n_cst_dwsrv_report
Required column service n_cst_dwsrv_reqcolumn
DataWindow resize service n_cst_dwsrv_resize
Row management service n_cst_dwsrv_rowmanager
Row selection service n_cst_dwsrv_rowselection
Sort service n_cst_dwsrv_sort
8. DataWindow Services 的父类
概要
DataWindow Services的父类包括了所有DataWindow Services需要的Instance变 量、事件、函数。PFC使用n_cst_dwsrv实现DataWindow Services的父类。
DataStore Service:DataStore Service的对象是n_cst_dssrv
用法
你可以使用这些Service实现如下功能
l_ 获取、设置DataWindow信息
l_ 修改、获取DataWindow脚本函数
l_ 默认DataWindow service
父类函数在子类中有效
因为n_cst_dwsrv是所有DataWindow services的父类,因此所有在n_cst_dwsrv的 函数在它的子类中都有效。
开启Basic DataWindow service
l_ 调用u_dw的of_SetBase函数
dw_emplist.of_SetBase(TRUE)
当Datawindow被删除时u_dw会自动删除该Service 。
访问DataWindow
l_ 调用n_cst_dwsrv中的函数
函数 调用
of_Describe 访问DataWindow的属性、列。
Of_GetHeaderName 确定某一列的列名
Of_GetHeight 确定某一列的高度
Of_GetObject 依据对象名访问DataWindow中的对象
Of_GetWidth 确定某一列的宽度
Of_GetItemOf_GetItemAny 获取DataWindow中某一列的数据(任何类型数据)。
给DataWindow设置数据
l_ 调用n_cst_dwsrv中如下函数:
函数 调用
of_Modify 修改DataWindow属性、列。
Of_SetItem 设置、修改DataWindow的数据(任何数据类型)。
刷新DataWindow中所有的下拉DataWindow:
l_ 调用函数of_PopulateDDDWs
Integer li_return
li_return = dw_emplist.inv_base.of_PopulateDDDWs()
gnv_app.of_GetFrame().SetMicroHelp(String(li_return) + " DDDW columns
refreshed")
访问DataWindow service的默认值:
l_ 调用如下的函数
函数 调用说明
of_GetColumnDisplayName 确定DataWindow中某一列的显示名。
Of_GetColumnNameStyle 确定当DataWindow需要显示列时那些列需要显示
Of_GetDefaultHeaderSuffix 确定DataWindow列名的默认后缀。
Of_GetDisplayItemOf_GetDisplayUnits 确定关闭时显示的消息
Of_SetColumnDisplayNameStyle 确定当DataWindow Service需要显示列时显示的 信息l_ DataWindow列名l_ Database列名l_ DataWindow列标题名
Of_SetDefaultHeaderSuffix 设置默认的DataWindow列标题的后缀
Of_SetDisplayItemOf_SetDisplayUnits 设置关闭时显示的信息
9. Dropdown DataWindow search service
概要
PFC下拉DataWindow seach service提供了一个当用户敲入一个字母后自动滚到该 字母开头的数据项上。它对应的对象是n_cst_dwsrv_dropdownsearch 。
使用方法
开启Dropdown DataWindow search service
1. 调用u_dw的of_SetDropDownSearch函数
this.of_SetDropDownSearch(TRUE)
U_dw被删除时会自动删除这些Service 。
2. 在DataWindow控件的EditChanged事件中调用n_cst_dropdownsearch的pfc_Ed itChanged事件:
this.inv_dropdownsearch.event pfc_EditChanged(row,dwo,data)
3. 在DataWindow控件的ItemFocusChanged事件中调用n_cst_dwsrv_dropdownsea rch的pfc_ItemFocusChanged事件
this.inv_dropdownsearch.Event pfc_ItemFocusChanged(row,dwo)
4. 调用函数of_AddColumn为DataWindow的列启用DropDown DataWindow search service 。
this.inv_dropdownsearch.of_AddColumn(“dept_id”)
10. Filter service
概要
PFC的Filter service提供了一个非常简单易用的过滤功能。它对应的对象是n_c st_dwsrv_filter 。
使用说明
Filter service自动的显示过滤对话框。你所要作的只是开启Service、指定过滤 类型。你可以选择三种过滤对话框。
l_ PowerBuilder标准对话框
l_ 两种PFC提供的对话框
l_ w_filtersimple 下拉Listbox界面。
l_ w_filterextended Tabbed界面。
开启Filter service
l_ 调用u_dw的of_SetFilter函数,设置事务对象,指定过滤对话框使用DataWin dow的列标题:
dw_emp.of_SetFilter(TRUE)
dw_emp.of_SetTransObject(SQLCA)
dw_emp.inv_filter.of_SetColumnDisplayNameStyle(dw_emp.inv_filter.HEADE R)
u_dw在被删除时会自动删除该Service 。
设置过滤风格:
l_ 调用函数of_SetStyle,指定对话框风格:
dw_emplist.inv_filter.of_SetStyle(dw_emp.inv_filter.SIMPLE)
显示过滤对话框:
l_ 调用事件pfc_FilterDlg事件:
dw_emplist.inv_filter.event pfc_FilterDlg()
你无须显示的调用该事件。大多数情况下,用户通过选择View>Filter菜单显示过 滤对话框。
11. Find and replace service
概要
PFC的Find and replace service使得你可以在你的应用程序中加入查找与替换功 能。它对应的对象是n_cst_dwsrv_find 。
使用说明
你可以使用该服务为DataWindow提供查找与替换的功能。可以显示w_find窗口或 w_replace窗口。如果用户在m_master菜单的子类中选择了Edit>Find或Edit>Rep lace时该服务将自动显示w_find或m_master窗口。
开启Find service
l_ 调用u_dw的of_SetFind函数:
dw_emplist.of_SetFind(TRUE)
U_dw被删除时将自动删除该服务
显示w_find对话框:
l_ 调用u_dw的pfc_FindDlg事件
dw_Emplist.Event pfc_FindDlg()
你无须显示的调用该事件。用户选择Edit>Find时会自动显示w_find对话框。
显示w_replace对话框:
l_ 调用u_dw的pfc_ReplaceDlg事件:
dw_emplist.Event pfc_ReplaceDlg()
你无须显示的调用该事件。用户选择Edit>replace时会自动显示w_replace对话框 。
12. Linkage service
概要
PFC的linkage service帮助你实现主/从窗口合作处理。
Linkage service包括如下功能:
l_ Linkage style(连接风格):控制从窗口的DataWindow检索数据、过滤数据 、滚动到特定行。
l_ Update style(更新风格):控制Linkage service更新DataWindows的方式( top-down, bottom-up, top-down then bottom-up, bottom-up then top-down, or a developer-specified custom update)
l_ 数据发生变化时的提醒窗口:当主数据发生变化,从数据即将丢失时,该选项 可以显示一个提醒窗口。
l_ 删除数据时的提醒窗口:当用户删除数据时可以显示提醒窗口
l_ Cascading key changes:当用户改变主纪录时,Linkage service会自动修改 从纪录
l_ 删除风格:当你删除主纪录时,该选项可以设成删除从纪录、不理会从纪录。
l_ 更新扩展:允许你将其他的控件也作为默认数据保存过程。
使用说明
你可以使用Linkage service处理各种DataWindow中的合作。尽管如此,大部分时 候都是用于处理主/从关系的DataWindow 。
开启Linkage service:
l_ 调用u_dw的of_SetLinkage函数:
dw_emplist.of_SetLinkage(TRUE)
u_dw自动删除所有Service 。
使用Linkage service实现主/从处理:
1. 在主从DataWindow中同时开启Linkage service:
dw_master.of_SetLinkage(TRUE)
dw_detail.of_SetLinkage(TRUE)
2. 分别为主从DataWindow设置事务对象:
dw_master.inv_linkage.of_SetTransObject(SQLCA)
dw_detail.inv_linkage.of_SetTransObject(SQLCA)
3. 将从DataWindow连接到主DataWindow中:
dw_detail.inv_linkage.of_SetMaster(dw_master)
4. 调用函数of_Register注册关联列:
dw_dwtail.inv_linkage.of_Register(”emp_id”,”emp_id”)
5. (可选)(Optional) Specify that the service updates DataWindows fro m the bottom of the linkage chain on up (the default is to update top down):
dw_detail.inv_linkage.of_SetUpdateStyle(dw_detail.inv_linkage.BOTTOMUP )
6. 调用函数of_SetStyle建立当主数据改变时从数据的动作。
下面的例子说明了当主数据改变时从数据检索数据:
dw_detail.inv_linkage.of_SetStyle(dw_detail.inv_linkage.RETRIEVE)
7. 调用主DataWindow的of_Retrieve函数:
IF dw_master.of_Retrieve()= -1 特Then
MessageBox(”Error”,”Retrieve error”)
Else
Dw_Master.SetFocus()
End if
你可以将以上的代码全部写在一个事件中。
8. 在主DataWindow的pfc_Retrieve事件中添加检索数据的代码:
Return this.Retrieve()
检索数据:如果Linkage service刷新了从数据。你只需要编写代码检索主DataW indow。如果你打开了filter和scroll选项,你必须在从DataWindow中编写检索数 据函数。
数据改变时的提醒窗口(尽限于retrieval风格)
1. 在从DataWindow中调用of_SetUpdateOnRowChange函数:
dw_detail.inv_linkage.of_SetUpdateOnRowChange(TRUE)
2. 在从Datawindow中调用of_SetConfirmOnRowChange函数
dw_detail.inv_linkage.of_SetConfirmOnRowChange(TRUE)
数据删除时的提醒窗口
1. 在从DataWindow中调用of_SetUpdateOnRowChange函数:
dw_detail.inv_linkage.of_SetUpdateOnRowChange(TRUE)
2. 在从DataWindow中调用of_SetConfirmOnDelete函数
dw_detail.inv_linkage.of_SetConfirmOnDelete(TRUE)
开启casacding key
l_ 在所有关联的DataWindow中调用of_SetSyncOnKeyChange函数
dw_master.inv_linkage.of_SetSyncOnKeyChange(TRUE)
dw_detail.inv_linkage.of_SetSyncOnKeyChange(TRUE)
设置删除风格:
l_ 在主DataWindow中调用函数of_SetDeleteStyle
dw_master.inv_linkage.of_SetDeleteStyle(dw_cust.inv_linkage.DISCARD_R OWS)
启用更新扩展:
l_ 为其他需要添加到默认保存过程中的控件调用函数of_SetOtherSaveObjects
PowerObject lpo_objs[ ]
// This example adds the lv_salesinfo ListView
// to the save process.
lpo_objs[1] = lv_salesinfo
dw_master.inv_linkage.of_SetOtherSaveObjects(lpo_objs)
13. Multitable update service
PFC的多表更新服务(Multitable update service)使得你的DataWindow可以轻 松更新多表。它对应的对象是n_cst_dwsrv_multitable 。
DataStore services
该服务同样适用于DataStore ,对应的对象是n_cst_dssrv_multitable 。
使用说明:
当你需要更新的数据涉及到多个表时就需要使用该服务。当你调用w_master的pf c_Save事件时。PFC会更新所有的表。
开启多表更新服务:
l_ 调用函数u_dw的函数of_SetMultiTable:
dw_emplist.of_SetMultiTable(TRUE)
u_dw会自动删除所有的服务
指定需要更新的表:
l_ 调用函数of_Register设定需要更新的表:
String ls_projcols[] = {“proj_id”}
String ls_taskcols[] = {“proj_id”,”task_id”}
Dw_project.inv_multitable.of_Register(“project”,ls_projcols)
Dw_project.inv_multitable.of_Register(“task”,ls_taskcols)
(可选)更新包含多表数据的DataWindow
l_ 调用w_master的函数pfc_Save事件
Integer li_return
Li_return = w_sheet.Event pfc_Save()
…
14. Print preview service
概要
PFC的打印预览服务使你的DataWindow可以具备打印预览的功能:
l_ 打印预览
l_ 第一页、下一页、上一页、最后一页
l_ 放大、缩小
菜单m_master的子类会自动访问这些功能。它对应的对象是n_cst_dwsrv_printp review 。
该服务对DataStore同样有效,它对应的对象是n_cst_dssrv_printpreview 。
使用说明
该服务使得你的应用程序具备了打印预览的功能。用户选择File>Print Preview 菜单项便进入预览模式。
开启打印预览模式:
l_ 调用u_dw的of_SetPrintPreview函数:
dw_emplist.of_SetPrintPreview(TRUE)
u_dw自动会删除所有的服务。
15. DataWindow properties service:
概要
DataWindow属性服务允许你显示DataWindow的属性窗口。还可以
l_ 开启、关闭其他的DataWiindow服务
l_ 察看某个服务的PFC语法
l_ 交互式的访问、修改DataWindow的属性,具体如下:
DataWindow buffers
Row and column status
Statistics
Properties of all objects on the DataWindow object
详情察看”DataWindow Properties window”
使用说明:
开启DataWindow属性服务(DataWindoe Properties service)
1. 调用函数of_SetProperty:
dw_emplist.of_SetProperty(TRUE)
U_dw会自动的删除所有的Service 。
2. 当DataWindow出现时,右击,选择DataWindow属性:
16. Query mode service
概要
PFC的查询模式使得你可以轻松的在你的应用程序中加入查询模式。它也可以帮助 你懂得如何使用、理解查询模式。在查询模式中,用户可以点击右键,在弹出式 菜单中选择显示的列、操作符、数据。它对应的对象是n_cst_dwsrv_querymode 。
使用说明
你可以使用PFC的Query service实现如下功能:
l_ 开始、中止查询模式
l_ 选择某列
l_ 将查询结果保存到文件中,调用以前的查询结果。
开启查询模式服务
l_ 调用u_dw的of_SetQuerymode函数
dw_emplist.of_SetQuerymode(TRUE)
u_dw会自动删除所有的Service 。
进入查询模式:
l_ 调用函数of_SetEnabled,参数为TRUE
dw_emplist.inv_querymode.of_SetEnabled(TRUE)
结束查询模式:
l_ 调用函数of_SetEnabled,参数为FALSE
dw_emplist.inv_querymode.of_SetEnabled(FALSE)
设定查询列:
l_ 调用函数of_SetQueryCols,参数为需要查询的列数组:
String ls_cols[]
Ls_cols[1] = “emp_dept_id”
Ls_cols[2] = “emp_id”
Dw_emplist.inv_querymode.of_SetQueryCols(ls_cols)
当你调用函数of_SetEnabled ,查询模式服务会保护为被选择的列。
将查询保存到文件中:
1. 调用函数of_SetEnabled(TRUE)开始查询模式。
2. 许用户设定查询条件。
3. 调用函数of_Save
该函数会出现一个对话框提示用户输入用于保存数据的文件名。
从文件中加载查询:
l_ 调用函数of_Load
该函数出现一个对话框提示用户输入用于加载的文件名。
17. Reporting service
概要
PFC的报表服务增强了DataWindow的显示、打印功能。该服务中的许多函数既可以 修改DataWindow中的对象也可以获得DataWindow中的修改语法,并为你的修改语 句所用。If you code more than two consecutive report service functions , consider returning the Modify syntax, concatenating the strings and issuing the Modify function from within your own code 。
DataWindow必须使用PBUs或者pixels
使用该Service,DataWindow必须使用PBUs或者pixels作为度量单位。它不允许使 用英尺、公分(It does not work with DataWindows that use thousandths o f an inch or thousandths of a centimeter as the DataWindow Unit)。它对 应的对象是n_cst_dwsrv_report 。
该服务同样适用于数据存储(DataStore),对应的对象是n_cst_dssrv_report 。
使用说明
你可以使用该服务实现如下功能:
l_ 给DataWindow增加一项
l_ 建立复合报表。操纵起来就像使用一个报表一样。
l_ 格式化与打印
l_ 设置背景、颜色、边框
l_ 放大、缩小
On Macintosh:函数of_AddComputer、of_AddText、of_GetTextSizePos函数不可 用。
开启报表服务:
l_ 调用函数of_SetReport
dw_emplist.of_SetReport(TRUE)
U_dw会自动删除所有的service 。
给DataWindow增加一项:
l_ 调用n_cst_dwsrv_report中的如下函数
函数 用途
of_AddCompute 增加一个计算列
of_AddLine 增加一行
of_AddPicture 增加一幅图片
of_AddText 增加字符
建立符合报表:
1. 调用函数of_CreateComposite,传递需要复合的DataWindow信息:
String ls_dws[ ], ls_trailfooter[ ]
String ls_slide[ ]
String ls_return
Integer li_return
Boolean lb_vertical
Border lbo_border[ ]
lb_vertical = TRUE
ls_dws[1] = "d_employee"
ls_dws[2] = "d_benefits"
ls_trailfooter[1] = "No"
ls_trailfooter[2] = "Yes"
ls_slide[1] = "AllAbove"
ls_slide[2] = "AllAbove"
lbo_border[1] = Lowered!
lbo_border[2] = Lowered!
li_Return = dw_composite.inv_report.of_CreateComposite(ls_dws, lb_vert ical, ls_trailfooter, ls_slide, lbo_border)
IF li_Return = 1 THEN
dw_composite.SetTransObject(SQLCA)
dw_composite.Event pfc_Retrieve( )
END IF
2. 打印与显示复合报表
dw_composite.inv_report.of_PrintReport(TRUE,FALSE)
打印输出Datawindow:
l_ 调用函数of_PrintReport。
设置默认值、颜色、边框:
调用n_cst_dwsrv_report中的如下函数
函数 用途
of_SetDefaultBackColor 修改DataWindow的默认值
of_SetDefaultBorder
of_SetDefaultCharset
of_SetDefaultColor
of_SetDefaultFontFace
of_SetDefaultFontSize
of_SetBorder 修改一个或多个DataWindow中的对象的边框
of_SetColor 修改一个或多个DataWindow中的对象的颜色、背景色
控制DataWindow的大小:
l_ 调用函数of_SetRelativeZoom
缩放与当前的显示有关:函数Of_SetRelativeZoom的参数是当前大小的百分数。 例如DataWindow当前显示的大小是正常的80%,此时你调用函数of_SetRelativeZ oom(50),当前大小即变为40% 。
18. Required column service
概要
PFC的非空列服务(Required column service)可以处理那些必须要输入数据的 列。它使得你非常容易的处理那些输入不完整的数据。该服务只适用于那些具有 nilisnull属性的列。例如,EditMasks不具备该属性,因此非空列服务不适用于 Edit Mask 。
它对应的对象是n_cst_dwsrv_reqcolumn 。
使用说明
DataWindow非空列的处理会与GUI界面的应用程序产生冲突。非空列服务可以将对 非空列的处理留到用户输入数据完毕后处理。该服务允许你设置哪些列是非空列 。
非空列的检测:当你调用Window的pfc_Save事件时它会自动的进行非空列的检测。
开启非空列服务
l_ 调用函数of_SetReqColumn
dw_emplist.of_SetReqColumn(TRUE)
U_dw会自动删除所有的服务
放弃某些列的非空处理:
l_ 调用函数of_RegisterSkipColumn指定哪列需要保留PowerBuilder标准的非空 列处理:
dw_Emplist.inv_reqcolumn.of_RegisterSkipColumn(”dept_id”)
19. Row management service
概要
PFC的Row management service允许你插入、删除数据。同时还提供了恢复被删除 的数据功能。它对应的对象是n_cst_dwsrv_rowmanager 。
使用说明:
该服务有如下作用:
l_ 在DataWindow的最后加上一行空记录
l_ 在两行数据之间插入一行记录
l_ 删除一条或多条记录
l_ 显示一个对话框用于允许你恢复已删除的记录。
开启行管理服务(Row Management service)
l_ 调用函数of_SetRowManager:
dw_Emplist.of_SetRowManager(TRUE)
在DataWindow的末尾增加一条记录:
l_ 调用事件pfc_AddRow:
Long ll_return
ll_return = dw_emplist.inv_rowmanager.Event pfc_AddRow()
IF ll_return = -1 THEN
MessageBox("Error", "Error adding empty row")
END IF
当用户从弹出式菜单m_dw中选择Add时,PFC会自动的调用该事件。
在两记录之间插入数据:
l_ 调用事件pfc_InsertRow
下面的例子在当前行中插入数据:
Long ll_return
ll_return = dw_emplist.inv_rowmanager.Event pfc_InsertRow()
IF ll_return = -1 THEN
MessageBox("Error", "Insert error")
END IF
当用户在弹出式菜单m_dw中选择Insert时,PFC会自动的调用该事件。
删除数据:
l_ 调用函数pfc_DeleteRow事件
下面的例子删除当前行或选择的行:
Long ll_return
ll_return = dw_emplist.inv_rowmanager.pfc_DeleteRow()
IF ll_return = -1 THEN
MessageBox("Error", "Deletion error")
END IF
当用户选择弹出式菜单m_dw的Delete时,PFC会自动调用该事件。为了实现多选供 功能使用行选择服务(row selection service。
恢复已删除的数据:
l_ 调用事件pfc_RestoreRow
该事件调用 of_UnDelete,同时出现一个对话框给用户用于用户选择需要恢复的 记录。
20. Row selection service
概要
PFC的行选择服务(Row selection serviec)允许你在DataWindow中实现单个、 多个、扩展的选择能力。它对应的对象是n_cst_dwsrv_rowselection 。
使用说明:
行选择服务自动处理的所有的行选择处理。所有你需要作的只是开启该服务、指 定你所想要的风格
l_ 单行选择:当你的DataWindow只允许实现单行选择是请采用此风格。
l_ 多行选择:允许你的用户一次选择多条记录。这些记录可以是连贯的也可以是 非连贯的。当使用多行选择风格时,程序运行时,用户单击后会触发row’s 选择 状态。该特性与listbox的多项选择相似。
l_ 扩展的选择:你可以使用键盘与鼠标共同实现选择操作,SHIFT+Click,CTRL +Click 。
同样该风格也相似与listbox的扩展选择。
开启行选择服务:
l_ 调用u_dw的函数of_SetRowSelect(TRUE)
U_dw会自动删除所有的服务。
设定行选择风格:
l_ 调用函数of_SetStyle ,指定你想设定的行选择风格:
dw_emplist.inv_rowselect.of_SetStyle(dw_emplist.inv_rowselect.EXTENDE D)
21. DataWindow resize service
概要
PFC的resize服务使得用户在改变窗口大小时自动的改变DataWindow中的列的大小 。它对应的对象是n_cst_dwsrv_resize 。
使用说明:
你可以使用resize服务使得你的DataWindow中的列自动的随着Window的大小变化 而变化。
特别说明:你不可以在Composite或者RichTextEdit风格的Datawindow中使用Res ize服务。
开启DataWindow的Resize服务:
1. 调用u_dw的of_SetResize函数、设置事务对象、依据列标题指定排序对话框:
dw_emp.of_SetResize(TRUE)
u_dw会自动删除所有的服务。
2. (可选)调用函数of_SetOrigSize设置DataWindow控件的原始大小。当你在M DI窗口下打开一表单(Sheet)时可以使用该函数替代枚举变量Original!:
this.inv_resize.of_SetOrigSize(this.width,this.height)
3. (可选)调用函数of_SetMinSize设定DataWindow的最小大小。
This.inv_resize.of_SetMinSize(this.width – 50 , this.height - 100)
4. 调用函数of_Register设定哪些列需要Resize、如何Resize :
this.inv_resize.of_Register("emp_fname",0,0,50,50)
this.inv_resize.of_Register("emp_lname",100, 0, 50, 50)
5. 开启Window resize service,注册DataWindow控件
this.of_SetResize(TRUE)
this.inv_resize.of_Register(dw_1,0,0,100,100)
6. (可选)调用函数of_UnRegister函数将某一列从列表中删除,即取消对某一 列的resize service 。
22. Sort service
概要
PFC的Sort服务使得你轻易的在你的DataWindow中增加了排序的功能。它对应的对 象是n_cst_dwsrv_sort 。
使用说明
该服务会自动的显示排序对话框。所有你需要作的只是开启服务,指定你所想的 排序风格。你有四种风格选择。
l_ PowerBuilder标准排序风格
l_ 拖拉风格(w_sortdragdrop)
l_ 多列选择风格(w_sortmulti)
l_ 单列选择风格(pfc_w_sortsingle)
开启排序服务
l_ 调用函数of_SetSort开启服务,同时指定排序对话框使用列标题:
dw_emp.of_SetSort(TRUE)
dw_emp.inv_sort.of_SetColumnDisplayNameStyle(dw_emp.inv_sort.HEADER)
u_dw会自动删除所有的服务
指定PFC的排序服务只对显示的数据进行排序还是对所有的数据进行排序:
l_ 调用函数of_SetUseDisplay
dw_emp.inv_sort.of_SetUseDisplay(TRUE)
指定排序风格:
l_ 调用函数of_SetStyle指定排序风格:
dw_emp.inv_sort.of_SetStyle(dw_emp.inv_sort.DRAGDROP)
显示排序对话框:
l_ 调用事件pfc_SortDlg
dw_emplist.Event pfc_SortDlg()
通常你没必要显示的调用该事件,当用户选择View>Sort(菜单m_master的后代) 时会自动的打开排序窗口。
3 窗口服务
为了使用窗口服务,你的窗口必须继承w_master或者它的后代:
w_child
w_frame
w_main
w_popup
w_response
w_sheet
w_master包含:
l_ 用于开启、关闭窗口服务的函数
l_ 各个用户自定义对象的引用变量。
l_ 用于执行窗口服务的已编号代码的事件
l_ 空用户事件
关于继承:当你继承窗口是一定要继承w_prefix开头的窗口,不要继承pfc_pref ix开头的窗口。Pfc_prefix开头的对象是用于升级PFC的。
以下表格列出了各种窗口服务以及对应的变量:
窗口服务 实现对象
Basic window n_cst_winsrv以及函数、用户事件
Preference service n_cst_winsrv_preference
Sheet managerment service n_cst_winsrv_sheetmanager
Status bar service n_cst_winsrv_statubar
23. Basic window services
概要
PFC的窗口中有:
l_ 窗口函数
l_ 预代码事件、用户事件
l_ 空用户事件
这些函数、事件对你的应用程序中的所有窗口都有效。如果你使用PFC的标准可视 控件、m_master的后代菜单,那么PFC回自动完成它们的连接。
自动的关闭询问处理:PFC的所有窗口都会自动处理带有DataWindow的关闭询问处 理。当用户在保存对话框中选择YES是,PFC会自动的将Datawindow的所有修改都 保存。如果你需要作特定的保存处理,你可以覆盖CloseQuery事件。或者将变量 ib_disableclosequery值设为True 。
使用说明:
基本窗口服务具有如下功能:
l_ 消息路由、菜单集成
l_ 由PFC菜单触发的空用户事件
l_ 工具栏,只限于w_frame
l_ 自动保存处理
关于PFC窗口类型的资料请参考PFC Object Reference 。
在菜单项的脚本中使用消息路由:
l_ 调用菜单函数of_SendMessage ,以用户事件为参数:
of_SendMessage(”pfc_CheckStatus”)
该函数会将请求传递给n_cst_menu的of_SendMessage函数,然后n_cst_menu的of _SendMessage函数会将请求传递给当前窗口的pfc_MessageRoute事件,然后目标 事件才会被调用。
在非菜单函数或事件中使用消息路由:
l_ 调用活动窗口的pfc_MessageRouter事件,传递需要调用的事件:
this.Event pfc_MessageRouter(”pfc_CheckStatus”)
事件pfc_MessageRouter将请求传递给当前窗口,然后目标事件便会触发。
PFC的菜单使用菜单函数of_SendMessage调用窗口中的用户事件。
使用空用户事件:
l_ 为了某种目的在PFC的用户事件中添加代码。下面的例子说明了当你需要显示 一个PageSetup对话框时,你可以在pfc_PageSetup事件中编写代码:
Integer li_return
li_return = idw_active.Event pfc_PageSetup()
IF li_return > 0 THEN
li_return = idw_active.Event pfc_PrintImmediate()
END IF
在PFC Object Reference中有关于该事件的其他必须代码的说明。
显示用于控制工具栏的窗口
l_ 调用框架窗口的pfc_ToolBars事件:
gnv_app.of_GetFrame().Event pfc_Toolbars()
当用选择m_master的后代菜单的Tools>Customize时,PFC会自动调用该事件。
保存对数据库的修改:
l_ 调用窗口的pfc_Save事件:
Integer li_return
Li_return = this.Event pfc_Save()
当用户选择m_master的后代菜单的File>Save时,PFC会自动的调用该用户事件。 同样对于w_master的后代窗口的CloseQuery事件当用户在提示保存窗口中选择Ye s时也会调用pfc_Save事件。
将窗口定位在屏幕中间:
1. 开启基本窗口服务:
this.of_SetBase(True)
2. 调用n_cst_winsrv的of_Center函数:
this.inv_base.of_Center()
24. Preference service
概要
选项服务提供了允许用户保存、恢复用户窗口设置,或者是关于注册表、INI文件 。选项服务可以保存:
l_ 大小
l_ 位置
l_ 工具栏设置
它对应的对象是n_cst_winsrv_preference 。
使用说明:
使用该服务保存、恢复窗口设置:
自动运行:如果你的w_master后代窗口开启了该服务,所有的操作将会自动执行 。
开启窗口选项服务:
l_ 调用w_master的of_SetPreference函数。该函数对所有的PFC窗口都有效。因 为w_master时所有PFC窗口的祖先。
PFC会自动的删除所有的服务。
指定特定的窗口选项需要恢复,调用如下的几个函数:
l_ 根据需要调用如下的几个函数:
of_SetToolbarItemOrder
of_SetToolbarItemSpace
of_SetToolbarItemVisible
of_SetToolbars
of_SetToolbarTitles
of_SetWindow
25. Sheet management service
概要
PFC的表单管理服务提供了一个供MDI应用程序管理多个表单的功能。当你启用该 功能时,PFC会在WINDOW的菜单中增加如下几项:
l_ 最小化所有的窗口
l_ 恢复排列图表操作
它对应的对象是n_cst_winsrv_sheetmanager 。
使用说明:
使用该服务管理MDI应用程序中的多个表单。
开启表单管理服务:
l_ 调用w_frame的of_SetSheetManager函数,该函数对w_frame的所有后代窗口都 有效:
this.of_SetSheetManager(TRUE)
PFC回自动删除所有的服务。
访问表单:
l_ 根据需要如下的函数:
of_GetSheetCount
of_GetSheets
of_GetSheetsByClass
of_GetSheetsByTitle
26. Status bar service
PFC的状态栏服务可以在MDI父窗口的右下角状态栏处显示时间、内存信息。该服 务提供的其他服务还有:
l_ GDI、可用内存监视器
l_ 支持进度条
l_ 显示开发人员的文本
有关进度条的详细说明请参考”Using the progress bar control”
PFC的状态条服务对应的对象是n_cst_winsrv_statusbar用户自定义对象,它实际 上是使用了一个窗口(w_statusbar)显示信息。
你可以调用n_cst_winsrv_statusbar的函数来控制显示的项。
在Macintosh和UNIX操作系统上:该服务不适用于这两种操作系统。
使用说明:
使用该服务在MDI父窗口中显示状态条信息。如果需要,你可以使用w_statusbar 的函数修改显示的内容。
开启状态条服务:
1. 调用w_frame的of_SetStatusBar函数。该函数适用于所有w_frame的后代窗口 。
This.of_SetStatusBar(TRUE)
PFC会自动删除所有的服务。
2. 在w_frame的pfc_PreOpen事件中调用n_cst_winsrv_statusbar的函数指定需要 在状态栏中显示的信息。各信息显示的从做到右顺序与其相关的函数的调用顺序 相同。例如,下面例子内存信息显示在日期信息的左边:
this.inv_statusbar.of_SetMem(TRUE)
this.inv_statusbar.of_SetTimer(TRUE)
3. 适当的时候调用n_cst_winsrv_statusbar的函数
4 菜单服务
概要
PFC的菜单服务提供了菜单与菜单、菜单与窗体之间的通信功能。通时还有获取M DI父窗口、工具栏的信息的函数。你可以在菜单的脚本中时该服务提供的函数。 它对应的对象是的n_cst_menu 。
使用说明:
你可以在非PFC的菜单中使用该服务访问框架窗口(Frame window)、与窗口通信 。
开启菜单服务:
l_ 定义类型为n_cst_menu的变量:
n_cst_menu lnv_menu
该变量可以是菜单级的实例变量或者是菜单脚本中局部变量。你无须调用Create 或Destroy语句,因为PFC已经将该对象定义为autoinstantiate(自动实例)。
使用消息路由:
l_ 在菜单的脚本中调用of_SendMessage函数:
n_cst_menu lnv_menu
Message.StringParm = “w_emplist”
Lvn_menu.of_SendMessage(This, “pfc_Open”)
访问MDI父窗口:
l_ 在菜单脚本中调用函数of_GetMDIFrame访问MDI父窗口
n_cst_menu lnv_menu
w_frame lw_frame
// This is an alternative to of_SendMessage.
lnv_menu.of_GetMDIFrame(this, lw_frame)
Message.StringParm = "w_emplist"
lw_frame.Event pfc_Open()
5 Resize服务
概要
PFC的resize服务提供了当用户改变窗口的大小、Tab页的大小时可以自动移动控 件、改变控件大小的函数。该服务允许你当窗口、Tab页大小改变时控制其中的控 件的移动、大小变化等。它对应的对象是n_cst_resize 。
你可以使用n_cst_dwsrv_resize对象实现DataWindow的resize服务。
使用说明:
使用该服务控制窗口的大小变化。
开启Resize服务:
l_ 调用w_master、u_tab、u_tabpg的of_SetResize函数:
this.of_SetResize(TRUE)
PFC会自动的删除所有的服务。
注册需要resize的控件:
l_ 调用函数of_Register指定控件应该如何相应窗口、Tab页的resize 。注册时 需要说明当发生resize时应该移动多少,大小变化的比例是多少。下面的例子使 得DataWindow控件向下、向右扩展。
This.inv_resize.of_Register(dw_emplist, 0, 100, 100, 100)
设置Resize的下限:
l_ 调用函数of_SetMinSize设置大小的下限。你可以将该代码放在窗体的Open事 件中指定下限小于当前大小一点。
Integer li_return
Li_return = this.inv_resize.of_SetMinSize(this.width – 200, this.hei ght - 150)
在带有表单的MDI应用程序中使用resize服务:
l_ 采用如下方法之一:
l_ 以表单原大小打开:
OpenSheet(w_emp, “w_emplist”, w_frame, 0, Original!)
l_ 如果你使用其他的枚举变量。那么在控件进行resize服务的注册之间调用函数 of_SetOrigSize 。调用函数of_SetOrigSize时传递工作空间的宽度、高度为参数 。
This.inv_resize.of_SetOrigSize(1200, 1000)
6 转换服务
概要
PFC的转换服务提供了数据类型转换函数。例如,你可以使用函数of_Boolean将整 形或者字符串转换成布尔类型。它对应的对象是n_cst_conversion 。n_cst_con version是自动实例的,因此,它不需要Create、Destroy语句。
使用说明:
你可以使用该服务实现下列转换
原数据类型 目标数据类型
Integer or String Boolean
Boolean、ToolbarAlignment、SQLPreviewType String
Boolean Integer
String ToolbarAlignment
Button String
Icon String
String SQLPreviewType
如果你想查看详细的说明请查看PFC Object Reference中的n_cst_conversion对 象。
声明n_cst_conversion变量
定义n_cst_conversion成全局、实例或者局部变量。
使用说明 变量类型
贯穿整个应用程序 全局变量或者n_cst_appmanager的事例变量
针对一个对象 对象的事例变量
针对一段脚本 局部变量
开启转换服务:
l_ 定义类型为n_cst_conversion的变量
n_cst_conversion inv_conversion
因为n_cst_conversion是自动实例化,因此不需要使用Create或者Destroy语句。
调用转换服务的函数:
l_ 调用函数
下面的例子假设inv_conversion是实例变量:
String ls_checked
Ls_checked = inv_conversion.of_String(cbx_confirmed.Enabled)
MessageBox(”Conversion”,”CheckBox is: ” + ls_Checked)
7 日期/时间服务
概要
PFC的日期/时间提供了许多用于计算日期、时间的函数。例如,你可以使用of_S econdsAfter函数计算两个时间之间的秒数。它对应的对象是n_cst_datatime 。 对象n_cst_datatime对象是自动实例化,因此你无须使用Create或Destroy语句。
使用说明:
你可以使用日期/时间服务进行有关日期/时间的计算。该服务提供了以下函数:
l_ 将Julian日期转换成Gregorian日期
l_ 将秒数转换成小时
l_ 将秒数转换成天数
l_ 将Gregorian日期转换成Julian日期
l_ 计算两日期之间的年数
l_ 计算两日期之间的月份
l_ 计算两日期之间的周数
l_ 计算两日期之间的秒数
l_ 计算两日期之间的毫秒
l_ 判断日期是否有效
l_ 判断某日是否是平日(非周日)。原文:Determine if a date falls on a weekday
l_ 判断某日是否是周末
l_ Halt processing until a specified date/time
你可以将n_cst_datetime定义成全局变量、实例变量、局部变量。
日期/时间函数使用说明 变量类型
贯穿整个应用程序 全局变量或者n_cst_appmanager的实例变量
针对一个对象 该对象的实例变量
针对一段代码 局部变量
开启日期/时间服务:
l_ 定义类型为n_cst_datetime的变量
n_cst_datetime inv_datetime
类型n_cst_datetime是自动实例化的,因此无须使用Create或Destroy语句
调用日期/时间服务的函数:
l_ 直接调用函数
下面的例子假设inv_datetime是实例变量
Long ll_seconds,ll_days
Ll_seconds = Long(sle_seconds.Text)
Ll_days = inv_datetime.of_Days(ll_seconds)
MessageBox(”Date/Time”,String(ll_seconds)+ “ seconds is equal t o ” + String(ll_days) + “ days。“)
8 文件服务
概要
PFC的文件服务使得你的应用程序可以具备文件管理器功能。例如,你可以使用o f_FileRename函数改变文件名称。文件服务支持多种操作系统,针对各种操作系 统该服务会自动的调用相应的外部函数。它对应的对象是n_cst_filesrv 。
使用说明:
通过文件服务你可以使用如下操作:
l_ Assembling a concatenated filename 。
l_ 建立、删除目录。
l_ 读、写、重命名、复制文件。适用于大于32765字节的文件。
l_ 访问文件信息,包括日期、时间。
l_ 在一个目录下创建、排序文件。
你可以将n_cst_filesrv定义成全局、实例、局部变量。
使用情况 变量类型
贯穿整个应用程序 全局变量或者n_cst_appmanager的实例变量
针对一个对象 对象的实例变量
针对一段代码 局部变量
由于PFC会根据特定的平台创建n_cst_filesrv的子类。因此它没有使用PB的自动 实例化功能。你必须显示的调用Destroy语句删除该对象。
开启文件服务:
1. 定义类型为n_cst_filesve的变量
n_cst_filesrv inv_filesrv
2. 调用全局函数f_set_filesrv:
f_SetFilesrv(inv_filesrv,TRUE)
该函数会自动的建立对象inv_filesrv 。
3. 使用完毕后删除对象
Destroy inv_filesrv
调用文件服务的函数:
l_ 直接调用函数
该例子调用函数of_FileRead访问文件信息。该例子假设inv_filesrv是实例变量 :
Integer li_return
String ls_file[]
li_return = inv_filesrv.of_FileRead(sle_filename.text, ls_file)
CHOOSE CASE li_return
CASE –1
MessageBox("Error", "Error accessing file")
CASE ELSE
// File processing goes here
END CHOOSE
删除该服务:
l_ 使用DESTROY语句
DESTROY inv_filesrv
9 INI文件服务
概要
PFC的INI文件服务提供了许多读、写INI文件的函数。它对应的对象是n_cst_ini file。
使用说明:
你可以使用INI文件做到如下:
l_ 检索INI文件中的所有键
l_ 检索INI文件中的所有段
l_ 删除INI文件中的所有行
l_ 删除INI文件中一行
l_ 删除INI文件中一段
你可以同时使用ProfileInt、ProfileString、SetProfileString访问INI文件。 INI文件服务对大小写不敏感。
开启INI文件服务:
l_ 定义类型为n_cst_inifile的变量:
n_cst_inifile inv_ini_handler
该类型属于自动实例化,因此你无须调用Create与Destroy 。
使用INI文件服务:
l_ 调用n_cst_inifile的对象函数:
String ls_keys[]
Integer li_count, li_size
Li_size = inv_ini_handler.of_GetKeys(gnv_app.of_GetAppINIFile(),“ CustApp”,ls_keys)
Lb_keys.Reset()
For li_count = 1 to li_size
Lb_keys.AddItem(ls_keys[li_count])
Next
10 数字服务
概要
PFC的数字服务提供的函数使得你可以处理二进制数。例如,你可以使用of_GetB it函数判断一位是开还是关。
使用说明:
你可以使用数字服务中的函数做到:
l_ 判断一位是开还是关
l_ 将十进制转换成二进制
l_ 将二进制转换成十进制
与Window SDK共同使用该对象:Windows SDK中许多函数都使用位返回值。因此你 需要使用函数of_GetBit 。
你可以将n_cst_numerical定义成全局、实例、局部变量。
使用说明 变量类型
贯穿整个应用程序 全局变量或者n_cst_appmanager的实例变量
针对一个对象 对象的实例的变量
针对一段脚本 局部变量
开启数字服务:
l_ 定义类型为n_cst_numerical的变量
n_cst_numerical inv_numerical
类型n_cst_numerical自动实例化,你无须使用Create或者Destroy语句。
调用数字服务(numerical service)函数:
l_ 直接调用函数
下面的例子假设inv_numerical是实例变量:
Long ll_base10
String ls_binary
Ll_base10 = Long(sle_base10.text)
Ls_binary = inv_numerical.of_Binary(ll_base10)
MessageBox("Numerical", String(ll_base10) + " base 10 is equal to " + String(ll_base10) + " base 10 is equal to " + ls_binary + " in binary. ")
11 平台服务
概要
PFC的平台服务提供的函数使到你的应用程序可以使用特定平台的函数。你可以使 用该服务实现支持多平台的应用程序,而无须在你的应用程序中加入有关平台检 测的代码。例如,你可以调用函数of_GetFreeMemory确定现在所剩的内存大小。 平台服务此时便会依据不同的平台调用相应的外部函数而完成工作。该服务对应 的对象是n_cst_platform以及不同平台的相应的子类。
打印与页面设置对话框:PFC的平台服务会根据不同的平台作相应的调整。
使用说明:
平台服务提供的函数有:
l_ 确定可用内存空间
l_ 确定可用资源空间
l_ 确定某一字符串的高度、宽度,单位是PBUs
你可以将n_cst_platform定义成全局变量、实例变量、局部变量
使用说明 变量说明
贯穿整个应用程序 全局变量、n_cst_appmanager的实例变量
针对一个变量 对象的实例变量
针对一段代码 局部变量
平台服务没有使用自动实例化功能,因此你必须显示的删除n_cst_platform 。
在Macintosh上:在Macintosh上函数of_GetTextSize无法使用。
开启平台服务:
1. 定义类型n_cst_platform的变量:
n_cst_platform inv_platform
2. 调用f_SetPlatform全局函数
f_SetPlatform(inv_platform,TRUE)
函数f_SetPlatform会自动建立该对象。
调用平台服务函数:
l_ 直接调用函数
下面的例子调用函数of_GetFreememory在状态栏处显示可用内存的大小。
Long ll_free_monery
ll_free_memory = inv_platform.of_GetFreeMemory()
gnv_app.of_GetFrame(). SetMicroHelp(”Free memory:” + String(ll_ free_memory))
删除服务
l 调用 Destroy 语句
Destroy inv_platform
12 选择服务
概要
PFC提供了一个用于显示 w_selection 对话框的函数。当用户选择OK时该函数返 回选中行的一列或者多列的值。它对应的对象是 n_cst_selection 。
使用说明:
你可以使用 of_Open 函数打开一个供用户选择数据的对话框,然后在由应用程序 处理。
共有三种版本的 of_Open 函数,每个函数的 w_selection显示信息都不一样:
l 检索、显示 DataWindow 中的所有数据
l 显示一部分数据。原文:W_selection displays a passed set of rows
l 显示已保存的一部分数据。原文:W_selection displays rows that have be en saved as part of the passed DataWindow object
你可以将 n_cst_selection定义成全局变量、实例变量、局部变量
说明 变量类型
贯穿整个应用程序 全局变量或者 n_cst_appmanager 的实例变量。
针对一个变量 实例变量
针对一段代码 局部变量
开启选择服务:
l 定义类型为 n_cst_selection 变量
n_cst_selection inv_selection
因为对象 n_cst_selection是自动实例化的,因此你无需调用Create 或者Dest roy 语句。
使用选择服务:
1. 定义供of_Open使用的变量
n_cst_selection lnv_selection
Any la_selected[]
String ls_columsp[
Integer li_count
2. 设定需要返回值的列
ls_columns[1] = "emp_id"
ls_columns[2] = "emp_lname"
ls_columns[3] = "emp_fname"
3. 调用函数of_Open显示w_selection窗口。该版本的of_Open将显示DataWindow 中的所有数据。
4. 访问返回的值
FOR li_count = 1 to UpperBound(la_selected)
lb_selected.AddItem (String(la_selected[li_count]))
NEXT
13 SQL语法分析服务
概要
PFC的SQL语法分析服务提供的函数可以让你分析你的SQL语句。他对应的对象是n _cst_sql 。
使用说明:
你可以使用SQL语法分析服务做到:
l 由他的部分组件建立SQL语句。原文:Build a SQL statement from its comp onent parts
l 分析组件中的SQL语句
你可以将n_cst_sql定义成全局变量、实例变量、局部变量
说明 变量类型
贯穿整个应用程序 全局变量或n_cst_appmanager的实例变量
针对一个对象 对象的实例变量
针对一段代码 局部变量
开启SQL语法分析服务:
l 定义类型为n_cst_sql的变量
n_cst_sql inv_sql
由于n_cst_sql是自动实例化的,因此你无需使用Create或者Destroy语句
To build a SQL statement from its component parts:
l 调用of_Assemble函数
String ls_sql
n_cst_sqlattrib lnv_sqlattrib[]
lnv_sqlattrib[1].s_verb = sle_verb.text
lnv_sqlattrib[1].s_tables = sle_tables.text
lnv_sqlattrib[1].s_columns = sle_columns.text
lnv_sqlattrib[1].s_values = sle_values.text
lnv_sqlattrib[1].s_where = sle_where.text
lnv_sqlattrib[1].s_order = sle_order.text
lnv_sqlattrib[1].s_group = sle_group.text
lnv_sqlattrib[1].s_having = sle_having.text
ls_sql = inv_sql.of_Assemble(lstr_sql)
MessageBox("SQL", ls_sql)
To parse a SQL statement into its component parts:
l 调用函数of_Parse
String ls_sql
Integer li_return
n_cst_sqlattrib lnv_sqlattrib[ ]
li_return = inv_sql.of_Parse(mle_sql.text, lnv_sqlattrib)
IF li_return > 0 THEN
sle_verb.text= lnv_sqlattrib[1].s_verb
sle_tables.text = lnv_sqlattrib[1].s_tables
sle_columns.text = lnv_sqlattrib[1].s_columns
sle_values.text = lnv_sqlattrib[1].s_values
sle_where.text = lnv_sqlattrib[1].s_where
sle_order.text = lnv_sqlattrib[1].s_order
sle_group.text = lnv_sqlattrib[1].s_group
sle_having.text= lnv_sqlattrib[1].s_having
END IF
14 字符串处理服务
概要
PFC的字符串服务提供的函数可以处理字符串。他对应的对象是n_cst_string。
使用说明:
你可以使用字符串服务做到:
l 将具有定界符的字符串分割成数组。
l 将数组转换成具有定界符的字符串。
l 判断字符串的大小写,是否按字母排序、是否按数字、字母排序
l 通用替代。原文:Global replacing
l 计算字符串中数字出现的次数
l 将字符串中的非字母除去
l 判断一字符串是否是表达式
l 将所有的字母都变成首字母大写
你可以将n_cst_string定义成全局变量、实例变量、局部变量
使用说明 变量类型
贯穿整个应用程序 全局变量或者n_cst_appmanager的实例变量
针对一个对象 对象的实例变量
针对一段代码 局部变量
开启字符串服务:
l 定义类型为n_cst_string的变量:
n_cst_string inv_string
由于对象n_cst_string是自动实例化的,因此你无需调用Create或者Destroy语 句
调用字符串处理函数:
l 直接调用函数
这段代码来自n_cst_dwsrv_report的of_AddText函数。他调用函数of_ParseRoA rray as_text字符串转换成一个数组,其中lnv_string是局部变量
n_cst_string lnv_string
Integer li_newlines
String ls_line[ ]
...
li_newlines = lnv_string.of_ParseToArray (as_text, "~r~n", ls_line)
15 元类服务
概要
元类服务的函数提供了其他对象中的函数、事件、变量的信息。他对应的对象是 n_cst_metaclass 。
使用说明:
元类服务最有用也是最常用的就是在调用对象函数、事件之前先判断它们是否存 在。
使用元类服务:
1. 定义类型为n_cst_metaclass的变量:
boolean lb_defined
n_cst_metaclass lnv_metaclass
classdefinition lcd_obj
String ls_args[ ]
Integer li_rc
由于对象n_cst_metaclass是自动实例化的,因此你无需使用Create或者Destro y函数。
2. 调用n_cst_metaclass函数
lcd_obj = FindClassDefinition("w_sheet")
lb_defined = lnv_metaclass.of_isFunctionDefined(lcd_obj,"of_Validatio n", ls_args)
If lb_defined Then
// Qualify with instance of w_sheet descendant.
li_rc = w_sheet.Function Dynamic of_Validation ()
If li_rc < 0 Then
Return -1
End If
16 工作逻辑单元服务
概要
工作逻辑单元提供了具有自动保存数据功能的对象(简称自更新对象)。一个具 有自动保存数据功能的对象实际上是提供了一整套函数接口(self-updating ob ject API)供n_cst_luw对象执行保存操作时调用。这些函数再调用那些需要保存 数据的对象的事件。工作逻辑单元服务自动的调用这些函数,并且作为默认保存 操作的一部分。PFC有好几个具有自动保存数据功能的对象,它们是:
U_dw
N_ds
U_lvs
U_tab
U_tvs
U_base
W_master
查看这些对象的API的执行结果即可证实。
默认情况下,w_master的pfc_Save会使用工作逻辑单元保存所有具有自动保存数 据功能的对象。详细情况查看”Using the pfc_Save process”
自更新对象的实现:
工作逻辑单元更新所有的可更新的自更新对象。
注意:大部分的自更新对象默认情况下是不可更新的。为了确保向后兼容性,u_ dw是唯一的默认可更新的。
下面是所有的自更新对象的对外接口(API)
函数 用途
of_AcceptText 调用pfc_AcceptText事件,该事件再调用AcceptText函数
of_UpdatesPending 调用pfc_UpdatesPending事件,该事件会判断该对象是否已 经保存数据了。
of_Validation 调用pfc_Validation事件,该事件会对数据进行有效性检验。
of_UpdatePrep 调用pfc_UpdatePrep事件,该事件将会准备好那些将要更新的对 象。
of_Update 调用事件pfc_Update,该事件会更新数据库。
of_PostUpdate 调用事件pfc_PostUpdate,该事件将会异步的执行更新操作。
你可以使用Browser查看这些函数、事件的信息。
编写你自己的自更新对象:
要编写自己的自更新对象只需调用上述的函数和必须使用一组引用类型数组指向 你的对象作为n_cst_luw中的某些函数的参数。
扩展保存操作
默认情况下,w_master的pfc_Save会保存其中的所有被修改的DataWindow。你可 以按如下扩展该操作:
l 其他的自更新对象:你可以在对象的构造事件中调用函数of_SetUpdateable将 其他的自更新对象设置成可更新的。下面的代码来自u_lvs。
this.of_SetUpdateable(TRUE)
l 现在,工作逻辑单元将会将保存u_lvs的数据操作作为默认的保存操作
l DataStore:你可以将一个或多个DataStore通过调用函数of_SetUpdateObject s列为需要更新的对象:
PowerObject lpo_objs[]
Integer li_count
lpo_objs = this.control
li_count = UpperBound(lpo_objs)
li_count ++
lpo_objs[li_count] = ids_data
this.of_SetUpdateObjects(lpo_objs)
l 附加的窗口:你可以调用w_master的of_SetUpdateObjects将一个或者多个窗口 列为需要更新的对象。
PowerObject lpo_objs[ ]
Integer li_count
lpo_objs = this.control
li_count = UpperBound(lpo_objs)
li_count++
// Update w_other as well as this window
lpo_objs[li_count] = w_other
this.of_SetUpdateObjects(lpo_objs)
-- 迎着太阳,我们怒放
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.137.136.66]
|
|