在VB中动态添加可响应消息的控件

在VB编程中,经常要根据不同的情况在运行时向窗口中添加或者删除控件,而各个控件还要响应各种事件。在一般的情况下是首先在设计时将控件加入到窗口中,在它们的各个事件中写入代码,然后将它们的Visible属性设置为False。在运行时再使控件显示出来,但是这样既不方便同时也因为在设计时在窗口中加入太多的控件而使得程序的运行速度变慢。下面我向大家介绍一种通过编程在运行时动态添加和删除控件的方法

首先建立一个工程文件,然后在Form1中加入以下的代码:

  Dim WithEvents cmdMyCommand As VB.CommandButton
   Option Explicit
   '在下面的定义中,程序定义了一个TextBox控件、一个CommandButton控件
   '和一个附加控件。
  Dim WithEvents ctlDynamic As VBControlExtender
   Dim WithEvents ctlText As VB.TextBox
   Dim WithEvents ctlCommand As VB.CommandButton
   Dim WithEvents ctlCommandDel As VB.CommandButton
   Private Sub ctlCommandDel_Click()
     Dim i As Integer
    
     '将控件的许可证信息删除
     Licenses.Remove "MSComctlLib.TreeCtrl"
     If MsgBox("是否删除所有控件", vbYesNo) = vbYes Then
     For i = 1 To Form1.Controls.Count
       Controls.Remove 0
     Next i
     End If
   End Sub
   Private Sub ctlCommand_Click()
     ctlText.Text = "你点击的是控制按钮"
   End Sub
   Private Sub ctlDynamic_ObjectEvent(Info As EventInfo)
     '当点击树形控件的某一个条目后,在ctlText中显示条目。
     If Info.Name = "Click" Then
       ctlText.Text = "你点击的条目是 " & _
           ctlDynamic.object.selecteditem.Text
     End If
   End Sub
   Private Sub Form_Load()
     Dim i As Integer
     ' 将树形控件的许可证信息加入到许可证集合中
     ' 如果许可证已经存在,则会返回错误信息732
     Licenses.Add "MSComctlLib.TreeCtrl"
     ' 在Form中动态的加入一个树形控件,如果你想树形控件建立到不同的
     '容器中,象一个Frame控件或者PictureBox控件,你只要将Controls.Add
     '函数的第三个参数改为特定的容器名就可以了
     Set ctlDynamic = Controls.Add("MSComctlLib.TreeCtrl", _
             "myctl", Form1)
     '设置树形控件的位置和尺寸
     ctlDynamic.Move 1, 1, 2500, 3500
     '在树形控件中加入10个节点
     For i = 1 To 10
       ctlDynamic.object.nodes.Add Key:="Test" & Str(i), _
           Text:="Test" & Str(i)
       ctlDynamic.object.nodes.Add Relative:="Test" & Str(i), _
           Relationship:=4, Text:="TestChild" & Str(i)
     Next i
     '使树形控件可见
     ctlDynamic.Visible = True
     '加入一个TextBox
     Set ctlText = Controls.Add("VB.TextBox", "ctlText1", Form1)
     '设置TextBox的位置和尺寸
     ctlText.Move (ctlDynamic.Left + ctlDynamic.Width + 50), _
             1, 2500, 100
     '将textBox的背景色设置为蓝色并将前景色设置为白色
     ctlText.BackColor = vbBlue
     ctlText.ForeColor = vbWhite
     '使TextBox可见
     ctlText.Visible = True
     '加入一个CommandButton
     Set ctlCommand = Controls.Add("VB.CommandButton", _
             "ctlCommand1", Form1)
     '设置CommandButton的位置和尺寸
     ctlCommand.Move (ctlDynamic.Left + ctlDynamic.Width + 50), _
             ctlText.Height + 50, 1500, 500
     '设置CommandButton的标题
     ctlCommand.Caption = "点击"
     '使CommandButton可见
     ctlCommand.Visible = True
    
     '建立一个删除按钮
     Set ctlCommandDel = Controls.Add("VB.CommandButton", _
             "ctlCommand2", Form1)
     ctlCommandDel.Move (ctlDynamic.Left + ctlDynamic.Width + 50), _
             ctlText.Height + 650, 1500, 500
     ctlCommandDel.Caption = "删除所有控件"
     ctlCommandDel.Visible = True
   End Sub

运行上面的程序,可以看到程序在窗口中加入了三个VB标准控件:一个TextBox和两个CommandButton还加入了一个扩展的ActiveX控件:树形控件。这些控件还可以响应消息, 点击树形控件中的项目或者“点击”按钮就可以在文本框中显示相应的内容。点击“删除 所有控件”按钮就可以删除加入的所有控件了。

通过上面的程序可以看到,通过WithEvents可以定义带事件相应的控件,对于标准的VB控件(例如CommandButton、TextBox等)可以通过VB.XXX来定义,其中XXX是控件的类的名称 ,而对于扩展的ActiveX控件,可以通过VBControlExtender来定义,在装载扩展控件以前, 首先要使用Licenses对象加入控件的许可证信息。

上面的程序在VB6,WIN98中文版下运行通过。

时间: 2024-10-15 23:37:06

在VB中动态添加可响应消息的控件的相关文章

在ASP.NET中动态加载内容(用户控件和模板)

asp.net|动态|加载|控件|模板 在ASP.NET中动态加载内容(用户控件和模板)要点:1. 使用Page.ParseControl2. 使用base.LoadControl第一部分:加载模板 下面是一个模板"<table width=100%><tr><td width=100% colspan=2 runat=server id=ContainerTop></td></tr><tr><td width=30%

OA系统中无法看到发送短消息的控件

问题描述 OA中用来发布消息一个Java控件editor显示不出来,只能用附件发布.

如何动态加载multiline的text控件

动态|加载|控件 我刚开始在csdn的vb论坛里看到这个帖子的时候,想了很久都没有找到解决方法.后来看zy910写到"由于Edit控件的设定(只能在创建窗口时设置风格,创建后不能修改) 所以TextBox的MultiLine屬性实现原理是:先清除原有的Edit,再创建一个新的Edit 这在设计时是可行的.但在运行时,会导致文本框相关数据的丢失,甚至会因不安全的代码导致非法操作,所以M$将TextBox的MultiLine屬性设置成运行时只读",那么通过直接使用textbox控件是无法满

在VB中动态创建数据库

在VB中动态创建数据库新建工程.添加控件 对应写上代码 以下为引用的内容:Private Sub Command2_Click()    Dim myDB As DAO.Database    'Set myDB = DAO.OpenDatabase("d:\mydb3.mdb")    Set myDB = DAO.OpenDatabase(App.Path + "/mydb.mdb")    Dim d As String    d = "delete

如何在winform中动态添加或删除控件

问题描述 如何在winform中动态添加或删除控件,多谢了 解决方案 解决方案二:本帖最后由 caozhy 于 2012-05-24 22:26:07 编辑解决方案三://添加控件TextBoxtxt=newTextBox();txt.Text="我是自动添加的";txt.Location=newPoint(10,10);this.Controls.Add(txt);//移除控件this.Controls.Remove(txt);txt.Dispose();解决方案四:privatev

html页面下拉列表中动态添加后台数据(格式化数据,显示出数据的层次感)

html页面下拉列表中动态添加后台数据(格式化数据,显示出数据的层次感) 效果图:     运行原理和技术: 当页面加载完毕,利用jquery向后台发送ajax请求,去后台拼接<select></select>中的option字符串.让后将字符串响应回来,动态添加到<select>中.其中的字符串中包含了后台的数据. 页面js代码:   1 <script type="text/javascript"> 2 //加载部门 3 functi

combox-C#或者DEV控件高手进,求助大神!呀,gridview中动态添加COMBOX后出现问题

问题描述 C#或者DEV控件高手进,求助大神!呀,gridview中动态添加COMBOX后出现问题 步骤1:我定义一个全局的COMBOX控件变量: 步骤1:我为GRIDVIEW动态添加了一列,将这一列设置我步骤1中的COMBOX: 步骤2:我为这个COMBOX添加click事件,在事件中我读取GRIDVIEW中的focusROW,读取某一列,判断该列的值来动态为COMBOX添加ITEM; 问题:在click事件中,每次都能正确的获取focusROW,也能为combox添加ITEM,但是就是COM

radio button-Android中动态添加RadioButton,设置监听获取的id不对啊!

问题描述 Android中动态添加RadioButton,设置监听获取的id不对啊! 这样获取的checkId不对啊! radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group int checkedId) { int id = (int) group.getChildAt(checkedId).getT

如何获取布局中动态添加的spinner的内容?

问题描述 如何获取布局中动态添加的spinner的内容? 现在有父布局LinearLayout id为payItemts 有子布局LinearLayout id为payItem 子布局payItem中包含一个id为accountName的spinner.一个id为payMoney的EditText 在activity中,通过有一个按钮btA,可以动态的往父布局中添加子布局,每点击一次,动态添加一个item 有一个btB,如何通过点击btB获取Activity中所有Spinner的内容?(spin