系統錯誤提示視窗
軟體有時會因為人為操作的原因或程式本身漏洞的原因或者其它原因出現錯誤,這時PB的提示資訊是英文的,對于我們使用中文的人來說,這肯定會是件非常頭痛的事件,而且會有損良好的人機互動界面……
是以接下來先制作一個系統出錯時的提示視窗,這樣在設計和調試程式時有許多錯誤可以通過提示視窗中文化資訊看到。
①首先,先制作一個“資料視窗(DataWindow)”,在“建立視窗”中選擇“DataWindow”項,選擇“FreeForm”,點選“OK”按鈕,在接下來的視窗中選擇“External”,按“Next”,在下面這個視窗中,需要設計5個變量(如下圖表:)
字段變量名 | 變量類型 | 變量大小 | 中文含義 |
Err_number | String | 10 | 錯誤号 |
Err_message | 255 | 錯誤資訊 | |
Err_where | 出錯視窗/菜單 | ||
Err_object | 出錯對象 | ||
Err_event | 出錯事件 | ||
Err_line | string | 出錯代碼行 |

在下一個視窗中選擇“BackgroundColor”為“ButtonFace”,“Text”項的“Border”為“Raised”,點選“next”,然後點選“Finish”,進入資料視窗設計視窗中,調整相應的屬性設定(如下圖:)。
調整完成後儲存為“d_system_error”。
②接下來可以制作“系統錯誤提示視窗”了。
建立一個視窗,設定如下的一些視窗屬性:
Title(标題):系統錯誤提示
WindowType(視窗類型):Response!
然後在視窗上放置如下控件:
⑴1個GroupBox:清空其Text屬性内容
⑵2個StaticText:st_1.Text=“警告:”;
St_2.Text=“系統出現錯誤,請點選“顯示資訊”檢視具體錯誤資訊,并告知系統管理者!”
⑶1個DataWindow:name屬性=“dw_error”,dw_error.DataObject=“d_system_error”,調整高寬大小,放置位置在GroupBox組框中,不選Border屬性框,并取消Visible選擇框的選擇。
⑷4個CommandButton:
a.Name:cb_showText:“顯示資訊”
ClickedEvent:
IFThis.Text='顯示資訊'THEN
dw_error.Visible=True
This.Text='隐藏資訊'
ELSE
dw_error.Visible=False
This.Text='顯示資訊'
ENDIF
b.Name:cb_printText:“列印資訊”
//列印錯誤資訊
dw_error.print()
c.Name:cb_continueText:“繼續執行”
//關閉提示視窗
Close(Parent)
d.Naem:cb_haltText:“終止系統”
//終止程式執行
HaltClose;
各控件布局如下圖所示:
-----
系統錯誤提示視窗Open事件代碼:
Stringls_ErrMsg
Stringls_log_file,ls_text
Integerli_file_no
IfError.Number=0ThenReturn
ChooseCaseError.Number
Case1
ls_ErrMsg='除數為零'
Case2
ls_ErrMsg='引用空對象'
Case3
ls_ErrMsg='數組越界'
Case4
ls_ErrMsg='枚舉值超出函數範圍'
Case5
ls_ErrMsg="函數中遇到負值"
Case6
ls_ErrMsg="指定的資料視窗行/列無效"
Case7
ls_ErrMsg="聯接引用時,出現不可解決的外部引用"
Case8
ls_ErrMsg="引用帶有空下标的數組"
Case9
ls_ErrMsg="DLL函數未在目前程式中"
Case10
ls_ErrMsg="DLL函數不支援的參數類型"
Case11
ls_ErrMsg="對象檔案已過期,必須轉化為目前版本"
Case12
ls_ErrMsg="資料視窗列類型與GetItem類型不比對"
Case13
ls_ErrMsg="不可知的屬性引用"
Case14
ls_ErrMsg="為外部函數打開錯誤DLL庫"
Case15
ls_ErrMsg="錯誤調用外部函數"
Case16
ls_ErrMsg="超出最大字元串的長度"
Case17
ls_ErrMsg="資料視窗控件中引用的資料視窗對象不存在"
Case18
ls_ErrMsg="函數未傳回值"
Case19
ls_ErrMsg="不能将任意變量中NAME轉化為NAME"
Case20
ls_ErrMsg="沒有成功地準備好資料庫指令"
Case21
ls_ErrMsg="運作時,不正确地引用函數"
Case22
ls_ErrMsg="不可知的對象類型"
Case23
ls_ErrMsg="不能将NAME類型的對象指派為NAME類型的對象"
Case24
ls_ErrMsg="函數調用與其定義不比對"
Case25
ls_ErrMsg="DOUBLE或REAL表達式溢出"
Case26
ls_ErrMsg="不支援對NAME字段的指派"
Case27
ls_ErrMsg="非整型指數不能為負"
Case28
ls_ErrMsg="VBX錯誤:NAME"
Case29
ls_ErrMsg="ANY變量需要非整組值"
Case30
ls_ErrMsg="外部對象不支援資料類型:NAME"
Case31
ls_ErrMsg="不支援外部對象資料類型:NAME"
Case32
ls_ErrMsg="調用外部對象函數NAME時,未找到名字"
Case33
ls_ErrMsg="調用外部對象函數NAME時,參數類型不合法"
Case34
ls_ErrMsg="調用外部對象函數NAME時,使用不正确的參數數目"
Case35
ls_ErrMsg="錯誤調用外部對象函數NAME"
Case36
ls_ErrMsg="通路外部對象屬性NAME時,未找到名稱"
Case37
ls_ErrMsg="通路外部對象屬性NAME時,類型不比對"
Case38
ls_ErrMsg="詢問外部對象屬性NAME時,下标數目不正确"
Case39
ls_ErrMsg="錯誤通路外部對象屬性NAME"
Case40
ls_ErrMsg="與表達式中任意資料類型不比對"
Case41
ls_ErrMsg="表達式中有不合法的任意資料類型"
Case42
ls_ErrMsg="在DLL函數NAME中,運作時所指定的參數類型與所要求的參數類型不相同"
Case43
ls_ErrMsg="父對象不存在"
Case44
ls_ErrMsg="祖先的函數中具有發生沖突的參數及傳回類型"
Case45
ls_ErrMsg="外部表溢出"
Case46
ls_ErrMsg="空的對象引用不能被指派或傳遞給同類型的變量"
Case47
ls_ErrMsg="變量需要數組值"
Case48
ls_ErrMsg="數組的大小與對象的轉換不比對"
Case49
ls_ErrMsg="數組的類型與對象的轉換不比對"
Case50
ls_ErrMsg="分布服務錯誤"
Case51
ls_ErrMsg="函數或事件的參數不合法"
Case52
ls_ErrMsg="分布通訊錯誤"
Case53
ls_ErrMsg="未激活所需伺服器"
Case54
ls_ErrMsg="伺服器未接受請求"
Case55
ls_ErrMsg="請求非正常終止"
Case56
ls_ErrMsg="非完整地相應請求"
Case57
ls_ErrMsg="未聯接"
Case58
ls_ErrMsg="對象執行個體不存在"
Case59
ls_ErrMsg="不合法的列範圍"
Case60
ls_ErrMsg="不合法的行範圍"
Case61
ls_ErrMsg="将NUMBER維數組不合法地轉換成對象"
Case62
ls_ErrMsg="伺服器忙"
Case63
ls_ErrMsg="無傳回值的函數或事件用于表達式"
Case64
ls_ErrMsg="指派需要數組對象"
CaseElse
ls_ErrMsg="其他錯誤"
EndChoose
//将錯誤資訊增加到dw_error中
dw_error.InsertRow(0)
dw_error.SetItem(1,'err_number',String(Error.Number))
dw_error.SetItem(1,'err_message',ls_ErrMsg)
dw_error.SetItem(1,'err_where',Error.WindowMenu)
dw_error.SetItem(1,'err_event',Error.ObjectEvent)
dw_error.SetItem(1,'err_object',Error.Object)
dw_error.SetItem(1,'err_line',String(Error.Line))
//以下代碼段将錯誤号和錯誤資訊寫進日志檔案syserror.log中
ls_text="~r~n----------------------------------------------------------------"
ls_text+="~r~n"
ls_text+="~r~n出錯時間:"+String(Today(),'yyyy/mm/dd')+""+String(Now())
//ls_text+="~r~n操作員:"+gs_user_name
ls_text+="~r~n錯誤代碼:"+String(Error.Number)
ls_text+="~r~n錯誤資訊:"+ls_ErrMsg
ls_text+="~r~n視窗/菜單:"+Error.WindowMenu
ls_text+="~r~n出錯控件:"+Error.Object
ls_text+="~r~n出錯事件:"+Error.ObjectEvent
ls_text+="~r~n出錯行數:"+String(Error.Line)
//打開系統錯誤日志檔案
IfTrim(ls_log_file)=""ORIsNull(ls_log_file)Then
ls_log_file="syserror.log"
EndIf
li_file_no=FileOpen(ls_log_file,LineMode!,Write!,SHARED!,Append!)
Ifli_file_no=0Then
MessageBox("出錯資訊","不能打開系統出錯日志檔案!",Exclamation!)
Else
IfFileWrite(li_file_no,ls_text)<0Then
MessageBox("出錯資訊","寫系統出錯日志檔案出錯!",Exclamation!)
将視窗儲存為“w_system_error”。