PB通用的编程规范

PowerBuilder 专栏收录该内容
1 篇文章 0 订阅

[PB]-PB编码规范

**综述

*编程对象的分类
以PowerBuilder作为前台开发工具,进行软件开发的过程中,所涉及的编程对象如下所示
序号 类别
1 源代码
2 可执行代码
3 资源文件(如pbr,bmp,ico文件)
4 配置文件(如ini文件)
5 其他

*编程对象的组织
使用PowerBuilder开发工具产生的对象,可以按照设计(正在编写和调试)和运行(调试、编译结束,可以接受测试和运行)中的状态进行编程对象的组织规划,重点是目录结构的划分,具体目录的相对关系如下所示
类别 目录 说明
源代码 SrcCode 可按子系统再划分子目录(如pbl等文件夹)
可执行代码 Program或项目名称 可按子系统再划分子目录
图片文件 Images或pic等 包含应用图标ICO文件、BMP/JPG/GIF文件
配置文件 Ini
其他 Other

**版本说明
a. 软件版本号标准为A . B,其中A和B为0到99之间的数字。
b. 当A大于1并且B为奇数时,表示当前版本为处于开发、测试阶段的版本,定义为“开发版”;当B为偶数时,表示当前版本为稳定的、可实际运行的版本,定义为“稳定版”。
c. 当软件开始开发时,确定版本号为0.1;随着软件开发的进度,版本号随着每一次主要功能的完善而变化,最高达到0.99。
d. 软件初步开发完成后,经过软件开发小组内部测试,初步能够完成软件需求提出的业务规范和技术要求,软件基本能正常运行,此时,确定该软件版本号为1.0 Beta X ,这意味着软件可以投入实际应用测试,其中X代表测试的次数。
e. 当软件的1.0 Beta X 版本推出并经过用户实际应用或者试运行测试后,此时,确定该软件版本号为1.0 RC。这意味着软件可以投入实际应用运行。
f. 当软件的1.0 RC 版本投入实际应用运行达到某一时限后,则认为该版本已经稳定,可以完全正常地使用了,这时,确定软件的版本号为1.0,这意味着软件开发完成,可以投入实际应用和推广。
g. 当软件进行升级时,如果功能变化不大,则次版本号变化;如果软件功能发生重大变化时,主版本号变化。


**对象命名规范

*命名约定
a.部件名称可以达到40个字符,组成方式为A_B。
b.A部分表示前缀,表示部件的类型。
c.紧跟着一条下划线“_”。
d.B部分描述此部件的名称。可以根据情况具体决定B的构成。推荐将B部分分解成两部分: 功能代码_功能描述。
e.在重要变量后面写注解表示此变量的用途。
比如,常用的几种对象命名是
窗口的命名:w_功能代码_功能描述。
数据窗口控件的命名:dw_功能代码_功能描述。
数据窗口对象的命名:d_功能代码_功能描述。
菜单命名:m_功能代码_功能描述。
用户对象:uo_功能代码_功能描述。

*具体命名规则

1. 函数的命名规则
函数名=‘函数适用范围代码’ +‘f’+‘_’+‘函数功能描述’,其中函数的
适用范围代码和意义如下:
g 全局函数;
w 窗口函数;
m 菜单函数;
u 用户对象函数。
例:检查SQL语句执行结果的全局用户函数命名如下:gf_checksql()。

2. 应用
应用的命名应使用与该应用的意义相关联的英文字母,例如,app_si表示社会保险应用系统。

3. PBL库
PBL库组织的好坏很重要,它会影响应用开发和维护的容易程度以及应用的性能。Library的组织应遵循以下原则:
a. Library的大小。PowerBuilder对Library的大小没有限制,但最好使之小于1MB,Library太大,PowerBuilder要花更多的时间去打开和存储对象,这会影响开发的效率。
b. Library的数量。尽量用最少的Library数量。应在Library的数量和每个Library中对象数量之间找到平衡点,如果Library数量太多而每个Library中对象数量太少,搜索路径会太长,影响运行效率。
c. Library的优化。要在Library画笔中经常对Library进行优化。随着时间的推移,Library会被分段,会使Library的存储变得不连续,影响运行效率。
d. Library的分类组织。PBL库可按子系统或功能组织,一般应用都包含公共PBL库。每个PBL库文件命名应该与该文件作用相关联,例如报表PBL库文件命名为report.pbl。每个PBL库文件应该包含详细注释,列出该PBL文件包含哪些对象,对应哪个子系统,与其他PBL(调用)关系等信息。

为了有效地进行团队开发,实现对PB源码的管理,要求基于对各方因素(如应用代码的执行效率和所占存储空间)和维护上的全面考虑,对PB源码实行分类的原则。PowerBuilder的Library的分类原则有两种方式:
(1)制定对象分类法
根据所制定的不同类的对象进行分类。
例:将所有的窗口放在一个Library中。
(2)功能模块分类法
根据系统的功能模块的不同,将属于不同类的制定对象放在一个Library中。这是一种更为有效的方式。

4. 初始化配置文件
初始化配置文件的命名必须与应用的名称一致,扩展名为.ini,例如:si.ini。用户的可变环境信息都应该保存在该文件中,关键信息加密保存,并且提供管理工具,而不是手工修改该文件。

5. 资源文件
资源文件的命名必须与应用的名称一致,扩展名为.pbr,例如:si.pbr。

6. 窗口
窗口的命名必须以w(Window的首字符)开头,加下划线(_),其后紧接与窗口意义相关联的英文字母(总长不得超过PowerBuilder的40个字符限制),并且在注释(Comments) 框内写出该窗口的作用(中文或英文),如下所示。
序号 窗口名称 Comments
1 w_about 关于本系统的版权信息
2 w_system_error 系统出错提示
3 w_main 系统主界面
4 w_report_sheet 报表输出

7. 数据窗口
普通数据窗口的命名必须以dW(DataWindow缩写)开头,代码表下拉式子数据窗口必须以dddw(DropDownDataWindow缩写)开头,加下划线(_),其后紧接与数据窗口意义相关联的英文字母(总长不得超过PowerBuilder的40个字符限制),并且在Comments 框内写出该数据窗口的作用(中文或英文),如下所示。
序号 数据窗口名称 Comments
1 d_system_error 显示系统错误,被w_System_Error窗口调用
2 d_categories 对产品分类,被w_Report_Sheet窗口调用
3 d_detail_parts Parts of Products Described in Detail 
4 d_detail_function Products Function Described in Detail
5 dddw_sex 性别代码表

8. 菜单
菜单的命名必须以 m(Menu缩写)开头,加下划线(_),其后紧接与菜单意义相关联的英文字母(总长不得超过PowerBuilder的40个字符限制),并且在Comments 框内写出该菜单的作用(中文或英文),如下所示。
序号 菜单名称 Comments
1 m_main Front End Main Menu
2 m_report Report Subsystem Menu
3 m_main_pop 主界面的弹出菜单

9. 函数
函数的命名必须符合<类型>f_subsystemname_detailname或 lf_detailname格式,其中gf表示是全局函数,subsystemname是子系统的英文缩写,detailname是与函数意义相关联的英文字母(总长不得超过PowerBuilder的40个字符限制),对于全局函数应该在Comments 框内简短写出该函数的作用(中文或英文),如下所示。
序号 函数名称 Comments
1 gf_help_index 帮助子系统索引全局函数
2 lf_get_user_info 获取用户信息局部函数
3 gf_query_sortbyname 查询子系统名排序全局函数

10. 用户对象
用户对象的命名必须以uo(UserObject缩写)开头,加下划线(_),其后紧接与用户对象意义相关联的英文字母(总长不得超过PowerBuilder的40个字符限制),并且在Comments框内写出该用户对象的作用(中文或英文),如下所示
序号 用户对象名称 Comments
1 uo_external_function Cross platform user object ancestor
2 uo_report_structure User Object as a structure For report

11. 控件
控件的命名必须以控件名称缩写开头,加下划线(_),其后紧接与控件作用相关联的英文字母(总长不得超过PowerBuilder的40个字符限制),如下所示
序号 控件名称 控件缩写 控件命名范例
1 CommandButton cb cb_ok
2 PictureButton pb pb_thank_info
3 CheckBox cbx cbx_age_show
4 RadioButton rb rb_typical_setup
5 StaticText st st_user_id
6 Picture p p_user_photo
7 GroupBox gb gb_detail_info
8 Line ln ln_h_separator
9 Oval oval oval_used_flag
10 Rectangle r r_photo_frame
11 RoundRectangle rr rr_companyflag
12 SingleLineEdit sle sle_user_name
13 MultiLineEdit mle mle_book_comments
14 RichTextEdit rte rte_student_answer
15 EditMask em em_telephone_no
16 HScrollBar hsb hsb_time_set
17 VScrollBar vsb vsb_money_set
18 DropDownListBox ddlb ddlb_your_favourite
19 DropDownPictureListBox ddplb ddplb_photo_preview
20 ListBox lb lb_department_name
21 PictureListBox plb plb_user_identification
22 ListView lv lv_all_user
23 TreeView tv tv_customers
24 TabPage tpg tpg_ordinary_super
25 Tab tab tab_super
26 DataWindow dw dw_user_info_detail
27 Graph gr gr_month_report
28 Ole ole ole_word_doc


**变量命名规范

变量取名应遵守命名规范,对使用频繁的或关键变量,为了便于阅读和修改,在定义时应加上注释标明其含义。例如:
String ls_name // 参保人员姓名
变量命名规则为: 变量范围 + 变量数据类型 + '_' + 含义代码

*变量数据类型约定
数据类型 前缀
Any a_
Blob bb_
Boolean b_
Character c_
Date d_
DateTime dt_
Decimal dec_
Double db_
Integer i_
Long l_
String s_
Time t_
UnsignedInteger ui_
UnsignedLong ul_
DataWindow dw_
DataWindowChild dwc_
MailSession ms_
Menu m_
Structure str_
Transacttion trans_
Window w_
UserObject uo_

*变量范围命名约定
范围 字首 描述
Global g?_ 全局变量将在整个应用中有效。它们可能从
其他对象面板中定义,但它们将在整个应用中有效
Shared s?_ 共享变量在一个对象及其实例中有效
Instance i?_ 实例变量仅在一个对象的实例中有效。相应对象
的不同实例中的变量保存各自的值
Local l?_ 局部变量仅在一段子程序或在script开始和结束时生效

由值传递的变量 v?_ 在定义函数时,参数仅传递值,不会被函数
(仅适用于函数变量) 改变,定义为value,例:vdw_datawindow

由引用传递的变量 r?_ 在定义函数时,参数将被此函数改变,
(仅适用于函数变量) 定义为reference,例:rl_long

注意:?表示相应数据类型,如i,c,l,s等数据类型前缀。

对于上述的内容做如下说明。
a. 全局变量的命名必须符合gT_subsystemname_detailname格式,其中g表示是全局变量(Globe),T是数据类型(DataType)的简写。subsystename是子系统的英文简写。detailname是有具体意义的英文字母。例如:gs_query_user_info ,即为查询子系统定义了一个字符串型全局变量。
b. 局部变量的命名必须符合lT_detailname格式,其中l表示是局部变量(Local),T是数据类型(DataType)的简写。例如:li_user_salary ,即定义了一个整数型局部变量。
c. 实例变量的命名必须符合iT_detailname格式,其中i表示是实例变量(Instance),T是数据类型(DataType)的简写。Detailname是有具体意义的英文字母。例如:is_product_name ,即定义了一个字符串型实例变量。


**编程规范

*书写格式
a.用分层缩进的写法显示嵌套结构的层次。
b.在注释段与程序段,以及不同逻辑的程序段之间插入空行。
c.每行只写一条语句,当需要滚动显示时应该分行书写。

*流控制
流控制首先应遵守PowerBuilder语法规范,且用分层缩进的写法突出显示嵌套的层次结构,例如:
For i = 1 To 100
For j = 1 To 50 
For k = 1 To 200 
Matrix[i,j,k]=1
Next
Next
Next

*注释及格式要求
注释总是加在程序中需要概括性说明或不易令人理解或容易令人理解错的地方。注释语言应简练、易懂而又准确,所采用的语种首选是中文,如有输入困难或特殊需求也可采用英文。

注释原则:
a.函数或过程的注释
(1)在函数头部必须说明函数的功能和参数(值参、变参);
(2)在函数的主体部分,如算法复杂时,应以注释的方式对其算法结构做出说明;
(3)函数申请过全局资源且有可能导致资 源紧张应加以注明(如内存和文件柄等);
(4)函数有副作用一定以十分醒目的方式(如加!号等)注明。
b.语句的注释
(1)应对不易理解的分支条件表达式加注释;
(2)不易理解的循环,应说明出口条件(有GOTO的程序还应说明入口条件);
(3)过长的函数实现,应将其语句按实现的功能分段加以概括性说明。
c.常量和变量的注释
在常量名声明后应对该名做适当的注释,注释说明的要点是:
(1)被保存值的含义(必须) ; 
(2)合法取值的范围(可选);
(3)全局量需要对以上逐点做充分的说明。
d.制定对象的注释
每个开发人员针对自己所制定的窗口、菜单、数据窗口、数据管道和用户对象等添加注释,要点是:
(1)标注对象的用途;
(2)标注对象的制定人员;
(3)标注时间或者修改时间。

具体格式要求如下:
1. 在窗口Open事件前应说明
/* ======================================================= */
// 窗口中英文名称:
// 窗口作用:
// 作者:
// 日期:
/* ======================================================= */

2. 在事件脚本(Script)之前应说明
/* ======================================================= */
// 脚本作用:
// 输入参数及数据类型:
// 返回参数及数据类型:
// 全局函数及其用途:
// 全局变量及其用途:
// 作者:
// 日期: 
// 修改人的姓名:
// 修改日期:
// 修改原因:
/* ===================================================== */
若有多人修改,每个人均加上自己的注释,而不能改他人的姓名、日期、原因,对要修改的脚本,只能注释不能删除,并且在修改的地方加上修改人名、日期和"Beginning Modification... ","EndingModification"字样。

3. 脚本中的注释
单行脚本程序注释:
// 注释文本 
脚本的程序段注释:
/* ================================== */
//
// 注释文本
//
/* ================================== */
变量的注释如下:
数据类型 变量名 //注释

4. 在函数、存储过程等脚本(Script)之前应说明
/* ======================================================= */
// 函数名称:
// 参数解释:
// 功能描述:
// 调用举例:
// 最初作者:
// 编写日期:
// 返 回 值:
// 变量情况:
// 修 改 人:
// 修改日期:
// 修改原因:
/* ======================================================== */


*Powerbuilder脚本编程规范

1. Powerbuilder编程注意事项
a.不要在子应用中声明全局变量!如必须声明全局变量,则应事先向项目负责人申请。
b.供别的文件或函数调用的函数,绝不应使用全局变量交换数据。
c.所有SQL语句均需判断返回结果(包括SELECT,COMMIT语句)。
例:
If sqlca.sqlcode = -1 Then
错误处理程序
跳出
Else
正常
End If
d.缺省SQLCA的连接语句connect,在应用Open事件中完成,其disconnect在主应用的Close事件中完成,其余任何pbl中均不能有disconnect语句。
e. 由于要连接多个数据库,需要用Create创建对象,比如:SQLSYB,则用 connect using SQLSYB,处理完毕后用 disconnectusing SQLSYB,并且用 destroy SQLSYB释放资源。

2. 编码标准
(1)在代码块前后留一个空行。例子如下:
If <condition1> Then
<statementblock>
End If

For <varname>=<start> To <End> Step <increment>
<statement_block>
Next
(2)把单行注释与当前script程序的缩进位置对齐:
//This is a comment For condition1
If <condition1> Then
//This is a comment For condition2
If <condition2> Then
//This is a comment For action1
<action1>
End If
End If
(3)缩进应以Tab键实现,不得采用空格。
(4)变量采用小写格式。注意:
① 变量全部用小写;
② 一个变量一行,每个变量必须注释;
③ 通常情况下,变量的后半部分尽量用数据库字段名;
④ 变量声明全部在脚本之前声明完毕;
⑤ 所有变量声明时按代码功能段 + 变量类型进行排序。例如:
Long ll_quantity
String ls_name 
对象名采用小写,属性、关键字、保留字和内置函数均用首字母大写格式:
w_cont_de.Visible = True
m_mdi.m_file.m_print.Enabled = False
数据窗口控制的函数加上修饰,而不以数据窗口对象作为参数:
dw_main.SetTransObject(sqlca)
dw_main.SetRowFocusIndicator(Hand!)
dw_main.Retrieve()
(5)当连接起来的字符串超过了两行的长度时,使用 + 符作为下行的第一个字符,每次均采用缩进格式。字符串的随后部分应该再次缩进。例如:
ls_msg = "连接数据库失败!错误信息为:~r~n" &
+ Sqlca.SqlErrText &
+ "请与系统管理员联系" 
(6)PowerBuilder保留字(关键字)首字母大写其余小写,这样看起来层次清晰,如:This,Parent,ParentWindow,True,False,Return,Halt与Close。
(7)PowerBuilder内部函数及属性每个字首字母大写其余小写,这样看起来层次清晰,如:sle_user.Text,dw_1.SetTransObject(Sqlca),Sqlca.SqlErrText。
(8)SQL语句按如下格式书写:
SELECT name,sex,dept_id
INTO :ls_name,:ls_sex,:ls_dept_id
FROM employee
WHERE emp_id = :ls_emp_id ;
(9)程序中应避免出现 goto 跳转语句。

3. 脚本中一些常用功能模块的编程约定
(1)光标操作过程的编程约定如下:
Declare Cursorname Cursor for 
Select语句
Open Cursorname; 
fetch Cursorname into <variables>
Do While Sqlca.Sqlcode = 0
<statementblock>
fetch Cursorname into <variables> 
Loop 
Close Cursorname
光标命名规则:“Cur” + “_” + 名称。 
(2)调用数据库存储过程的编程约定如下:
declare Procedurename procedure For StoredProcedureName
:Value1,:Value2......;
execute Procedurename;
fetch Procedurename into <variables>;
close Procedurename;
commit;
存储过程命名规则:“Pro” + “_” + 名称。
有些系统存储过程(例如:sp_droplogin)不能当做一个事务提交,为了执行它,就必须先置事物对象的AutoCommit属性为True,当存储过程执行完毕后再将事务对象的AutoCommit属性置为False。
(3)在每一个SQL语句之后必须判断SQL语句执行成功与否,成功则继续,不成功则做相应处理并给出一条提示信息。
If Sqlca.SqlCode <> 0 Then
Rollback ;
MessageBox("错误信息","操作失败!")
Else
Commit;
MessageBox("提示信息","操作成功!")
End If
(4)所有操作符(包括等号)前后应留一空格,使程序看起来更清晰。例如:
ls_msg = ls_title + ls_error
(5)仅当绝对需要时才在循环结构体中使用函数调用,也就是说,仅当函数的返回值依赖于循环迭代的值时才使用函数调用。
使用如下方法:
Long ll_num_selected
ll_num_selected = lb_devctg.TotalSelected()
For i = 1 To num_selected
……
Next
不使用下述方法:
For i = 1 To lb_1.TotalSelected()
……
Next

4. PB中的任何一个窗口都要有注释说明
一般在窗口的Open事件中对窗口的功能进行全面的介绍,以便维护人员可以很清楚地知道窗口的功能和维护要点。其格式可参见前面的说明。

5. 表的操作
在程序中涉及多个表的操作时,需严格按照各项目组“表操作顺序一览表”规定的顺序对表进行操作,以防发生锁表现象。


**控件编程规范

*公共部分
a.应尽量为所有控件使用有意义的名称,重要控件不允许使用 pb_1 之类无明确意义的名称。
b.大号字体:各窗口控件字体为Arial,字号为12号,字色为黑色。小号字体:各窗口控件字体为宋体,字号为9号,字色为黑色。
c.显示控件和输入控件底色分开,显示控件为灰色(窗口颜色),输入控件为白色。
d.输入区和显示区分别放置。
e.按钮排列紧凑,在窗口右侧纵向排列时靠上放置;在窗口下方排列时靠右放置,因为左撇子操作者毕竟是少数。
f.各字符类控件对齐方式为左对齐;数字类控件为右对齐,且必须按所需格式设置Format 属性;日期控件必须保证能完整显示所需日期格式,应用yyyy-mm-dd风格。及有前导0的形式(避免2000年问题),可采用左对齐或中对齐。
g.CommandButton控件的推荐高度为104。

*控件细则

1. 静态文本框
静态文本框命名规则:st + '_' + 名称(若为label可不改名)。
外观规定如下:
背景色:buttonface;
前景色:黑色;
边 框:无;
高 度:72。
建议在其后加上全角冒号(:)。

2. 单行编辑框
单行编辑框命名规则:sle + '_' + 名称。
(1)外观
背景色:白色;
前景色:黑色;
边 框:3D Lowered;
高 度:72。
(2)程序说明
a.响应事件建议自定义 Keydown 事件,尽量不要用Modify 事件。
b.当获得焦点时控件背景变为深蓝色,字体颜色变为黄色,失去焦点时还原缺省颜色。

3. 命令按钮
命令按钮命名规则:cb + '_' + 名称
(1)外观 
高度:对于小号字体(宋体9号)为92;
对于大号字体(Arial 12号)为108。
宽度:对于小号字体(宋体9号)为325;
对于大号字体(Arial 12号)为402。
(2)说明
命令按钮控件不要使用 cb_1 之类无明确意义的名称(尤其在窗口中这类控件比较多时,可能令人分不清各个控件的作用)。

4. 图像按钮
尽量不用图形按钮,而用命令按钮。
图像按钮命名规则: pb + '_' + 名称。
外观规定如下:
尺寸:用图像原始尺寸;
图像:按钮的有效与无效采用不同的bmp图像以示区别。

5. 复选框
复选框命名规则:cbx + '_' + 名称
外观规定如下:
背景色:buttonface;
前景色:黑色;
边 框:3D Lowered;
高 度:92;
位 置:标签在右。

6. 单选按钮
单选按钮命名规则:rb + '_' + 名称。
(1)外观
背景色:buttonface;
前景色:黑色;
边 框:3D Lowered;
高 度:92;
位 置:标签在右。
(2)程序说明
单选按钮最好与组框配合使用。

7. 组框
组框命名规则:gb + '_' + 名称。
外观规定如下:
背景色:buttonface;
前景色:黑色;
边 框:3D Lowered。

8. 屏蔽编辑框
屏蔽编辑框命名规则:em + '_' + 名称。
(1)外观
背景色:白色;
前景色:黑色;
边 框:3D Lowered。
(2)程序说明
a.响应事件建议用自定义 Keydown 事件,尽量不要用Modify 事件。
b.当获得焦点时控件背景变为深蓝色,字体颜色变为黄色,失去焦点时还原缺省颜色。

9. 下拉列表框
下拉列表框命名规则:ddlb + '_' + 名称。
外观规定如下:
背景色:白色;
前景色:黑色;
边 框:3D Lowered。

10. 应用
应用命名规则:app + '_' + 应用名。
为应用选择一个图标,以便在运行时标识应用。
在 Open 事件中声明 SQLCA 全局变量和打开应用主窗口。
在 Closequery 事件中编写退出应用之前的处理程序。
在 SystemError 事件中编写系统出错的处理程序。

11. 窗口
窗口命名规则: w + '_' + 窗口名。
主窗口采用 main 窗口类型,子窗口一般采用 Popup 窗口类型,无控制菜单,无最大化最小化按钮,不可改变大小。若为一般性提示窗口,用 response 窗口类型。
窗口以 buttonface 颜色为背景颜色。
重要的菜单选项设置 Toolbar 功能。
窗口上下左右四周应至少留出两个网格,而不得将对象填满整个窗口!

12. 菜单
菜单命名规则: m + '_' + 菜单名。
菜单项 MenuItem 的名称以该菜单项在整个菜单中的物理位置分层次命名。
例:若 MenuItem 位于整个菜单的第三列第二行,则命名为m_32。
或文件菜单下的“关闭”菜单项,则命名为 m_file_close。

13. 数据窗口对象
数据窗口对象命名规则:d + '_' + 功能含义。
打印用数据窗口背景色为白色,题目为16号字,内容为11号字,显示比例为75%。
显示用数据窗口背景色原则上为 buttonface,可视窗口制作是否美观的实际情况使用白色数据窗口各列显示框高度为 72。
Tabular和Grid风格数据窗口,无表头时列名文本边框为3DRaised。Detail区为3D Lowered,背景色原则上为白色。Grid风格数据窗口一般不出现线条。

14. 数据窗口控件
数据窗口控件命名规则:dw + '_'+ 功能含义。
数据窗口边框原则上为 3D Lowered,也可酌情使用none 外加 group。

15. 用户对象命名
用户对象命名规则:uo + '_'+ 功能含义。
公共对象对应以上各控件规范制作。


**用 户 反 馈

在系统中对用户的操作及时地提供反馈信息是十分重要的,这些反馈信息也许只是像警告铃或将鼠标显示成沙漏等一样不起眼的反应,但是却能使用户树立信心,使他感到仍在控制软件而没有死机。

*使用反馈的场合 
在客户/服务器环境下用户最不能忍受的是系统反应速度慢,而在实际的应用中却会经常遇到计算机需要比较长的时间执行一个或一批操作。在这种情况下,应加入反馈,让用户了解应用正在做什么。比如:
a.在需等待时间较短(0~10秒)的情况下应将鼠标显示成为沙漏,为此可调用函数SetPointer(HourGlass!)来实现这一功能;
b.在处理时间需10~18秒时,由微帮助来显示处理进度;
c.当处理时间需18秒以上时,要显示这个处理窗口或显示进度条;
d.当一个长时间的处理完成后应发出一个提示警告声如Beep(1),这样用户就不必总看着屏幕。

*提供反馈的几种技术手段

1. 微帮助 
微帮助是MDI(多文档界面)框下面的状态条中的文字。窗口底部的微帮助一般有两个作用:一是在用户选择菜单项或其他窗口控件时,显示更多的文字信息来解释或提示用户所要进行的操作是什么;另一个用途是系统在处理过程中显示正在进行的工作状态,以使用户了解系统的处理进度,从而免去对死机的担心。

2. 工具条的帮助 
当鼠标停留在某一个工具条上时,会出现一个弹出式信息框,在PowerBuilder 4.0以上的版本中,缺省显示的是工具条文字。也可以用菜单画笔在工具条文字之后加一个逗号,加入一段更长的文字来定义一个不同的工具条说明。例如,键入“退出,关闭应用”,将看到在带文字的工具条图标上显示的文字是“退出”,而弹出的信息框显示的是“关闭应用”。

3. 声音提示 
在用户可能进行破坏性操作时,用声音及时提出警告是必要的,但是不能滥用,因为当用户无法正确操作软件或做了不希望做的事情时,听到警告声反而会更加烦恼,因此要慎重使用这种反馈方法。此外,在一个长处理结束时使用声音反馈 ( 如警告声或小段悦音)也是必要的。


**提高程序的健壮性
统一的外观; 
引用对象前的有效性检验; 
使用正确的数据窗口列名; 
使用适当的GUI控件来使得用户输入有效; 
需要时对数据窗口的列做保护; 
提交前对数据窗口列做约束检验; 
避免用户进入危险地带; 
对用户不经意的操作做出提示。


**文档标准
文档不仅包括应用系统的设计文档,还包括源程序的相关注释及帮助文档等


**错误处理标准
对错误的处理和状态监测程序实行标准化
以下几个方面的检查可以考虑用标准的方法处理:
联结错误;
数据库存取错误;
数据录入错误;
程序执行错误。


**其他
应用开发中尽量使用过去已经开发好的模块。
使用面向对象编程中的继承特性。
使用PowerBuilder之外的辅助开发工具:设计工具;版本控制工具;测试工具。
--------------------- 
作者:冷-寂 
来源:CSDN 
原文:https://blog.csdn.net/u012369435/article/details/36422725 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB的实现 ,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密   Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。   设定字符串为“张三,你好,我是李四”   产生张三的密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节   通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥   Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从文件中得到公钥编码的字节数组、如何从字节数组解码公钥。 Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输   Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲
百度云盘分享 简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密   Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。   设定字符串为“张三,你好,我是李四”   产生张三的密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节   通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥   Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从文件中得到公钥编码的字节数组、如何从字节数组解码公钥。 Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输   Jav
©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值