?? pfc詳細教程.txt
字號:
關于PFC
這一章介紹的是PFC的基礎,PB的首要概念,面向對象的內容,并附有一個PFC的
組成圖。
理解PFC:
PFC是一組PowerBulider的對象,它可以由用戶自己定制,擴充。你可以象搭積木
一樣使用它,使程序緊密的連接起來。PFC還包括許多有用的對象,例如:debug對
象。
PFC是由PowerBuilder提供的PB對象,并支持PowerScript 源代碼。它使用的是先
進的PowerBuilder面向對象技術,其一個特征是面向服務設計。確使你的程序占
用最少的計算機資源。
PFC使用了許多先進的編碼技巧,你可以使用PowerBuilder的PowerScript編譯器
來檢查對象,實例,事件,和繼承PFC父類的函數。
這本書說的是PFC的概念(PFC是什么東西和你為什么使用它)還有使用信息(如何計
劃.使用PFC)
為了更詳細的了解PFC的對象,實例,事件,和繼承PFC父類的函數,請看PFC Object
Reference 。
理解PowerBuilder:
使用PFC可以創建先進的面向對象式的PowerBuild類庫。要想掌握PFC和它的面向
對象特征,首先需要了解PowerBuilder和它的面向對象特征。這一節將告訴你應
該熟悉PowerBuilder的基本概念。
PFC原是為建類庫準備的,但并不是不讓你用它創建應用程序。通過看PowerBuild
er User's Guide可以完全了解的PowerBuilder的概念。
PowerBuilder類庫和對象:
PFC是作為PowerBuilder Libraries(PBLS)發行的。PBLs包括你用于寫程序的父類
和派生類對象。在使用任何PFC對象之前,你一定要在你的應用程序庫的搜索路徑
中把PFC類庫加進去。PowerBuilder在執行程序時通過搜索路徑找到程序所引用的
對象。
PB標準對象 用途
Windows PowerBuilder應用程序和它的用戶之間的聯系界面。
Menus 用戶在當前活動窗口用來搜索命令的表。
DataWindow objects 用于接收,實時處理數據。
User objects 由用戶自己定義的對象(一次定義可以重復使用)。
User objects 有兩種類型:
(一):Visual user objects (可視化用戶對象)
一個可視化用戶對象是一個可以重復使用的可視化控制,或者是一批預先確定的可
視化控制.PFC包括兩種可視化用戶對象類型.
1.標準的可視化用戶對象類:
PFC提供了一套豐富的標準的可視化用戶對象.每個PFC的標準的可視化用戶對象都
相當于一個PowerBuilder的窗口控件.這些對象包括以PFC服務預想確定完全的綜
合操作。 特別值得一提的是u_dw DataWindow 用戶對象,這是以PFC服務來提供
廣泛的綜合功能。
2.用戶自定義的可視化用戶對象
PFC也提供了用戶自定義的可視化用戶對象,這些對象包括一組窗口控件,并提供
先進的函數用在某些特別情況。 (PFC沒有使用外部用戶對象和VBX用戶對象,要
想進 一步了解可視化用戶對象,請看"PowerBuilder User's Guide")
(二):Class user objects(非可視用戶對象類)
一個非可視用戶對象是一個用來實現非可視的處理時使用的控件。PFC包括兩種非
可視用戶對象類型。
1.標準的非可視用戶對象:
標準的非可視用戶對象是繼承 PowerBuilder內嵌的系統對象而來。PFC提供了許
多標準的非可視用戶對象,例如:處理事務,錯誤對象,和其他所有的擴展系統對
象。
2.用戶自定義的非可視用戶對象:
用戶自定義的非可視用戶對象是繼承 PowerBuilder非可視對象類而來,它把數據
和代碼進行封裝。這種類型的用戶對象允許你從SCRATCH定義一個對象。
PFC用Class user objects來執行它的許多服務以及提供這些服務對象的函數。它
也提供?reference variables(引用變量),何謂 rdference variables呢?即是
一個對象指針。你可以用它來存取一個對象的實例變量,函數,事件。
Functions(函數):
PowerBuilder支持全局函數和對象函數。PFC通過user_object function執行它的
處理。一個函數就是執行一些處理的PowerScript語句的集合,你可以傳遞數據或
者是什么也不傳,它來返回一個值。
詳細信息冊參考PFC Object Reference。
Events and user events(事件和用戶事件):
PowerBuilder的Windows,user objects,contols,都有一些預先設定的事件。PFC
通過定義用戶事件為許多PFC 對象增加事件。事件可以接受數據和返回值。共有
三種PFC 事件:
事件類型 觸發時間
PowerBuilder預先設定的事件 某個動作導致操作系統調用事件
預先編好代碼的用戶事件 某個動作(例如選擇一個菜單)導致PFC觸發用戶事件
空的用戶事件(可以加入代碼) 某個動作(例如選擇一個菜單)導致PFC觸發用
戶事件
除非另有說明,本書的event都指的是這三種。
Function and events compared (函數和事件比較)
函數和事件在許多方面都是相似的:
(1)他們都可以接收數據,返回值;
(2)他們都由PowerBuilder語句構成;
(3)他們都可以被調用,觸發,傳遞。
但他們還是有些不同的:
使用特征 函數 事件
調用一個不存在的 將會出現運行時錯誤 TriggerEvent返回-1
覆蓋父類腳本 直接覆蓋父類腳本 可以擴展或者覆蓋
訪問 可以是Public、Private、Protected 永遠是Public
重載 可以重載 不可以重載
面向對象式的設計
面向對象的編程工具支持三個基本規則:inheritance(繼承),encapsulation
(封裝),polymorphism(多態)。
如何使用PFC擴展層:
在PFC中沒有類庫完全適合你的需要,你可以代表性的修改PFC來滿足你的程序的
需要。假如沒有PFC擴展層,就會出現一個問題:當PFC版本升級時,新版本的PF
C恢復該這些修改,而你不得不用手工改變。
一個特別的擴展層:
PFC產生一個擴展層是通過繼承所有的層實現的。所有的擴展對象都在單獨的PBL
S,這在PFC升級時不會影響。
內容 祖先層
Application and global services PFCAPPSRV.PBL
DataWindow services PFCDWSRVPBL
Visual and standard class user objects PFCMAIN.PBL
Utility services PFCUTIL.PBL
Window services PFCWNSRV.PBL
祖先層的類庫中的對象包括所有的實例變量,事件,函數;擴展層的類庫中的對
象是相應祖先層類庫中的對象的不可修改的子類。即使是繼承,也可以訪問祖先
的實際變量,事件和函數。
通過PowerBuilder Bowser來察看子類的對象的實際變量,事件和函數。
使用擴展層有二個優點:
1. 你可以增加一些點,部門,還有程序邏輯。
2. 不會影響版本升級。
舊版本對象:
PFCOLD。PBL Library包含舊的對象。如果你有一個存在的PFC程序,你有可能需
要把他加在你的library list.
注意:
你要通過修改擴展層的對象來定制PFC程序。千萬不要輕易修改祖先對象。你的程
序中的對象要使用擴展層的對象并且繼承擴展層的窗口。
迅速開始:
在用PFC編程時,程序經常需要修改,存取,以及從擴展層中繼承對象。PFC裝置
中有一套擴展庫(PFC Quickstart Libraries)。它包括擴展層的基本功能,使
你的程序快速發展。
PFC命名規則:
PFC遵循以下命名規則:
Level Name
PFC層對象 用前綴pfc_
擴展層對象 和它的祖先有同樣的名字但沒有前綴pfc_
例如:DataWindow selection service object的祖先是pfc_n_cst_dwsrv,擴展層
的子類是
n_cst_dwsrv.Pfc_n_cst_dwsrv 包括所有服務的代碼。n_cst_dwsrv 是不可修改
的子類(你可以在假如程序指定的實例變量和代碼。)。
PFC定義的用戶事件:
PFC定義用戶實踐也用前綴pfc_prefix.這使得你的應用程序的用戶事件和PFC 的
用戶事件更加容易。
PFC文檔使用擴展層名字
當指定一個服務對象時,PFC文檔總是用擴張層命名。例如:當論述基類窗口時這
書指向w_master不是pfc_w_master.但要記住,w_master的實際變量,事件和可用
函數實際上是在pfc_w_master定義的。
PFC命名習慣詳細資料請看PFC Object Reference
我們不難想到:
PFC的對象繼承允許你在每一層假如擴展邏輯。例如:pfc_w_sheet是從w_master
繼承的,w_master的實際變量,函數,你加在它的事件在它的子類窗口中都已存
在。
如何加擴展層
擴展層通過PFC升級類有效的實現應用程序內部的重用和單個程序的重用。但是,
在大部門或者是多部門合作時,一定要考慮好擴展的標準,方法,注意部門的規
則和商業規律。
如果你是在一個組織里使用PFC,你要考慮創建一個新層(包括這個組織的所有的
變量函數,事件)。應用程序還是使用PFC擴展庫的對象,可是調用實例變量,事
件,函數的祖先變了。
PFC構成:
PFC是由以下構成的:
l 一套PBLS
l 一個數據庫
l Quickstart PBLS
l 實例代碼
l 一個簡單的應用程序
Localized PFC(局部化的PFC)
局部化的PFC 將會在PFC新版本公布后升級。
The PFC PBLs
PFC是分布在PBLS包含的祖先對象和PBLS擴展層包含的對象。每個祖先對象擴張層
包含提供以下服務的對象
Libraries Contents
PFCAPSRV.PBLPFEAPSRV.PBL 應用程序管理器,應用程序服務對象和全局服務對象
。
PFCMAIN.PBLPFEMAIN.PBL 標準可視化用戶對象,自定義可視化用戶對象,標準用
戶對象類。
PFCUTIL.PBLPFEUTIL.PBL 有用的對象和服務。
PFCWNSRV.PBLPFEWNSRV.PBL 窗口服務,包括用戶對象和有用的窗口。
PFCOLC.PBL 舊的用戶對象。(基層和擴展層的對象)
使用library畫筆:
使用library畫筆來看到PFC中所有對象
PFC 數據庫
PFC裝載了pfc.db本地數據庫。這個數據庫包括以下幾個表:
Table Usage
Messages 錯誤信息服務。
Security_apps 安全服務。
Security_groupings 安全服務。
Security_info 安全服務。
Security_template 安全服務。
Security_users 安全服務。
PFC本地數據庫是由開發者預先設定的,如果你要使用錯誤信息服務和安全服務一
定要在你的數據庫中復制指定的表。連接”Deploying database tables”
The PFC Quickstart PBLs
使用PFC Quickstart libraries用來是程序配置和運行迅速。他們包括經過挑選
的PFC擴展層對象的保護子集。
做一個PFC Quickstart libraries備份,你就有了后援了。
The PFC code example
使用它是為了了解PFC的對象和服務。學習如何編碼并且實現PFC的基本功能。Th
e PFC Quickstart有廣泛的參照和使用資料。
The PFC sample application
使用PEAT可以看到PFC的例子是如何進行工程預算和跟蹤系統的。
PFC編程基礎
概要:
這一章闡述了 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_SetDat
a函數。這樣w_master的所有子類中的關于of_SetData函數的指針都將被刪除。這
樣當應用程序1運行時將會導致運行時錯誤與編譯錯誤。
具體步驟
1. 打開應用程序畫筆。
2. 定義庫文件列表。
PFCAPSRV.PBL
PFCDWSRV.PBL
PFCMAIN.PBL
PFCUTIL.PBL
PFCWNSRV.PBL
PFEAPSRV.PBL
PFEDWSRV.PBL
PFEMAIN.PBL
PFEUTIL.PBL
PFEWNSRC.PBL
PFCOLD.PBL(如果你的應用程序是使用老版本的PFC庫那么請增加該文件到庫列表
中)
3. 在應用程序畫筆中打開腳本畫筆,定義n_cst_appmanager類型的全局變量gnv
_app。
n_cst_appmanger gnv_app
這個變量名必須是gnv_app,因為PFC的對象、函數、事件都需要這個n_cst_appm
anager或它的子類的全局變量—gnv_app。
4. 增加如下代碼到應用程序對象的OPEN事件中。它的用途是創建n_cst_appmana
ger、調用pfc_Open事件。
gnv_app = Create n_cst_appmanager
gnv_app.Event pfc_Open(commandline)
5. 增加如下代碼到應用程序對象的CLOSE事件中。
gnv_app.Event pfc_Close()
Destroy gnv_app
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 Wi
ndow)或者調用顯示快閃窗口的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)(根據不同的應用程序有不同的變化!)
如何顯示登錄窗口
1. 在框架窗口的Open事件中調用of_LogonDlg函數:
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
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制定的書屋對象類型
)。
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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -