?
? ????? PHP ??? ???? ??? ?? ??
構(gòu)造全中文界面的Developer/2000應(yīng)用
摘自:中國(guó)計(jì)算機(jī)報(bào)社
李剛 用Oracle的Developer/2000構(gòu)造的中文界面的應(yīng)用程序,存在著許多西文的信息。具體表現(xiàn)在: 1. 在運(yùn)行時(shí)多文檔主窗口的缺省標(biāo)題是:Forms 4.5 (Runform),但在設(shè)計(jì)時(shí)找不到可對(duì)該標(biāo)題進(jìn)行設(shè)置的可視屬性。 2. 當(dāng)系統(tǒng)成功地完成某一項(xiàng)操作時(shí),將在狀態(tài)欄上提示英文信息。例如,當(dāng)查詢時(shí)不存在滿足條件的記錄,系統(tǒng)將提示:FRM-40301:Query caused no records to be retrieved .Re-enter。 3. 當(dāng)系統(tǒng)執(zhí)行過(guò)程中檢測(cè)到某項(xiàng)操作錯(cuò)誤時(shí),也將在狀態(tài)欄上提示英文信息。例如,當(dāng)已到第一條記錄時(shí),若用戶仍企圖繼續(xù)查看上一條記錄,系統(tǒng)將提示:FRM-40110:At first record。 4. 當(dāng)用戶修改數(shù)據(jù)后,并未保存數(shù)據(jù)就企圖進(jìn)行其他操作,如進(jìn)行查詢、記錄翻頁(yè)或退出程序,系統(tǒng)將自動(dòng)彈出一個(gè)英文的Alert窗口,出現(xiàn)以下提示:“DO YOU HAVE WANT TO SAVE THE CHANGES YOU HAVE MADE?”;并要求用戶在YES、 NO、 CANCEL三個(gè)按鈕間進(jìn)行選擇。 5. 運(yùn)行時(shí)菜單項(xiàng)總有一個(gè)英文的WINDOW項(xiàng),即使將FORM的MENU MODULE屬性置為空白也無(wú)濟(jì)于事。 以上這些情況的出現(xiàn),破壞了中文應(yīng)用程序的整體效果,并使用戶操作時(shí)感到困惑。針對(duì)這些問(wèn)題,下面分別給出解決的方法。 一、 設(shè)置中文的主窗口標(biāo)題 在FORM級(jí)的TRIGGERS:WHEN-NEW-FORM-INSTANCE中加入以下代碼: SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW,TITLE, 'CAAC計(jì)算中心業(yè)務(wù)信息系統(tǒng)( V1.0 )'); 該命令將多文檔主窗口的標(biāo)題設(shè)置為“CAAC計(jì)算中心業(yè)務(wù)信息系統(tǒng)( V1.0 )”。運(yùn)行時(shí)該標(biāo)題將替代缺省的標(biāo)題“Forms4.5”。 附帶提一下,用SET_WINDOW_PROPERTY命令還可完成對(duì)多文檔的主窗口和子窗口許多屬性的設(shè)置。例如,假如多文檔子窗口為window0,下面的命令將使文檔主窗口和子窗口在運(yùn)行時(shí)自動(dòng)最大化: SET_WINDOW_PROPERTY(FORMS MDI WINDOW, WINDOW STATE, MAXIMIZE); SET_WINDOW_PROPERTY('window0', WINDOW STATE, MAXIMIZE); 二、 漢化西文的提示信息 Oracle的提示信息分為兩類(lèi):一類(lèi)是操作成功的提示信息,如前面提到的第二種情況;一類(lèi)是操作錯(cuò)誤的提示信息,如前面提到的第三種情況。前者將以消息(Message)的形式,自動(dòng)觸發(fā)FORM級(jí)的TRIGGER:ON-MESSAGE;后者將觸發(fā)FORM級(jí)的TRIGGER:ON-ERROR。因此,我們可以在這兩個(gè)觸發(fā)器中,捕捉并漢化英文的提示信息。 漢化英文信息的基本思想是建立一個(gè)漢化信息表,在表中存儲(chǔ)系統(tǒng)的信息編號(hào)和對(duì)應(yīng)的中文漢化信息。當(dāng)利用觸發(fā)器捕捉到系統(tǒng)信息時(shí),查詢?cè)摫?,取出中文信息,顯示在狀態(tài)欄上。下面是漢化以消息的形式出現(xiàn)的系統(tǒng)信息的步驟: 1. 在SQL-PLUS中創(chuàng)建漢化信息表: Create table chi_errmsg( msgno NOT NULL VARCHAR2(6), chinesemsg VARCHAR2(60), PRIMARY KEY ( msgno) ); 表chi_errmsg中,msgno字段用以記錄系統(tǒng)的信息編號(hào),我們約定該字段的記錄方法為:前綴(1位)+信息編號(hào)(5位)。其中前綴‘M’表示該信息為系統(tǒng)消息;‘E’表示該信息為系統(tǒng)錯(cuò)誤消息。chinesemsg是編號(hào)相對(duì)應(yīng)的中文提示信息。 2. 在FORM級(jí)的觸發(fā)器ON-MESSAGE中寫(xiě)入如下代碼: DECLARE Mesgno varchar(6); Errormesg varchar2(60); Msg_frm varchar2(200); BEGIN Msg_frm:=MESSAGE_TYPE||'-'||TO_CHAR(MESSAGE_CODE)||':'||MESSAGE_TEXT; Mesgno := 'M'||TO_CHAR(MESSAGE_CODE); SELECT chinesemsg INTO Errormesg FROM chi_errmsg WHERE msgno = Mesgno; MESSAGE(MESSAGE_TYPE||'-'||TO_CHAR(MESSAGE_CODE)||':'||Errormesg,NO_ACKNOWLEDGE); EXCEPTION WHEN others THEN MESSAGE(Err_frm,NO_ACKNOWLEDGE); END; 在上面的代碼中,MESSAGE_TYPE、MESSAGE_CODE、MESSAGE_TEXT三個(gè)系統(tǒng)變量記載了消息的類(lèi)型、編號(hào)及內(nèi)容。以本文開(kāi)始提到的第二種情況為例,當(dāng)出現(xiàn)“FRM-40301:Query caused no records to be retrieved .Re-enter”消息時(shí), MESSAGE_TYPE="FRM"; MESSAGE_CODE="40301"; MESSAGE_TEXT="Query caused no records to be retrieved .Re-enter"。 由于每一個(gè)消息都有一個(gè)唯一的編號(hào),因此可依據(jù)該編號(hào)來(lái)查找對(duì)應(yīng)的中文信息。 3.充實(shí)漢化信息表的內(nèi)容 通過(guò)上面兩步,我們已完成了對(duì)系統(tǒng)消息的捕捉和漢化工作。接下來(lái)的工作就是在應(yīng)用開(kāi)發(fā)的過(guò)程中,針對(duì)應(yīng)用中可能出現(xiàn)的西文信息,捕捉一個(gè),漢化一個(gè)。例如,我們需要對(duì)“FRM-40301:Query caused no records to be retrieved .Re-enter”漢化,只需要在chi_errmsg表中加入一條記錄即可: insert into chi_errmsg values('M40301','本次查詢沒(méi)有取出符合條件的記錄!請(qǐng)?jiān)僭?); 對(duì)系統(tǒng)錯(cuò)誤信息的漢化與消息漢化的思想相同,下面給出在ON-ERROR觸發(fā)器中的代碼供讀者參考: DECLARE Mesgno varchar(6); Errormesg varchar2(60); Err_frm varchar2(200); BEGIN Errfrm :=ERROR_TYPE||'-'||TO_CHAR(ERROR_CODE)||':'||ERROR TEXT; Mesgno := 'E'||TO_CHAR(ERROR_CODE); SELECT chinesemsg INTO Errormesg FROM chi_errmsg WHERE msgno = Mesgno; MESSAGE(ERROR_TYPE||'-'||TO_CHAR(ERROR_CODE)||':'||Errormesg, NO ACKNOWLEDGE); EXCEPTION WHEN others THEN MESSAGE(Err_frm,NO_ACKNOWLEDGE); END; 針對(duì)"FRM-40110:At first record"錯(cuò)誤,在chi_errmsg表中插入: insert into chi_errmsg values('E40100','已到第一條記錄!'); 最后提醒讀者,一個(gè)系統(tǒng)提示信息類(lèi)型究竟是“ERROR”還是“MESSAGE”,可查閱Developer/2000的參考手冊(cè)。 三 、替換西文Alert窗口 設(shè)計(jì)的基本思想是建立一個(gè)中文的Alert,并在可能出現(xiàn)西文Alert的地方加上代碼觸發(fā)中文的Alert警告,提醒用戶進(jìn)行存儲(chǔ)。 例如,針對(duì)本文開(kāi)始提到的第四種情況,為使系統(tǒng)退出時(shí)不再出現(xiàn)西文Alert窗口,可在FORM級(jí)的TRIGGER:KEY-EXIT中加入如下代碼: DECLARE return_value number; alert_id Alert; BEGIN IF :SYSTEM.FORM_STATUS= 'CHANGED' THEN alert_id := Find_Alert('stop_alert'); SET_ALERT_PROPERTY(alert_id,alert_message_text,'數(shù)據(jù)已經(jīng)改變!確認(rèn)是否存儲(chǔ)?'); return_value := SHOW_ALERT( alert_id ); IF return_value = ALERT_BUTTON1 THEN COMMIT_FORM; ELSE CLEAR_FORM(NO_COMMIT); END IF; ELSE CLEAR_FORM(NO_COMMIT); END IF; EXIT_FORM; END; 這段代碼的基本思想是當(dāng)記錄值發(fā)生改變時(shí),彈出中文的Alert,提醒用戶存儲(chǔ)。'stop_alert'是我們自制的中文Alert,它有兩個(gè)按鈕:確認(rèn)、取消。當(dāng)返回第一個(gè)按鈕(即確認(rèn)按鈕)時(shí),系統(tǒng)提交對(duì)數(shù)據(jù)的修改,否則取消修改。這樣,當(dāng)執(zhí)行EXIT_FORM命令時(shí),將不會(huì)出現(xiàn)原有的西文Alert。 四 、消除菜單中的Window項(xiàng) 用戶程序有兩種情況,一種是不需要菜單;一種是具有中文的菜單。這兩種情況下消除Window項(xiàng)的方法為: ?。ㄒ唬┯脩舫绦虿恍枰藛?br> 1. FORM中的MENU MODULE屬性:為空。 2. Window中的MODAL屬性:TRUE。 ?。ǘ┯脩舫绦蛴兄形牟藛?br> 1. 在用戶菜單中建立一個(gè)Item,命名為WINDOW。 2. 設(shè)置該Item屬性如下: Menu Item Type:Magic Command Type:Null Magic Item:Window Lable:為空 |