vb动态添加控件

合集下载

VB中动态创建控件

VB中动态创建控件

VB中动态创建控件VB中动态创建控件创建数据驱动窗体所谓数据驱动窗体就是根据所请求的数据的不同生成相应的窗体。

举例来讲,假设你现在有一个数据库,其中有些字段必须根据登录者的身份加以显示,授权级别高的用户可以浏览并修改这些字段的内容;授权级别一般的用户只能浏览这些字段中的数据;授权级别低的用户则不能浏览这些字段中的内容。

要做到这一点就得利用VB动态添加控件的功能。

动态创建控件无论你想要创建何种类型的数据驱动窗体,你必须知道如何在运行时动态地创建控件。

你可以通过控件数组做到这一点,但VB6的Controls集合所提供的Add方法,功能更强大,灵活性更高。

使用该方法,你不需要在设计时将控件的实例放在窗体上。

实际上,用Add 方法你甚至可以创建程序在编译时根本不存在的控件。

这种方法的用法也很简单:‘ 声明一个窗体级的变量Dim WithEvents txtTotal As TextBoxSub CreateTextbox()‘ 创建新的Textbox控件Set txtTotal = Controls.Add("VB.TextBox", "txtTotal")‘ 将控件移动到你所需要的地方txtTotal.Move 1000, 800, 1200, 300‘ 创建时,所有的控件都是不可见的txtTotal.Visible = TrueEnd Sub请注意Add方法的第二个参数:分配给控件的名称。

从代码可读性出发,这个名称一般都与变量名相同。

你可以用这个名称从Controls集合中获取相应的控件或移除该控件。

例如:Controls.Remove "txtTotal"在变量声明时加上WithEvents关键字,即使在设计时窗体不存在该控件,你也可以为该控件的事件编写代码。

上面所讲的方法只适合解决VB内置的控件。

例如,当你要添加一个TreeView控件时,VB会要求你证明你已经得到了合法的授权来创建该控件的实例。

在 VB 中动态添加和删除控件

在 VB 中动态添加和删除控件

Wi t h e x t C t l ‘ 为控T u e’ r He i g h t=2 0 0 0


、 矾d t h=2 0 0 0
. .
Ca p t i o n-I ’ 动态按钮 ”
Wi d nl =2 0 0 0 To p= 1 0 0 0 L e f t =1 0 0 0
置其属性 ,也就是说控件在设计 时已经存在 , 在程序运行过程 中只 能改变其属性 。那么 能不 能在程序运行过程 中添加 或删 除未 引用 的控件 呢? 回答是肯定 的,在程序 运行 过程 中即可以 添加所需要 的控件 , 当用完时就可删除该控件 ,
En dW i t h

E n d Su b
F o r m1 . C o n t r o l s . R e mo v e ” b t n O b j 该控件 的名 称为 b t n Ob j
E n d S u b
下:
总 之 ,通 过 Ad d方 法 和 R e mo v e方 法 可
以动 态 的添加 和删 除控件 ,使在 编程 时对 控
用是在创建程序界面时添加 ,然后根据需要设

Wi t h F o r ml ! c m d O b j 1 ‘ 为控 件设 置属
Vi s i b l e= T r u e
Ad d ( ” ms d a ag t r i d l i b . d ta a g r i d ” , _” d a ag t r i d 1 ” )
_
个控件并返 回一个对该控件 的引用 。语法如
o b j e c t . Ad d( P r o g l D, n a me , c o n t a i n e r ) 0b j e c t必 需的。一 个对象表达 式 P r o g I D 必 需 的。 一 个标 识 控 件 的 字 符

VB中mscomm控件的添加方法

VB中mscomm控件的添加方法

1.注册MSComm32控件,网上下载这个控件,然后把它拷贝到到C:\Windows\system32文件夹下,我装的是64位的Win7系统,是在C:\Windows\sysWOW64文件夹下,然后打开cmd,写入代码regsvr32 C:\Windows\system32\MSComm32.ocx然后按enter会提示你注册成功2.在对话框中添加控件:打开工具箱->右键选择选择项,等待一会会出现选择工具箱项,在COM组件下找到Microsoft communications control中的MSComm32.ocx项,勾选后添加,成功后在工具箱中就多了这么一个空间图标,可以拖进对话框中使用。

3.功能是实现串口发送出"Hello World!",串口实现自动接受串口数据。

VC++编程,新建个对话框工程,然后添加"打开串口","关闭串口","发送数据","清空数据"等按钮,接受数据可以自动实现就不用添加了,加入一个编辑框用来显示接收到的串口数据。

下面具体实现这几个功能编程:a.头文件添加#include "mscomm1.h",在对话框中拖入这个控件,右键添加事件处理,在里面编程如下:void CtestDlg::OnCommMscomm1() //CtestDlg是我对话框项目实现文件中定义的类{VARIANT input1;BYTE rxdata[2048];long len1,k;COleSafeArray safearray1;int iLineNum=m_Edit1.GetLineCount();CString strDis,strTemp;// short e=m_Com.get_CommEvent();if(iLineNum < 24){switch (m_Com.get_CommEvent()) //响应事件{case 2: //当达到阈值字符时候处理input1 = m_Com.get_Input();safearray1 = input1;len1 = safearray1.GetOneDimSize(); //返回一维参数的长度for(k = 0;k < len1;k ++)safearray1.GetElement(&k,rxdata + k);//第一个参数是开始的数组指针,第二个是存放的数组指针for(k = 0;k < len1;k ++){strTemp.Format("%02X-",rxdata[k]); //十六进制显示strDis += strTemp;m_Edit1.ReplaceSel(strDis);strDis = "";UpdateData(false);}else{m_Edit1.SetSel(0, -1);m_Edit1.Clear();}}b.打开串口按钮处理事件:void CtestDlg::OnBnClickedOpencom(){// TODO: 在此添加控件通知处理程序代码DWORD style = WS_VISIBLE | WS_CHILD; m_Com.put_CommPort(1);m_Com.put_Settings("9600,O,8,1");m_Com.put_InBufferSize(1024);m_Com.put_InBufferCount(0);m_Com.put_InputMode(1);m_Com.put_InputLen(0);m_Com.put_RThreshold(1);m_Com.put_PortOpen(1);AfxMessageBox("串口打开成功!");m_Opencom.EnableWindow(FALSE);m_Closecom.EnableWindow(TRUE);m_Edit1.EnableWindow(TRUE);}c.关闭串口按钮处理事件:void CtestDlg::OnBnClickedClosecom(){// TODO: 在此添加控件通知处理程序代码m_Com.put_PortOpen(0);AfxMessageBox("关闭串口成功!");m_Opencom.EnableWindow(TRUE);m_Closecom.EnableWindow(FALSE);m_Edit1.EnableWindow(TRUE);}d.发送数据按钮事件处理:void CtestDlg::OnBnClickedSenddata(){// TODO: 在此添加控件通知处理程序代码CString aa;aa = "Hello Word!!";m_Com.put_Output(COleVariant(aa));}e.清空数据按钮事件处理:void CtestDlg::OnBnClickedClear(){// TODO: 在此添加控件通知处理程序代码 m_Edit1.SetSel(0, -1);m_Edit1.Clear();UpdateData(false);}。

vb动态添加删除控件汇总

vb动态添加删除控件汇总

VB 动态添加删除控件汇总1. 概述在使用Visual Basic 进行程序设计的过程中,如果能在运行时刻动态地创建和删除控件,可以极大地丰富界面的处理和变化。

本人在设计网络监控系统时,需要在原理图与实物示意图间切换。

切换的过程采用本文介绍控件的动态创建和删除来实现,有效地节省了系统资源,同时也有利于简化界面的维护。

下面将就Visual Basic 6.0 中的控件在运行时刻的创建和删除的两种方法——控件数组和控件集合作详细的阐述。

2. 基于控件数组的动态控件的创建与删除vb 中的控件数组实际上也是一种数组,其中的每个控件具有相同的Name 属性,但具有不同的Index 属性,在这里Name 属性类似于数组的名字,而Index 属性类似于数组的下标同时,控件数组也支持普通VBA 数组的LBound 、UBound 和Count 方法,控件数组中的控件可以共享一个事件过程,便于代码的编写和集中处理,这正是使用控件数组的最大的理由。

但是控件数组与普通的数组并非完全一样,它不需要定义大小,只有这样我们才可以动态的扩展[kuo zhan]它。

下面给出利用Load 命令动态添加控件和Unload 命令动态删除控件的一般方法:(1)首先在窗体上放置一个TextBox ,其Name 属性设置为Text1 ,Index 属性设置为0 ,这样我们就创建了一个TextBox 控件数组,其中有一个成员。

(2)在窗体上放置一个命令按钮Command1 ,在其Click 事件中添加如下的代码:LoadText1(1)Text1(1).left=0Text1(1).visible=true(3)在窗体上放置一个命令按钮Command2 ,在其Click 事件中添加如下的代码:Unload Text1(1)(4)运行。

单击命令按钮Command1 ,窗体上会出现一个新的文本框;单击命令按钮Command2 ,窗体上刚出现的新的文本框就被删除。

vb中如何动态添加删除控件

vb中如何动态添加删除控件

vb中如何动态添加删除控件用Controls.Remove(控件) 动态删除控件。

注意:在VB中只能动态删除那些动态添加的控件;不允许删除在窗体设计器上布置的控件!示例如下:(1)创建一个VB工程(2)在Form1上布置两个Command(3)窗体代码Option Explicit' 声明要被动态添加/删除的控件Dim x As Label'-----------------------------' 动态添加一个Label控件'-----------------------------Private Sub Command1_Click()If x Is Nothing ThenSet x = Controls.Add("bel", "label1")x.Move 150, 150x.AutoSize = Truex.Caption = "这个是动态添加的标签" x.Visible = TrueEnd IfEnd Sub'-----------------' 动态删除控件'-----------------Private Sub Command2_Click()If x Is Nothing Then Exit Sub Controls.Remove xSet x = NothingEnd SubPrivate Sub Form_Load() Command1.Caption = "添加控件" Command2.Caption = "删除控件" End Sub(4)运行窗体启动点击“添加控件”按钮点击“删除控件”按钮。

动态添加控件VB

动态添加控件VB

动态添加控件VB6有一个新功能,可以动态添加控件,不用控件数组:object.Add (ProgID, name, container)参数说明Object 必需的。

一个对象表达式,其值是"应用于"列表中的一个对象。

ProgID 必需的。

一个标识控件的字符串。

大多数控件的ProgID 都可通过查看对象浏览器来决定。

控件的ProgID 是由控件的库和类组成的。

例如,CommandButton 控件的ProgID 是mandButton。

在ProgID 与对象浏览器中所显示的不一样的情况下,Visual Basic将显示一个包括正确ProgId 的错误信息。

name 必要的。

一个字符串,用来标识集合的成员。

container 可选的。

一个对象引用,它指定控件的容器。

如果没有指定或为NULL,缺省值为Controls 集合所属的容器。

通过指定该参数,可以把一个控件放置在任何现存的容器控件(如Frame 控件)中。

用户控件或ActiveX 文档也可以作为一个容器。

举例://在picture1上面添加一个commandbuttonPrivate Sub Form_Load()Form1.Controls.Add "mandButton", "cmdOk", Picture1With Form1!cmdOk.Visible = True.Width = 500.Caption = "确认(&Y)"End WithEnd Sub重点:当您添加一个未引用的需要许可证的控件到一个现存的(已部署好的)应用程序时,在使用Add 方法之前您必须也添加这个控件的许可证关键字。

在运行时添加未引用的控件:您也可以利用Add 方法来动态添加一个在工程中没有被引用的控件。

("未引用的"控件是不出现在Toolbox 中的控件)。

在VB.NET中实现动态增加控件

在VB.NET中实现动态增加控件

在VB.NET中实现动态增加控件作者:李清霞冯向科邓莹来源:《消费导刊·理论版》2007年第06期[摘要]当用户对记录表进行排序时,记录表的长度往往是不固定的;如果每一个TextBox 控件显示一条记录,则这样的TextBox的数目也是不确定的。

对于Windows窗体中的绝大多数控件来说,它们是在系统绘制窗体的同时一起被绘制了,因此它们不能被动态增加。

通过手工增加控件的方式,我们可以在窗体的任何位置添加任意大小、任意数量的任意控件,从而实现动态增加控件的效果。

[关键词]控件窗体类对象继承属性一、前言对于Windows窗体中的绝大多数控件来说,它们是随着窗体一起出现的。

例如:当Windows XP进入使用界面后,“开始”按钮就出现在整个屏幕的左下角,除非用户重新设置,否则每次都是一个按钮出现在屏幕左下角。

但也有这样的情况:在实现和用户交互工作时,系统最初可能并不清楚整个屏幕或窗体中究竟有多少个控件,具体数目取决于用户的输入值。

在这种情况下,把控件和窗体一起绘出是不可能的,这就要求程序员先绘好窗体,然后根据和用户交互工作的结果,实现在窗体中动态地绘出所需的各种控件。

一般说来,要在窗体中增加一个控件,主要完成三个方面的工作:控件的声明、控件的装载和控件的显示。

控件的声明包括用继承的方法声明控件,创建控件的实例对象等;控件的装载工作指添加控件作为母窗体的控件对象;控件的显示工作包括控制控件在窗体出现的位置、大小、显示文本和索引号等相关内容。

下面分别就三个方面进行介绍,(一)控件的声明在Microsoft Visual Basic .NET环境中,类的概念是一个非常重要的内容,在其上运行的类模块、窗体、各种控件对象等都作为一个类来处理,它们的区别已经不存在了,几乎所有的程序都是由类组成的,它们被按照不同的功能分在不同的功能类库里。

在这一点上,它和Visual Basic 6.0及其前期版本有很大区别。

VB控件教程大全

VB控件教程大全

VB控件教程大全一、Datagrid控件DataGrid1.Columns.Remove(0) '删除0号字段DataGrid1.Columns.Add(0).Caption=”姓名” '标签头DataGrod1.Columns(0).DataField=”Name” '对应的字段Adodc1.Refresh设定DataGrid格式的有用的属性:BackColor — 设定背景颜色。

Font — 设定DataGrid的字体信息。

字体信息包括使用何种字体、字号,是否粗体,斜体等。

CellPadding — 设定HTML表格中单元格内的边距。

CellSpacing — 设定HTML表格中单元格之间的间距。

Width — 设定HTML表格的宽度(可以以像素、百分比等为单位)HorizontalAlign — 设定表格在页面上的对齐方式(左对齐、右对齐、居中、未设定)一个使用上述属性而使得表格变得漂亮的例子如下所示。

请注意DataGrid的Font属性是一个对象,它指向了FontInfo类,FontInfo类包括Size, Name, Bold, Italic等属性。

为了设定Font对象所指向类的属性,必须通过连字符(-)完成。

这类似于和C#语言中表示对象属性的点(.)。

1、使用 DataGrid 控件DataGrid 控件是一种类似于电子数据表的绑定控件,可以显示一系列行和列来表示 Recordset 对象的记录和字段。

可以使用 DataGrid 来创建一个允许最终用户阅读和写入到绝大多数数据库的应用程序。

DataGrid 控件可以在设计时快速进行配置,只需少量代码或无需代码。

当在设计时设置了DataGrid 控件的DataSource 属性后,就会用数据源的记录集来自动填充该控件,以及自动设置该控件的列标头。

然后您就可以编辑该网格的列;删除、重新安排、添加列标头、或者调整任意一列的宽度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

搞了快一个下午的这个东东, 其实是在搞一个在VB6.0中动态添加控件和时间的一个实现, 没用过VB6.0, IDE也么有VS好用... 好多东东在探索结果就报了个这个错误....run-time error '91' object variable or with block variable not set查了好久, 原来是使用变量的时候, 没有去new它, 因为别人给的sample中, Dim的时候, 有new, 单身我拿过来用的时候, dim后面的new在build的时候不通过, 我就拿掉了, 结果运行的时候一直出这个问题..动态添加控件和时间的, 参考如下(等哪天我有空了,再来写)创建数据驱动窗体所谓数据驱动窗体就是根据所请求的数据的不同生成相应的窗体。

举例来讲,假设你现在有一个数据库,其中有些字段必须根据登录者的身份加以显示,授权级别高的用户可以浏览并修改这些字段的内容;授权级别一般的用户只能浏览这些字段中的数据;授权级别低的用户则不能浏览这些字段中的内容。

要做到这一点就得利用VB动态添加控件的功能。

动态创建控件无论你想要创建何种类型的数据驱动窗体,你必须知道如何在运行时动态地创建控件。

你可以通过控件数组做到这一点,但VB6的Controls集合所提供的Add方法,功能更强大,灵活性更高。

使用该方法,你不需要在设计时将控件的实例放在窗体上。

实际上,用Add方法你甚至可以创建程序在编译时根本不存在的控件。

这种方法的用法也很简单:' 声明一个窗体级的变量Dim WithEvents txtTotal As TextBoxSub CreateTextbox()' 创建新的Textbox控件Set txtTotal = Controls.Add("VB.TextBox", "txtTotal")' 将控件移动到你所需要的地方txtTotal.Move 1000, 800, 1200, 300' 创建时,所有的控件都是不可见的txtTotal.Visible = TrueEnd Sub请注意Add方法的第二个参数:分配给控件的名称。

从代码可读性出发,这个名称一般都与变量名相同。

你可以用这个名称从Controls集合中获取相应的控件或移除该控件。

例如:Controls.Remove "txtTotal"在变量声明时加上WithEvents关键字,即使在设计时窗体不存在该控件,你也可以为该控件的事件编写代码。

上面所讲的方法只适合解决VB内置的控件。

例如,当你要添加一个TreeView控件时,VB会要求你证明你已经得到了合法的授权来创建该控件的实例。

换句话说,VB要证明这个控件是买来的,而不是从其它附有该控件的程序中借来的。

要证明你经过了合法的授权有下面几种方法:在窗体上放置一个控件。

这也是最简单的方法。

你完全没有必要将这个窗体显示出来。

将相关的控件添加到工具箱中,然后在“工程属性”对话框的“生成”标签页中取消选择“删除有关未使用的ActiveX控件的信息”这一项。

向Licenses集合添加一个元素。

例如:Debug.Print Licenses.Add("MSMask.MaskedEdBox")仅仅创建了控件并不足够要创建一个数据驱动窗体,仅仅知道动态创建控件还不够。

例如:现在你要创建一个能根据数据库中表的不同字段自动生成控件的窗体。

该窗体可能会创建单行文本框,其长度随字段长度不同而不同;也可能会创建单选按钮或复选按钮以显示布尔型字段;甚至可能创建一个多行文本框显示备注型字段。

你需要解决的第一个问题是:文本框控件的Multiline属性在运行时是只读的,只在设计时可用。

幸好,微软的Microsoft Windowless Controls 6.0可以解决这个问题。

这组控件集包括了轻量级的TextBox,ComboBox,ListBox,CheckBox,OptionButton,CommandButton和两个scrollbar控件。

这些控件与VB内置的相应的控件最大的区别在于:这些控件的所有属性在运行时是可读写的。

在VB的安装光盘中的Common\Tools\VB\WinLess文件夹中可以找到这个控件组。

用下面的代码可以创建一个多行文本框:Dim WithEvents txtEditor As MSWLess.WLTextPrivate Sub CreateEditor()Set txtEditor = Controls.Add( "MSWLess.WLText", "txtEditor")txtEditor.Move 0, 0, 4000, 4000txtEditor.MultiLine = TruetxtEditor.ScrollBars = wlBothtxtEditor.Visible = TrueEnd Sub另外一个问题比较复杂:在事先不知道要创建多少个控件的情况下,如何给每个对新创建的控件的引用分配唯一的带WithEvents关键字的变量。

换句话说就是要对新创建的控件的事件进行编程,前提是你在设计时不知道程序会创建多少个控件。

使用对象数组显然不行,因为不能用WithEvents关键字声明一个对象数组;更坏的情况是,资一个变量定义为As Control或As Object也不行,因为还是不能用WithEvents。

问题源自于我们无法在运行时捕获一个对象数组事件。

所以我们只能采取曲线救国的办法。

所要的编写的代码可能比你想象的多,不过这个解决方法很有趣,值得我们这样去做。

我们需要两个辅助类模块来捕获事件,分别取名为ControlItems和ControlItem。

ControlItems是一个集合类,其中保存了ControlItem对象及其数量。

该数量等于你所要对之编程的控件的数量。

ControlItem 类的每一份实例捕获控件产生的事件,然后调用在其所属的ControlItems集合类中的过程,最后由ControlItems在窗体中触发事件并执行事件中的代码。

整个过程如下图所示:捕获多个控件的事件为简单起见,假设你要捕获来自所有的动态添加到窗体上去的控件的Validate事件。

为完成这个工作,ControlItems集合类必须向父窗体展示该事件,并随时准备接收来自其子ControlItem类的通知以触发事件。

代码如下:Event Validate(CtrlItem As ControlItem, Cancel As Boolean)Private m_ControlItems As New Collection' 向集合中添加一个新的ControlItem项目Function Add(ctrl As Control) As ControlItemDim newItem As New ControlItemnewItem.Init ctrl, Me' 添加到私有类m_ControlItems.Add newItem' 返回新项目给调用者Set Add = newItemEnd FunctionFriend Sub Notify_Validate(Item As ControlItem, Cancel As Boolean)RaiseEvent Validate(Item, Cancel)End SubControlItem类必须捕获来自动态添加到窗体中的控件的事件,并通知其所属的ControlItems集合类。

很显然,ControlItem类必须有一个用WithEvents关键字定义的变量来引用真正的控件。

这意味着你不能将变量声明为As Control或As Object。

如果你决定在窗体中所动态添加的控件不使用VB内置的控件的话,这个问题的解决办法相当的简单。

你只需要将变量声明为VBControlExtender类型就行了。

对于创建数据驱动窗体来讲,不使用VB内置的控件并不是一件大不了的事。

将变量声明为VBControlExtender,并加上WithEvents关键字,你就能直接捕获以使用ObjectEvent。

下面是ControlItem类模块中的代码:Public WithEvents Ctrl As VBControlExtender' 所属的ControlItems对象Dim m_Parent As ControlItemsSub Init(ctl As Object, parnt As ControlItems)Set Ctrl = ctlSet m_Parent = parntEnd SubPrivate Sub Ctrl_Validate(Cancel As Boolean)' 通知所属的ControlItems类m_Parent.Notify_Validate Me, CancelEnd Sub将下面的代码放入窗体中,就可以捕获动态添加的控件所产生的事件了:Dim WithEvents CtrlItems As New ControlItemsPrivate Sub cmdCreateControls_Click()Dim ctrl As Control' 创建两个文本框并将它们添加到ControlItems集合? Set ctrl = Controls.Add("MSWLess.WLText", "One")ctrl.Move 100, 200, 1000, 300ctrl.Visible = TrueCtrlItems.Add ctrl' 注意你可以使用同一个变量Set ctrl = Controls.Add("MSWLess.WLText", "Two")ctrl.Move 100, 800, 1000, 300CtrlItems.Add ctrlEnd SubPrivate Sub CtrlItems_Validate( CtrlItem As ControlItem, Cancel As Boolean)' 拒绝空字符串 - 注意如何引用控件的属? If CtrlItem.Ctrl.Text = ""Then Cancel=TrueEnd Sub现在解决了最困难的部分,要创建一个数据驱动窗体就变得简单了******************************************************************************************************************************动态添加控件VB6有一个新功能,可以动态添加控件,不用控件数组:object.Add (ProgID, name, container)参数说明Object 必需的。

相关文档
最新文档