vb动态添加删除控件汇总_第1页
vb动态添加删除控件汇总_第2页
vb动态添加删除控件汇总_第3页
vb动态添加删除控件汇总_第4页
vb动态添加删除控件汇总_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、VB 动态添加删除控件汇总1. 概述 在使用 Visual Basic 进行程序设计的过 程中,如果能在运行时刻动态地创建和删除控件,可以极大 地丰富界面的处理和变化。本人在设计网络监控系统时,需 要在原理图与实物示意图间切换。切换的过程采用本文介绍 控件的动态创建和删除来实现,有效地节省了系统资源,同 时也有利于简化界面的维护。下面将就Visual Basic 6.0 中的控件在运行时刻的创建和删除的两种方法控件数组 和控件集合作详细的阐述。 2. 基于控件数组的动态控件 的创建与删除 vb 中的控件数组实际上也是一种数组,其 中的每个控件具有相同的 Name 属性, 但具有不同的 Inde

2、x 属性,在这里 Name 属性类似于数组的名字,而 Index 属 性类似于数组的下标同时,控件数组也支持普通 VBA 数组 的 LBound 、 UBound 和 Count 方法,控件数组中的控 件可以共享一个事件过程,便于代码的编写和集中处理,这 正是使用控件数组的最大的理由。但是控件数组与普通的数 组并非完全一样,它不需要定义大小,只有这样我们才可以 动态的扩展 kuo zhan 它。下面给出利用 Load 命令动态添加 控件和 Unload 命令动态删除控件的一般方法: ( 1) 首先在窗体上放置一个 TextBox ,其 Name 属性设置为 Text1 , Index 属性设置

3、为 0 ,这样我们就创建了一个TextBox 控件数组, 其中有一个成员。( 2)在窗体上放置一个命令按钮 Command1 ,在其 Click 事件中添加如下的代码: Load Text1(1)Text1(1).left=0Text1(1).visible=true ( 3) 在窗体上放置一个命令按钮 Command2 ,在其 Click 事件 中添加如下的代码: Unload Text1(1) ( 4)运行。单击命令按钮 Command1 ,窗体上会出现一个新的文 本框;单击命令按钮 Command2 ,窗体上刚出现的新的文 本框就被删除。需要注意的是: Load 命令创建的控件 Text

4、1(1) 与设计时已经放在窗体上的控件 Text1(0) 有完全 相同的属性,也包括大小和位置等属性,例外的就是 Index 属性不一样, Visible 属性默认为 False, 所以必须在 Load 方法执行之后,执行调整控件位置的语句 yu ju ,并把其 Visible 属性设置为 True ,以便在窗体上可见。 Unload 命 令只能删除动态加载的控件,若删除设计时创建的控件会产 生错误 cuo wu 。另外,利用上面提到的数组的一些方法, 可以有效的简化代码的编写。以下的代码可以删除所有动态 创建的 Text1 控件数组中的控件 : Do While Text1.Count>

5、;1Unload Text1(Text1.Ubound)Loop 需要说明 shuo ming 的是,菜单数组是控件数组的一种特殊的形式, 只是它是在菜单编辑器 bian ji qi 中设置相应的 Name 和 Index 属性,而且要求一个菜单控件数组中的菜单项必须是同一级菜单,但是不能创建新的顶级菜单。而动态创建和删 除菜单项的方法也使用 Load 和 Unload 方法,只是默认情 况下其 Visible 属性是 True, 而且不用重新设置相应的位 置。 3. 基于控件集合的动态控件的创建与删除 VB 中提供一个 Controls 集合,用以包含当前窗体中的所有的控 件,这对于实现一些

6、功能相对复杂的操作相当有好处。而且 Controls 集合也是集合的一种, 它支持一般集合的 Count 等 方法和相应的检索jian suo机制ji zhi。以下两例就是利用 这个控件集合的巧妙实现。要清空当前窗体上的所有的文本 框,可以如下实现: Dim Ctl as ControlFor Each Ctl in ControlsIf Typeof Ctl is Textbox thenCtl.Text=”EndifNextCtl 也可以利用集合的 Count 方法如下实现: For i=0 To Controls.Count-1If Typeof Ctl is TextBoxContro

7、ls(i).Text= ” EndifNext i 当然,控件集合毕竟是一种特殊的集合,下面给 出利用 Add 方法动态添加控件, Remove 方法动态删除控 件的一般方法: (1)Controls 集合的 Add方法其语法 yu fa 格式为: Set mycontrol = controld.Add(ProgId, Name, Container) 在这里, mycontrol 是一个自定义的控件对象,若需要新创建的控件对事件做出 反应,还要再定义该对象时增加 WithEvents 关键字 ProgId 是库名 . 控件名形式的控件类的名字, ToolBox 中的控件般具有类似于 VB.

8、CommandButton 这样的形式。而 Active X 控件的形式则有所差别,比如若使用 Windowless 控件库中的控件一般具有类似于 MsWless.WlText 的形式。 Name 参数是想赋给控件的名字,与控件的 Name 属性相 对应。 Container 参数是可选的, 它代表欲放置控件的容器, 默认情况下是放置在窗体上。下例是在窗体上动态创建一个 命令按钮,然后单击命令按钮时,执行相应的动作: Dim WithEvents mycontrol As CommandButtonPrivate Sub Form_Load()Set mycontrol = Controls.

9、Add(VB.commandbutton, mycontrol)mycontrol.Left = 0mycontrol.Caption = mymycontrol.Visible = TrueEnd SubPrivate Sub mycontrol_click()MsgBox You click me!, vbExclamationEnd Sub 需要注意,动态创建的控件必须指定相应的属性,而且 在默认情况下,其 Visible 属性是 False 。(2) Controls 集合的 Remove 方法利用 Controls 集合的 Remove 方法可以删除用 Add 方法动态创建的控件。其

10、语 法 yu fa 格式为: Controls.Remove “ 控件名 ”比如以 上创建的 mycontrol 要删除可以使用如下的命令: Controls.Remove mycontrol 同样应该注意, 不能删除一个不 存在或者在设计时创建的控件。 4. Active X 控件的动态 创建和删除 以上论述的方法适合于控件在应用程序 ying yong cheng xu 工具箱( TOOLBOX )中的情况, 而 Active X 控件一般在应用程序 ying yong cheng xu 运行机器上, 但 没有在工具箱中,这种情况则需要先进行注册,方法是利用 Regsvr32 在 Wind

11、ows 环境中注册,或者在 VB 代码中进 行注册,方法如下: Shell(Systempath “ regsvr32.exe /s /I MyControlName, vbHide) 其中 Systempath 是 Regsvr32.exe 所在的路径, MyControlName 是控件名 字(包括路径)若要撤销,可以如下操作: Shell(Systempath “ regsvr32.exe /s /U MyControlName, vbHide) 下面讨论注册但是未出现在工具箱( TOOLBOX )中的 Active X 控件的情况,这其中也包括 VB 自带的一些 Active X 控件

12、的使用。具体的方法就是利用 VBControlExtender 对象。 VBControlExtender 对象与 EventInfo 相结合能提供事件陷井捕捉,它提供了一套通用 的属性、方法、事件给开发人员,它的一个突出特点是能编 程设计控件的事件,声明时若使用 WithEvents 关键字,则 会有个特殊的事件 ObjectEvent(Info As EventInfo) ,它能捕 捉到对象使用 RaiseEvent 产生的所有事件, EventInfo 数 据结构 jie goushu ju jie gou 映射 ying she 了事件的名称、 参数个数和参数的值。 VBControl

13、Extender 和 EventInfo 相结合,采用 Select Case 就可以预先将不同类对象的事件 放置一起,各自独立 du li 运作。下面的例子是使用未在工 具箱( TOOLBOX )中出现的 RichTextBox 的方法,其他 的 Active X 控件的使用方法与此类似: Dim WithEvents myControl As VBControlExtenderPrivate Sub Form_Load()Licenses.Add RichText.RichTextctrl.1Set myControl = Controls.Add(RichText.RichTextctr

14、l.1, mycontrol)myControl.Left = 0myControl.Visible = TrueEnd SubPrivate Sub myControl_ObjectEvent(Info As EventInfo)Select Case Info.NameCase MouseDownMsgBox mousedownCase Else 其他事件 End SelectEnd Sub 需要 注意, Licenses.Add RichText.RichTextctrl.1 是响应 xiang ying 控件的对象编号在 VB 中的注册,若此控件已经出现 在工具箱 ( TOOLBOX

15、)中,则会出错。 另外,若 Active X 控件已经出现在 TOOLBOX 中,需要动态建立控件,则应 该作如下的处理:首先去掉 Licenses.Add RichText.RichTextctrl.1 这一句,然后,在“工程属性窗口 chuang kou ”的“ Make ” 页面下, 确保 que bao“ remove information about unused ActiveX controls ”不被选中即可。 还有,若 Active X 控件已经出现在 TOOLBOX 中,需要动 态建立控件,还可以用类似于前面介绍的控件集合的方法, 比如上面示范的 RichTextBox 的

16、例子还可以如下实现 (只是 这种方法不再支持 ObjectEvent 事件): Dim WithEvents myControl As RichTextLib.RichTextBoxPrivate Sub Form_Load()Set myControl =Controls.Add(RichText.RichTextctrl.1, mycontrol)myControl.Left = 0myControl.Visible = TrueEnd SubPrivate Sub myControl_Click()MsgBox clickEnd Sub 5 结束语 通过以上对 Visual Basic

17、中的控件动态建立和删 除进行了讨论,我们了解到控件数组 适 合于应用程序 ying yong cheng xu 中需要该控件,但需要控件实例的具体 数量不定的情况;而控件集合则适合于为了完成不同的任务 ren wu ,制作了多个不同功能的控件, 在特定条件 tiao jian 下只需要一个或几个控件的情况对于 Active X 控件,若没 有添加到 VB 工具箱中,当应用程序 ying yong cheng xu 执 行时,可以根据需要由程序自动加载或者删除。总之,合理 地选择 xuan ze 使用以上的各种方法,对于提高编程的效率 和代码的运行效率都是大有裨益的。以上有关的代码都已在 Win

18、dows 2000 Professional 和 Visual Basic 6.0 企业版环 境下测试通过。/oooooooooooooooooooooooooooooooooooooooooooooooooo oooo 以下是完整的测试代码 2011-1-21 BYZHJ/oooooooooooooooooooooooooooooooooooooooooooooo ooooooooOption ExplicitDim WithEvents mycontrol As CommandButton 这句要放在全局定义 Dim x1, y1Private Sub Command1_Click() I

19、f isControlExists(mycontrol) =True Then: Exit Sub Set mycontrol =WithControls.Add(VB.commandButton, mycontrol)mycontrol.Caption = 可以拖动我看看!.Left = 100.Width = 3000.Visible= TrueEnd WithEnd SubPrivate Sub Command2_Click()If isControlExists(mycontrol) = False Then: Exit Sub Controls.Remove mycontrolEnd

20、 SubPrivate Sub Command3_Click() mycontrol_ClickEnd SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)Me.Caption = X & , &YEnd SubPrivate Sub mycontrol_Click() Dim obj As Object Dim strFor Each obj In Controlsstr =str & vbCrLf & obj.Name Next If isControlExists(mycontrol) = True Then MsgBox str, , 你点击了我! ElseMsgBox str, , 控件已删除! End IfEnd Sub/ 自定义函数,判断控件是否存在 Function isControlE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论