2.6 建立應用程序
到目前為止,本程序中用到的對象都定義好了,但程序還不能運行,因為我們還沒有為程序編寫代碼,這種代碼在PowerBuilder中被稱為腳本,PowerBuilder是一種基於面向對象的事件驅動機制開發工具,所以腳本也是針對對象的事件來編寫,接下來就為應用程序編寫腳本。
PowerBuilder應用程序的特點是從應用對象開始執行程序,所以我們首先要做的是為應用對象的打開事件編寫代碼,單擊POWERBAR工具條上的APPLICATION畫板按鈕打開應用對象,然後單擊PAINTERBAR工具條上的SCRIPT畫板按鈕,系統彈出SCRIPT對話框用來為應用對象編寫腳本,從SELECT EVENT下拉列表框中選擇OPEN事件,然後在工作區中輸入如下腳本(圖2-35):
SQLCA.DBMS=PROFILESTRING("PB.INI","DATABASE","DBMS","")
SQLCA.DBPRAM=PROFILESTRING("PB.INI","DATABSE","DBPRAM","")
OPEN(TELEPHONE-WINDOW1)
圖2-35
解釋這段腳本前要先介紹事務對象的概念,這裡的SQLCA就是一個系統自動提供的缺省事物對象變量,SQLCA是一個全局變量,可以用在所有的窗口對象中。事物對象的作用是為聯結數據庫提供有關的信息,以便可以從數據庫中獲取需要的數據。這段腳本所做的工作是在應用對象啟動後首先從POWERBUIDER中存放與數據庫有關信息的文件PB.INI中取得需要的值放入事物對象變量中,然後打開TELEPHONE-WINDOW1窗口,以便用戶從登錄窗口輸入正確的密碼後可以進入到個人通訊錄管理系統。這裡就為應用對象編寫這三行代碼。
單擊POWERBAR工具條上的WINDOW畫板按鈕,選擇打開TELEPHONE-WINDOW1,我們開始為它編寫腳本,右鍵單擊窗口上的OK按鈕,首先在菜單中選擇PROPERTIES菜單項來修改OK控件的一個屬性,在彈出的對話框中有一個DEFAULT復選框,我們選中它(圖2-36),這樣在以後程序運行的時候按回車鍵的效果和單擊OK控件就一樣了,單擊OK關閉對話框,然後再次右鍵單擊窗口上的OK按鈕,在菜單中選擇SCRIPT菜單項開始為這個命令按鈕的單擊事件編寫腳本,觀察窗口的標題確定目前選擇的是命令按鈕的CLICK事件後在工作區中輸入以下的腳本:
if upper(trim(sle_1.text))="mypassWord" then
open (telephone_window2)
close(telephone_window1)
else
sle_1.setfocus()
end if
這段腳本所做的工作是當用戶在打開的登錄窗口中單擊OK按鈕的時候判斷單行編輯框中的字符串在去掉前後的空格符和整個轉換成大寫字符後是否為字符串“MYPASSWORD”,如果是的就打開我們在前面定義的第二個,也就是用來對個人通訊錄數據庫進行操作的窗口,然後再關閉登錄窗口, 如果輸入的字符串與設定的字符串“MYPASSWORD”不符的話就表示用戶不能對通訊錄數據庫進行訪問,就把輸入焦點切換到編輯框讓用戶重新輸入正確的口令,這裡我們把口令設成了“MYPASSWord”,在實際應用中你可以換成一個自己的口令,這樣可以保證自己的數據庫的安全性。
圖2-36
接下來我們為第二個建立的窗口,也就是真正對數據庫進行操作的窗口編寫腳本,這裡的腳本是真正完成對數據庫中數據的修改。首先要為窗口的打開事件編寫腳本,也就是在窗口打開後需要干什麼事。用類似打開第一個窗口的方法打開第二個窗口,用鼠標右擊窗口中的空白區域,在彈出的菜單中選中SCRIPT菜單項,系統彈出一個用來為窗口本身所有可能的事件編寫腳本的窗口,選中窗口的打開事件後在窗口的工作區中輸入如下腳本:
CONNECT;
DW-1.SETTRANSOBJECT(SQLCA)
DW-1.RETRIEVE()
DW-2.SETTRANSOBJECT(SQLCA)
腳本的第一條語句的意思是用剛才介紹的系統缺省的事物對象SQLCA聯結數據庫。第二行腳本的意思是告訴數據窗口控件DW-1中的數據窗口對象利用事物對象SQLCA來取得數據庫的有關信息。而第三條語句的意思是讓數據窗口控件中的數據窗口對象,要利用創建該數據窗口對象時的SELECT語句來獲得數據顯示在相應的數據窗口控件中。第四行語句的作用和第二行語句的作用是類似的,是告訴數據窗口控件DW-2所聯結的數據窗口對象從系統缺省的事物對象SQLCA中獲取有關數據庫的信息。這樣我們就為對數據庫進行操作的窗口的打開事件編好了腳本,要指出的是可以發現這裡的腳本都是做一些窗口被打開後必須做的事情,即初始化工作。
接下來我們為窗口中的控件編寫腳本,首先為數據窗口控件DW-1的鼠標單擊事件編寫腳本,腳本要達到的目的是當用鼠標單擊數據窗口控件DW-1中顯示出來的某條記錄時,關於這條記錄的詳細信息將顯示在數據窗口控件DW-2中。鼠標右擊數據窗口控件DW-1,在彈出的菜單中選擇SCRIPT菜單項,系統彈出編寫腳本的窗口,從SELECT EVENT下拉列表框中選擇事件為CLICKED,然後在工作區中輸入如下腳本:
int recordnumber
int currentnumber
recordnumber=dw_1.getclickedrow()
if recordnumber=0 then
messagebox( "this is a message","not valid row, please close this dialog and click a valid row in dw_1")
else
correntnumber=dw_1.getitemnumber(recordnumber,1)
dw_2.retrIEve(currentnumber)
end if
這是一段很重要的腳本,深刻理解這段腳本對你以後的編程會有很大的幫助的。腳本的前兩行是定義了兩個整型的變量,第三行腳本的意思獲取被用戶用鼠標單擊的那行記錄的行號,也就是第幾個記錄,並把這個值放在變量RECORDNUMBER中,如果用戶雖然單擊了數據窗口控件DW-1,但單擊的是沒有數據的地方,這時函數返回的行號就為零,表示用戶單擊的不是一條有效的記錄。從第四條語句
接下來我們為窗口中最下面的四個命令按鈕分別編寫腳本。首先看“插入”按鈕,用和前面類似的方法打開“插入”按鈕的事件編寫窗口,選中CLICKED事件,開始輸入下面的腳本:
dw_2.reset( )
dw_2.insertrow(0)
這段腳本只有兩句,第一條語句的意思是清除數據窗口控件DW-2中的已有記錄,即使得數據窗口控件中沒有任何內容。第二條語句的作用是向數據窗口控件所聯結的數據窗口對象中加入一條新的記錄。
再為“刪除”按鈕編寫腳本,用和前面類似的方法打開“刪除”按鈕的事件編寫窗口,選中CLICKED事件,始輸入下面的腳本:
dw_2.deleterow(0)
這段腳本就一條語句,它的作用是調用PowerBuilder提供的函數DELETEROW來刪除數據窗口中的一行記錄,這裡函數中的參數0表示將被刪除的是當前行的記錄。
接著為“更新”按鈕編寫腳本,,打開“更新”按鈕的事件編寫窗口,選中CLICKED事件,開始輸入下面的腳本:
if dw_2.update( )=1 then
commit;
dw_1.retrIEve( )
else
rollback;
end if
這段腳本是一條完整的條件語句,首先使用UPDATE函數根據數據窗口控件DW-2所聯結的數據窗口對象的變化真正地修改數據庫,然後判斷修改是否成功,如果成功的話就提交結果並讓數據窗口控件DW-1所聯結的數據窗口對象重新從數據庫中取得數據,以使得數據窗口中的數據能和數據庫中的數據保持一致,如果條件語句判斷出修改失敗的話就使用ROLLBACK語句使得數據庫恢復到修改以前的狀態。
最後我們來編寫 “關閉”按鈕的腳本,這個按鈕的作用是用來關閉我們的應用程序,打開“關閉”按鈕的腳本編寫窗口,選中CLICKED事件,開始輸
入下面的腳本:close(parent)
這段腳本的意思是關閉命令按鈕所在的父窗口。
到目前為止,我們的應用程序就完成了對象的創建和應用程序腳本的編寫,接下來將運行這個應用程序,來驗證它是否和我們需要的結果一致。