维普资讯 http://www.cqvip.com 2007年第11期 福建 电脑 179 Vb控件数组的建立与使用 居晓琴 (南通航运职业技术学院江苏南通226010) 【摘要】:利用控件数组我们可以优化代码,本文主要介绍了在vb程序设计中不同的阶段建立控件数组的方法,我们 可以根据不同情况采用不同的方法得以实现.为vb应用程序开发提供有力的参考。 【关键词】:vb控件数组静态动态菜单 1.引言 在vb程序设计时,我们通常会用到一些控件。这些控件具 相同性质的事件过程。因此.我们可以采用将多个相同的控件定 义为一个控件数组.这个控件数组内的每一个控件都可以共享 同一程序代码。这样可以大大减少了开发人员的重复性劳动。而 且提高了程序的可读性 控件数组是由一组相同类型的控件组成的.它们共用一个 控件名且具有相同的属性:所有元素的名称(name属性1必须相 同;数组中每个控件都有唯一的索引号(index属性),即下标,数 组的大小取决于每个控件所需的内存和Windows资源.在控件 数组中索引值的范围是0-32767。和普通数组一样.控件数组的 下标也放在圆括号中,例如:conunandl(o),eommandl(1)等。 控件数组中的控件执行相同的事件过程。为了区分控件数 组中的各元素,vb把下标传递给事件过程。通过index属性来决 定数组中的相应控件所执行的操作。因此,当许多控件的代码相 同或有相似时,它们可以共享一段代码。使程序代码大大精简。 比如。我们编写一个简单的具有四则运算的计算器程序。我们就 谈程序的界面上有0到9十个简单数字按钮.按下每个数字时 都是使数字显示在文本框中。如果不使用控件数组。则需要十组 相似的代码,而利用控件数组将下个按钮都取名为commandl。 索引从0到9,即eommandl(o1一eommandl(9),每一个按钮的单击 事件将共享如下代码.即可以简单的实现将数字显示在文本框 内的功能 Sub eommandleliek(index as integer) _2)修改每个控件的name(名称)属性,使之相同,当修改第二 个控件的nanle属性时。系统显示一个对话框。询问是否创建控 件数组.此时只需要选”是”即可。 需要注意的是:vb能自动把第一个控件的index属性设置 为0.其后每个控件元素的 index属性按其加入的顺序自动设 置。方法二建立控件数组时。所添加的控件元素仅name属性与 其他元素相同。其余属性不变。 通过以上两种方法我们可以很方便的建立控件数组.采用 动态方式建立控件数组。使程序的编写更加灵活。而且避免不必 要的内存浪费。下面我们就来讨论一下如何动态建立控件数组 (2)执行阶段建立控件数组 为了避免内存的浪费常采用动态建立控件数组.就是在程 序模块(module)P ̄。先声明一个空的控件数组,等到要使用该控 件数组时。再重新声明要使用的控件数组元素或数目。控件数组 可以动态生成和释放,控件数组对属性也具有相同控制。动态生 成和释放控件数组是在运行时.用Load和Unload语句加载和 卸载控件数组中的控件。 1)控件的加载 使用Load语句加载控件。 ad语句的语法为: ad objeet, 其中。Object指的是要加载的控件数组元素的名称。如:在窗体 上添加一个label控件,名称为hbel1。将其index属性设为0.并 在窗体上添加一个commandbutton,在其click事件中编程.具体 如下: Private Sub CommandlCliekO _Text1.text=text1.text+str¥index) End sub 现在不论单击哪个按钮。都会调用这个事件过程。按钮的 Lad olabell(11 加载控件实例 Labell(1).1eft=labellfo1.1eft+800 设置控件位置 Labell(1).Visible=True 显示加载的控件 End sub index将传递给过程,由它指明单击了哪个按钮。 2.控件数组的建立 通常建立控件数组方法有两种:第一种是在设计阶段建立 控件数组,控件数组的大小是固定的,属于静态方式;另一种是 在执行阶段建立控件数组。即在程序执行时建立。允许用户在运 行期间动态地加入或删除控件。属于动态方式。 (1)设计阶段建立控件数组 控件数组的每个元素都是控件.它的定义方式与普通数组 不同,可以按以下两种方法来建立控件数组。 方法一:复制已有的控件并将其粘贴到窗体上。 操作步骤: 11在窗体上添加一个控件.并选定该控件。 2)选择”编辑”菜单中的”复制”命令。系统会询问是否建立 控件数组 3)单击”是”按钮。窗体左上角会出现一个控件,这就是控件 数组的第二个元素 4)继续粘贴。直到建成所需要的控件数组。 方法二:将窗体上已有的类型相同的多个控件的name( ̄g 称)Yg性设置为同一个值。 操作步骤: l 在窗体上幂加同一类型的多个控件。 运行程序单击eommandl按钮.则在窗体上会出现第二个 label控件。 21控件的卸载 使用Unload语句卸载控件。Unload语句的语法为:Unload objeer。我们再在窗体上添加一个命令按钮command2来卸载上 面加载的控件.对command2的单击可件进行编程如下: Private Sub CommandlCliekO _Unload label1(1) End sub 运行程序单击command2按钮.则刚加载在窗体上的第二 个label对象会消失。 值得注意的是: ad命令创建的label对象Visible属性默 认为False.所以必须在Load方法执行之后,添加将其Visible属 性设置为-IIⅢe的语句。也就是说。动态创建的控件数组对象,除 isible属性和index属性外.其余属性都与直接添加的第一个控 件对象完全相同。另外,Unload命令只能删除用load命令动态 加载的控件。 因此.当我们在应用程序中遇到某控件实例的具体数目不 确定的情况。就可以采用此方法加载和卸载控件,继而直接对动 态加载的控件编程。 (下转第173页) 维普资讯 http://www.cqvip.com 2007年第11期 福建 电脑 173 < 'eans> MVC中的模型值。 这样我们就可以在主程序中通过AppheafionC ̄Intext对象的 下面我们来实现视图部分,这里我们用标签表示视图,即用 getBean0方法来获取受Spring配置和管理的JavaBean。具体演 标签来显示模型的值。 示程序如EventsTestdava所示.程序中所用到的三个Bean互不 public class IntEvent1.a ̄l extends JLabd implements ApplieationListener{ public void onApplicationEvent(ApplieationEvent eveu01 了解.事件的发布和监听完全由ApplieationContext控制.甚至增 if(event imtanceof lntEvent){IntEvent intEvt=0ntEvent)event; 加和减少控制器也可  ̄tText(’ +intEvt.getValue0);}}} 该设计的关键之处在于使受关注的类借助于Spring框架 由于视图只是根据模型值的变化进行更新显示.所以我们 AppHcationContext的事件发布和监听功能进行控制.同时我们 将它定义为事件的监听者。只需要实现接El ApplieationListener ext中,因为 中的方法:onApplieationEvent0I ̄p 。一有事件触发,Spring框架 也无需要将事件的监听者注册到Ap eagonContSpring框架会自动获得其关联。 就会调用该方法。 控制器我们准备用JSlider和JfrextField来实现。它们要作 4.总结 MVC编程模式无论是在独立的应用程序还是在Web应用 为事件的发布者.需要拥有ApplieafionContext对象,所以要实现 程序中,覆盖面都很广。其实在传统的Jaya独立应用程序设计 接口AppHeaifonContextAware。当数值改变时,就将新数值包装 ava.util包中的Observable类和Observer 成AppheationEvent发布出去。同时它们也要作为视图,所以也 中,我们可以通过使用i也可以使用iava.beans包中的PmpertyChangeSupport类和 要实现接El AppheafionIA ̄ener来监听事件.当通过另外的控制 接El,ngeListener接口来实现MVC编程模式 本文则是通 器改变模型值时.该AppGeafionEvent事件的监听者本身也要获 Pmpe ̄yCha过使用Spring框架ApplieationEvent的发布和监听功能来完成 取新的模型值.更改自身的显示结果。如IntEventSlider的实现 的.这说明Spring框架的某些功能不全只能用在Web应用程序 为: 中。当然这里使用SpIiIlg框架的好处是减少产生事件的组件与 public dass IntEventSlider ex【ends JSlider implements ApplieationCon- textAware,A ppllcationListener{ 事件发布者(这里是Spring框架)的耦合。另外虽然理论上受 private ApplicationContext ctx; Spring框架配置和管理的Bean要求符合JavaBean的规范.实际 private void publish(int value){ct】【.publishEvent(new lntgvent(this,value));] 上普通的Java类也是可以的.这说明用Spring也可以配置普通 public void setApplicatlonC,orttext(ApplicafionConmxt applicationContext) throws BeansExeeption{etx=applicationContext;} 的Java应用程序。在用JDK执行时.一定要在elasspath路径属 public void onAppllcationEvent(ApplicationEvent event){ 性中指定出spring.jar(Spring框架开发包)、commons-logging— fi(event instanceof lntEven0{lntEvent intEvt=Ontgvent)event; apijar(在Apache Tomcat安装目录下bin子目录中)文件的存放 setValue(intEvt.getValue0);}} 路径,本文的JDK版本为idk一1_5 O 4,Tomcat服务器的版本 public lntgventSliderO{ 8uperO;a ̄ChangeListnere(new CbangeListeaer0{public void stateChanged(ChangeEvent event){ publish(getValue0);I1).1】 为Apache Tomcat 5.5.17 Server。 参考文献: 另一个控制器的实现如IntEventTextField.java所示。由于 ob Harrop,Jan Machacer(美)著,B.edsaga翻译小组译.Spring专业开 Spring框架是通过xml文件来进行Beans的配置和加载.上面所 1.B.定义的三个Beans的配置结果为:  ̄eans> 曲∞n id=”intEventLa ̄l”clas, ̄”IntEventLabel”/> <bean id=”intEventSlider“class=”IntEyentSlider’V> 发指南IMI.北京:电子工业出版社.2006 出版社.2006 2.孟劭编著.精通Sp血g-Java轻量级榘构开发实践【M】.北京:人民邮电 3.Cay s.Horstmann、Gary Comcll( ̄)著,王建华、董志敏等译.Tava 2棱心 技术卷II:高级性能(第五版)【M】.北京:机械工业出版社,2003 <bean id=”intEven【TextField”class=”IntEven【TextField”/> (上接第179页) 3.控件数组的特例:菜单数组 菜单数组是控件数组的一种特殊的形式.菜单数组是由一 个或多个菜单项组成,这些菜单项共享同~事件过程和一个公 用的名称,每个菜单项具有唯一的索引(ndex)。其应用比较广 i泛.例如在ofl ̄ce系列软件中,”文件”菜单下能自动添加并改变 菜单项,用以保存最近几次调用过的文件名。每当用户打开一个 新的文件或新建一文件并且保存过了.则都将在”文件菜单的最 下面增加一个新的菜单项.该菜单项的标题就是刚刚所打开文 件的文件名。下一次打开该软件.仍会见到最近打开的文件名的 菜单项.当选择该菜单项时,该文件将被再一次打开。 通常.创建具有多个菜单项数组的步骤如下: f1)在欲创建菜单的窗体上,点击右键,在弹出式菜单中选 中”菜单编辑器”:或打开”工具”菜单.选取”菜单编辑器”菜单 项;或在”工具栏”上单击”菜单编辑器”按钮。激活”菜单编辑 称与上一个菜单项的相同,但须把它的”索引”设置为1。 (6)类似(5),继续创建多个菜单项,菜单项名称与(41相同,索 引依次增加,便建立起了菜单控件数组。 我们可以看出.一个菜单控件数组中的菜单项必须是同一 级菜单。动态添加和删除菜单项的方法也是使用 ad和Unload 方法,只是默认情况下其Visible属性是True,而且不用重新设 置相应的位置。Unload与unload的使用方法同一般的控件数 组。 VisualBasic处理菜单数组的方法与一般控件数组也是一样 的。当数组中的某个菜单项响应一个事件后.同样.VisualBasic 就从数组中调用相应的事件过程.并将菜单项的索引值作为参 数传递给过程。使程序能判断出是哪个菜单项响应这个事件。 4.结束语 在vb程序设计中.我们使用控件数组技术,可以更好地满足 器”。 实际应用的需要。大大简化程序代码的编写,而动态增减控件可 f31创建主菜单项。在”菜单编辑器”的”标题”和名称”文本框 以开发出具有动态风格的应用程序.使得程序编写更灵活.通过 中.分别键人所建菜单的标题的文本和名称,并保持其菜单的” 及时的分配和回收内存,有效的节省了系统资源。 索引”框是空的 (41点击右箭头”—>”按钮,设置该菜单项为一级子菜单,继续 参考文献: mlbasic 6.0程序设计教程・南京:东南大学出版社。2005 通过设置”标题”和”名称”.创建菜单数组中第一个元素的菜单 1.姜卫东vis2.齐锋北京:中国铁道出版社。2002 项.把该菜单项的”索引”设置为0。 f5)重复f4),在相同的一级子菜单上创建第二个菜单项,其名