易用为本――利用PB的树形及列表控件编程

时间:2022-07-09 10:55:10

易用为本――利用PB的树形及列表控件编程

摘要:树形和列表控件是Windows操作系统中经常使用的信息表达方式。它们表达信息直观,层次清楚,特别适用于比较复杂的结构。从典型的管理系统入手,利用PowerBuilder(后文简称PB)探讨这两类控件的编程方法。

关键词:树形控件;列表控件;管理系统;PowerBuilder

中图分类号:TP311文献标识码 A 文章编号:1009-3044(2007)16-31061-02

Easy To Use - Programming Using PB’s Tree And List Controls

HAN Yan-feng, XIA Yue-wei

(Department of Computer Engineering, Luohe Vocational and Technology College, Luohe Henan 462002, China)

Abstract:The tree and lists controls are the expression information way which is in the Windows operating system frequently uses. They express the information direct-viewing, the level is clear, specially is suitable for the quite complex structure. starts with a management system, uses PowerBuilder (article to be called PB) to discuss these two controls’ programming method.

Key words: Tree control;List control; Management system; PowerBuilder

1 引言

Windows操作系统是目前最流行的操作系统。它流行的原因除了技术层面外,易用性是它可最大、也是最吸引人的优势。可

以毫不夸张地说,现在个人电脑的广泛普及,很多一部分功劳应归功于它的推广和应用。

为了方便用户使用,Windows在界面上可以说是下足了功夫。每次操作系统的升级,易用性始终是它追求的目标之一。大量直观表达信息控件的应用就是重要的证明。

管理信息系统是目前计算机在各行各业应用中最广泛的一个重要分支。但由于各种原因,目前可见的许多管理信息系统依然使用传统的菜单驱动方式,或者是菜单加工具栏的典型应用方式。这种情况在简单的应用系统中还可以,但在比较复杂,且讲求层次要求的管理系统中却很容易让不熟悉的用户,尤其是新用户摸不着头脑:用户很容易在复杂的菜单里不知道如何下手!

我们最近在做学生学籍管理软件时,模仿Windows资源管理器外观,实现了学生“学籍管理器”。在这个软件的操作界面上,应用树形控件和列表控件作为控制和操作的主要对象,辅以快捷菜单和工具栏,大大方便了终端用户,减少了培训和学习的时间,得到了用户的好评。

下面是我们开发的“学籍管理器”主界面截图:

图1 系统主界面

学籍管理当然离不开数据库。我们选择了快速的数据库开发工具Powerbuilder。在编制过程中,在处理树形控件和列表控件时,遇到了若干问题,并经过努力得到了解决。在此写出来,与同行探讨,促进共同提高。

2 菜单、工具栏的布置

管理信息系统的一个重要特点是管理人员和被管理的数据都具有层次性。因此,对于不同的管理层,尽管系统中提供的功能(菜单项)相当大,但针对某一层(具有某些权限)的用户,其所能使用的项却是有限的。因此,在设计界面时,我们把几乎所有的功能都在菜单的“操作”项(见上图)中实现,并经过认真细致的规划,设计了相应的分组。这样,在不同权限的用户进入系统时,看到的操作项是有限的。

同时,由于菜单项的功能总是与当前用户选定的对象有关,因此,这就进一步自动限制了用户操作时所可能进行的操作。这样既避免了用户可能导致的误操作,又从外观上简化了界面的设计(当然,定位和分析对象的代码的设计量增加了,但容错的代码量却减少了)。

工具栏的设计也遵循上面的原则。但由于本系统的工具栏按钮较少,所以没有采用隐藏按钮的方式,而是采用“使某按钮可用/不可用”的方式实现。这样做的另一个好处是避免因为工具栏的隐藏/显示所导致按钮位置改变而引起的用户误操作。

3 树形控件技术

树形控件是本系统开发中除了具体功能实现过程之外,代码量最大的部分。这部分代码的核心是得到树形控件中用户选择的当前枝节点或叶子节点,并根据这个节点,依次向上追溯到它的父节点、祖父节点,直到最高层的根节点。因为这些节点都对应着一个称为句柄(handle)的数。这些句柄数是判断某节点所处层次(比如是年级节点、系部节点、专业节点还是班级节点等)和所对应对象的属性值。通过这些层次和属性值,可以决定用户当前可进行的操作(比如,只有用户焦点在专业节点上时才可对本专业的课程进行设置与修改等),也才可以将各个数据表中的数据和这些节点的属性值联系起来。下面的一段代码就用于分析当前用户选中的节点所处树形控件的层次:

这段代码是一个函数,它返回一个整数,表示句柄为handle的节点所处的级别,起始点为0,单位节点为1,年级为2,其它依此类推。

long Temp1Handle,Temp2Handle,Temp3Handle,Temp4Handle //临时句柄

if opersite=0 then return 6 //处理用户没有在树形控件中单击的情况

choose case handle

case OriginHandle //是原始节点,此变量在生成树形控件时已经保存。下面的几个与此类似

return 0

case Ancehandle //是单位名称节点

return 1

case 0 //没在有效位置上

return 6

case else

//既不是原始节点,也不是单位节点,肯定是某个具体节点

Temp1Handle=tv_tree.FindItem(ParentTreeItem! , handle) //求当前节点的父节点句柄

if Temp1Handle=AnceHandle then

//如果当前节点的父节点是单位名称节点,则当前节点是年级节点,返回2

return 2

else //继续求当前节点的祖父节点的句柄

Temp2Handle=tv_tree.FindItem(ParentTreeItem! , Temp1Handle)

if Temp2Handle=AnceHandle then

//如果当前节点的祖父节点单位名称节点,则当前节点是系部节点,返回3

return 3

else //继续求当前节点的曾祖父节点的句柄

Temp3Handle=tv_tree.FindItem(ParentTreeItem! , Temp2Handle)

if Temp3Handle=AnceHandle then //是专业节点,返回4

return 4

else //求当前节点的曾祖父的父节点的句柄

Temp4Handle=tv_tree.FindItem(ParentTreeItem! , Temp3Handle)

if Temp4Handle=AnceHandle then //是班级节点,返回5

return 5

else

return 6 //其它情况,返回6

end if

end if

end if

end if

end choose

当用户在树形控件上单击时,PB会返回一个名叫handle的句柄。这样,通过上面代码的分析,就可以得到当前节点所处的层次,这就为控制菜单和工具栏的可用/不可用提供了判断条件。

下面的一段代码用于建立一个新系(部):

sText=strformat(this.text)

//调用自定义函数,对用户输入的系(部)名进行处理

if len(sText)=0 then

messagebox("输入错误","您输入的系部名称不能空,请重新输入",stopsign!)

else

iIndex= this.finditem(sText, 1)

//在已经存在的系名列表中查找新输入的系(部)名称

if iIndex=-1 then //如果没找到,说明是新建的系部

//产生唯一的系部编号,代码略

insert into depart(departid,departname) values(:iLoop,:sText);

//添加到表中

Index=this.insertitem( sText , 1)

//在系(部)列表中添加一个表项

//更新树形控件显示,代码略

end if

end if

从这段代码可以看出,在树形控件的同一层次下,要想区分不同的对象(比如,同一系下不同的专业等),可以通过节点对象的标签进行识别。然后,通过在数据库中查找对应的标签来定位具体的对象,以调整菜单和工具栏的显示。

实际上,随着树形控件层次的增多,上面的代码会越来越复杂。比如,要在一个班级节点上单击时,需要根据这个节点所在的层次和班级的标签,一步步向上层推导,定位,才能得到当前处理的班级是那一年级、那一个系(部)、什么专业的那个班级,最后才可对这个班的情况进行处理。

4 列表控件技术

由于对树形控件已经进行了比较完善的处理,所以,相对来说,对列表控件的处理就显得简单多了。主要涉及到建立与树形控件的联系。

从上图可以看到,本来树形控制和列表控件是没有联系的。我们在这两个控件之间用了一个异形按钮(细长条),通过对这个按钮的拖动事件实现调整这两个控件宽度的功能,这样就与资源管理器的外观很相似了。(实际上这是一个分割型的窗口,但PB目前并不支持)

当然,要想做到神似,还需要做其它方面的工作。比如:

当用户在树形控件中单击一个对象时,不但要在树形视图的当前节点下面显示子节点,同时也要在列表控件中显示这些节点;

在用户单击列表控件中的对象时,根据所单击的对象,结合目前树形控件中的当前对象,就可以决定显示的菜单和工具栏中的按钮;

当用户在列表控件中双击一个对象时,会自动打开这个对象,就好像展开了树形视图的下一级(像在资源管理器中打开一层文件夹一样)。当然,在最下面一层,在资源管理器中,双击一个具体的文件时,打开或执行一个文件。而我们设计的动作是显示浏览当前学生信息的窗口。

当然,列表控件中的每个对象都设计了图标,包括大图标和小图标。具体到学生时,根据学生的性别,分别显示不同的男女头像。

5 整个界面的其它技术

就整体界面而言,由于PowerBuilder本身功能的限制,比如,不支持透明的图标、不支持单文档时的工具栏等。因此,我们还自定义一个工具栏和若干个按钮,把常用功能的按钮都放在上面,方便用户的快速定位。

6 结束语

通过整个项目的开发流程,我们学习并掌握了利用PowerBuilder开发数据库管理系统的方法和技巧,同时,也掌握了一些弥补PowerBuilder界面设计比较陈旧的方法和途径,这为以后利用它进行数据库管理信息系统设计提供了经验,更期望与同行共勉。

参考文献:

[1]何旭洪,余建英. PowerBuilder 8.0数据库系统开发实例导航[M]. 北京:人民邮电出版社, 2002.

[2]伍俊良. PowerBuilder课程设计与系统开发案例[M], 北京: 清华大学出版社, 2003.

[3]廖疆星,张艳钗,肖金秀. PowerBuilder8.0&SQL Server 2000数据库系统管理与实现[M], 北京: 冶金工业出版社, 2002.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

上一篇:Word文档中巧用制表符 下一篇:图像多描述编码的MDSQ算法及其Matlab实现