可重用MIS用户接口模块的设计
可重用MIS用户接口模块的设计摘 要:通过对MIS通用功能的分析,采用面向对象的继承机制构造窗口和菜单的整体框架,其中,对数据提交时校验结果的中文提示方法、打印预览、用户定制查询等进行了比较详细的研究。有效地解决了界面设计中统一性和特殊需要之间的矛盾。
关键词:用户界面;管理信息系统;面向对象;可重用 界面是系统提供给用户的第一感觉,不同开发者制作的界面风格有很大的差异,同一人在不同时间也具有随意性。因此,无论个人独自开发系统还是团队作业,都要对界面进行整体的规划。
制作统一界面的一般方法是具体而强行的规定,本文依据PB开发的经验,实现了MIS系统中窗口和菜单的整体继承框架,并对其中数据校验结果的中文提示方法、打印预览、用户定制查询和数据窗口的重复使用技术等进行了比较详细的研究,有效地解决了界面设计中统一性和特殊需要之间的矛盾。
此框架定义的祖先窗口独立于特定系统,可以为不同系统所使用而不用做任何修改,极大地提高了系统的开发效率和健壮性。
1 统一功能的提取
MIS系统需要实现大量的基本功能,如插入、提交、翻页等,从权限控制的角度,有读权限、写权限和部分写权限之分,体现在MIS系统设计中,就是查询权限和录入权限的区别。常用的操纵数据的命令如表1所示。
从中不难看出,有些命令适用于查询,而另一些则适用于录入。为此,可将窗口分为2个类型:一种具有数据录入的功能,而另外一种只是查询而已。用于录入的窗口中可以设置与录入所需功能命令相对应的菜单项和工具条,用于查询的窗口可携带适合查询操作的菜单项和工具条。
工具条显示在屏幕的上方,依据以上分析,完成编辑录入功能的窗口所带的菜单中可含15个工具按钮,如图1所示。
其功能从左到右依次为:
排序、通用查询、打印、打印预览、导入、导出、检索、新增、删除、首记录、前移、后移、末记录、提交、关闭。
查询所对应的功能为:通用查询、打印、打印预览、导出、首记录、前移、后移、末记录、日期段输入、日期输入、关闭;其图形外观与上面的编辑工具条类似,此处略去。
2 实现
在窗口上定义一个DataWindows控件dw_1,在窗口原有事件的基础上定义表1所示的用户自定义事件来操纵dw_1中的数据对象。具体的数据对象在窗口打开时指定。
在窗口所挂的菜单中设置触发窗口自定义事件所需的子菜单和脚本,并给这些子菜单设置相应的工具条图标。
下面的程序段是窗口所挂排序菜单的对应脚本,当图1所示最左边的排序按钮被触发时运行。
工具条上的其他按钮不需要设置弹起和按下状态,只需要一条触发语句就够了。系统运行时,用户通过点击工具条上的按钮完成对应菜单项脚本的执行,菜单项中的脚本进一步触发承载此菜单的窗口中的用户子定义事件的执行。
对一些简单的输入、查询操作,以上事件的定义和工具条的设置基本上满足了应用要求。大多数窗口中的数据操作围绕一个DataWindows进行,增加的DataWindows仅用于限制和过滤该中心DataWindows,因此,虽涉及多个DataWindows或其他相关控件,除操作更复杂些外,此基本功能设置也足于解决问题。当窗口上有多个DataWindows的数据需要维护时,可覆盖祖先事件的脚本,并扩展祖先脚本使其符合新的功能要求。
3 利用继承机制实现通用功能的一致性
由于以上窗口实现的基本功能在系统中普遍存在,为了减少编程量,提高窗口界面的一致性,可用上面介绍的窗口为祖先,让其他负责具体事务的窗口来继承。这样,所有通过继承产生的子窗口将不再书写类似的代码。系统在初始阶段集中精力编制这些通用功能,可以保证功能实现得更加完善。
dw_1控件中数据对象的设置在每个子孙窗口的Open事件中完成,这样就保重了各窗口所操作的数据是不同的,dw_1控件的大小可视具体的要求进行调整。
按PB中多文档窗口的操作要求,每一个窗口都有自己的菜单和工具条,为了使菜单保持整体的稳定,即窗口切换时基本菜单功能保持外观不变,将完成基本功能的模块结构定义为祖先菜单,通过继承生成查询和编辑2个子孙菜单,子孙菜单中分别附加了触发相关窗口事件所需的菜单项、工具条和脚本。
根据窗口功能的不同,通过继承产生的窗口可选择挂2个子孙菜单之一,这样,特定窗口需要做的只是添加工具条中没有的功能和控件。只要统一定义了窗口和数据窗口的背景色以及字体的风格、大小和颜色,即使各窗口由不同的人开发、窗口的复杂程度不同,窗口的风格也基本一致。为保证祖先窗口的事件脚本能操纵每一个子孙窗口的数据,只需在程序中将要应用的窗口名改为代词this即可。工具条的使用,不但简化了窗口上控件的数目、为数据区留下了更大的显示空间,而且保证了界面风格的一致。
在实际操作的过程中,当工具条预定义的功能不适合一个特定的窗口应用时,系统可视具体情况对祖先脚本进行不同的覆盖处理,例如,有些人只有修改权限而没有插入权,系统会给予必要的提示;有些窗口比较复杂,涉及多个DataWindows的提交,则系统首先覆盖继承来的祖先的提交事件脚本,再对提交事件进行必要的、比祖先事件更复杂的处理。如果不允许工具条中的某个功能使用,只需在Open事件中设置他的属性为Disable即可。
为了使用户对当前DataWindows中的记录总数有个总体的把握,系统在祖先窗口中特定义一个单行编辑器sle_1,用于提示总记录数和当前记录数。此功能的设置对FREE界面格式的DataWindows用户尤其有用。实现方法是,在DataWindows的
4 错误俘获及例外处理
对于错误的命令和输入要提供反馈信息,给出正确用法。这一功能虽然不体现在工具条中,但具有通用性,必须由祖先窗口来实现。可以俘获的例外很多,但MIS涉及的主要是数据库错误,窗口上的其他控件的错误可在程序调试时纠正。
在数据提交时,DBMS要进行数据完整性的检验,常出现的错误有:非空字段没有输入值,这时,PB将提示一段出错信息。遗憾的是,该信息以英文方式显示,用户出错是难免的,怎么用中文实现出错提示呢?
假如我们在DataWindows中需录入xqrq(需求日期),该字段由非null约束,若DataWindows控件的Dberror事件中无脚本,而用户又忘记了录入此项数据,则提交数据时系统将以英文显示出错信息:
第一句指出出错的位置,最后一句为一般性说明。
当然,数据提交前可以用程序对所有内容进行验证,但这种解决办法看似简单,实现是很麻烦的,需要逐行对各字段可能的错误进行分析。实际上,当提交失败时,DataWindows控件的Dberror事件首先被触发,并传递5个参数,分别为:
sqldbcode(错误代码),sqlerrtext(错误提示),sqlsyntax(出错的语句),buffer(),row(出错行号)。
因此,可采用以下解决途径:
在DataWindows控件的Dberror事件中写脚本:
gf_dbms_error(dw_1,sqldbcode,sqlerrtext,sqlsyntax,row)
其中gf_dbms_error为自定义的专门处理数据库出错信息的全局函数,其基本思路是:根据sqldbcode确定错误类型,然后从sqlerrtext提示信息中分解出字段名等信息段,根据不同的错误类型,重新组合并显示在显示器上。当然,若字段名为英文字母,还需将字段名转换为注释(一般为中文)。
例如:针对以上提交所碰到的问题,系统提示如图2所示。
5 打印预览的实现技术
打印预览是Windows应用提供给用户自主进行打印界面设置的一个接口,实现的基本原理是系统根据用户需求对需预览的DataWindows的各项默认参数进行修改,由于打印预览结束后系统还需返回到原状态,为此,系统不能对原DataWindows进行直接操作,又由于此功能的普遍使用性,在实现上系统将此功能安排在祖先窗口上,由各菜单来触发该功能的执行,由工具条来具体实施。
实现的关键是怎么将要打印预览的数据传递给用于打印预览的子程序,解决此问题的方法一般有两种:
(1)将需打印的DataWindows中的数据对象赋予打印预览窗口中的DataWindows控件的数据对象,将需打印的DataWindows控件中的数据复制到Windows的剪贴板,再从剪贴板上将数据复制到打印预览窗口中的DataWindows控件中,最后完成对窗口中各项参数的设定。
许多论文中提供了这种方法的实现,PB自带的一个示例也是这个原理。但应用中存在以下2个主要的缺陷:
首先,若需预览的DataWindows中带有下拉子DataWindows,则下拉子DataWindows无法实现自动转换,即显示出来的是内部存储值而不是用户应该看到的显示值,因为拷贝过去的是内部存储值,从而让用户感到莫名其妙。为解决此问题,需重新构造各带下拉子DataWindows的DataWindows的表的关联关系,涉及到DataWindows中的所有子DataWindows,实现起来工作量和难度均较大,也失去了这一下拉子46DataWindows工具带来的设计便利;第二个问题是复合报表无法实现预览,复合报表是一个将多个DataWindows合成为一个DataWindows的技术。因此,此方法并不是一个实用的实现,只能用于最简单的场合。
(2)设置一个全局的DataWindows控件变量,让该DataWindows变量共享要进行打印预览的DataWindows控件,然后对该全局的DataWindows控件变量进行用户定制设置,则以上问题全部解决。图3是此思路的具体实现,数据窗口上面一行的控制命令分别为:大小缩放、页码、上边距、左边距、下边距、右边距的直接输入和点击按钮式输入,最右边提供的是标尺的选择。该窗口自带菜单和工具条,不受继承机制的限制,工具条中提供了打印等按钮。
6 通用查询技术
对常用的查询,我们可逐一定制,但定制的查询缺乏灵活性,考虑到定制的查询并不能完全满足用户的实际需要,为此系统可定义通用查询,并将他列入工具条中,以便随时访问,以适应特殊的需求。
实现技术:从数据库的系统表中提取表名、显示所需的字段名,以及用于构造逻辑关系的字段名;构造查询所需的逻辑表达式,并按此逻辑关系检索数据,确认后可调用打印预览来显示。由于有些数据库不支持汉字表名和字段名,使得表名和字段名需用英文字符书写,为此真正使用的应该是表和字段的注释。实现的另一个关键问题是动态SQL的构造,比较复杂,在此不一一叙述,具体结果如图4所示,图3中显示的预览结果就是由此方法构造。
通用查询虽然提高了系统的灵活性,但操作起来比较复杂,尤其是构造复杂逻辑表达式需要专门知识,且用户必须非常熟悉数据库的结构。以上实现只能进行单表查询,因此,仅做辅助性使用。
7 结 语
本文提供的窗口和菜单继承机制保证了用户界面的整体风格,通过仔细地设计工具条和用户自定义事件,使窗口功能进一步完善,所需控件数目进一步变少。当然,要实现一致的用户界面,开发者还必须进行相应的统一规定,如字体风格和颜色的统一设定、显示分辨率设定等等。在项目开发的早期还需定义编辑格式以规范共用的数据字典、定义显示格式以控制用户数据的显示方式,从每一个细节上来保证系统风格的一致。
另外,以上实现的通用界面的祖先窗口可以被所有MIS所使用。
参考文献
[1]http://www.sybase.com/products/power builder/index.html
[2]http://lin2000.myrice.com/
[3]晓通网络数据库研究所.PowerBuilder 6.0/6.5开发与参考手册[M].呼和浩特:内蒙古人民出版社,1999. 谢谢分享!:D
页:
[1]