系统错误提示窗口

软件有时会因为人为操作的原因或程序本身漏洞的原因或者其它原因出现错误,这时PB的提示信息是英文的,对于我们使用中文的人来说,这肯定会是件非常头痛的事件,而且会有损良好的人机交互界面……

所以接下来先制作一个系统出错时的提示窗口,这样在设计和调试程序时有许多错误可以通过提示窗口中文化信息看到。

①首先,先制作一个“数据窗口(DataWindow)”,在“新建窗口”中选择“DataWindow”项,选择“FreeForm”,点击“OK”按钮,在接下来的窗口中选择“External”,按“Next”,在下面这个窗口中,需要设计5个变量(如下图表:)

字段变量名

变量类型

变量大小

中文含义

Err_number

String

10

错误号

Err_message

String

255

错误信息

Err_where

String

255

出错窗口/菜单

Err_object

String

255

出错对象

Err_event

String

255

出错事件

Err_line

string

255

出错代码行

系统错误提示窗口制作(转) - ╳﹏狼狼℡ - 狼狼的博客

在下一个窗口中选择“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:“打印信息”

ClickedEvent:

//打印错误信息

dw_error.print()

c.Name:cb_continueText:“继续执行”

ClickedEvent:

//关闭提示窗口

Close(Parent)

d.Naem:cb_haltText:“终止系统”

ClickedEvent:

//终止程序执行

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!)

EndIf

EndIf

将窗口保存为“w_system_error”。

然后在应用对象mpgl的systemerror事件中加入代码:Open(w_system_error)即可。

OK!到此为止,系统错误提示窗口设计完成,大家可以故意设计一些错误测试一下。