VB中动态创建控件
- 格式:doc
- 大小:60.50 KB
- 文档页数:8
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动态添加控件的功能。
动态创建控件无论你想要创建何种类型的数据驱动窗体,你必须知道如何在运行时动态地创建控件。
你可以通过控件数组做到这一点,但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语言是一种面向对象的编程语言,可用于开发图形用户界面(GUI)应用程序。
在VB中,可以通过编写自定义控件来增强应用程序的功能。
本文将介绍如何使用VB实现自我注册控件。
1.创建自定义控件:首先,需要创建一个新的VB项目,并添加一个新的用户控件。
可以通过以下步骤完成:-在"解决方案资源管理器"窗口中,右键单击项目名称,选择"添加"->"新建项"。
-在弹出的对话框中选择"用户控件",并指定一个名称,然后点击"添加"按钮。
-在设计视图中,可以向控件添加所需的控件和代码,以满足应用程序的需求。
2.实现自我注册功能:自我注册是指在用户控件中编写代码来自动将控件注册到工具箱中,以便在其他项目中重复使用。
可以通过以下步骤实现自我注册功能:- 使用`ToolboxItem(true)`属性标记自定义控件类,使之能够在工具箱中显示。
- 编写一个自定义的设计器类,并使用`Designer`属性将其与自定义控件类关联。
-在用户控件的代码视图中,增加以下代码:```vb<ToolboxItem(True)><Designer(GetType(CustomControlDesigner))>Public Class CustomControl'控件的代码和属性'控件的构造函数和事件处理方法End ClassPublic Class CustomControlDesignerInherits System.Windows.Forms.Design.ControlDesignerDim svc As ITypeResolutionService =CType(Me.GetService(GetType(ITypeResolutionService)), ITypeResolutionService)svc.ReferenceAssembly(System.Reflection.Assembly.GetExecutin gAssembly(.Location)Dim typeName As String = Me.GetType(.Namespace & "." & Me.GetType(.Name.Substring(0, Me.GetType(.Name.Length - "Designer".Length)Dim type As Type = svc.GetType(typeName)If (type IsNot Nothing) ThenDim host As IDesignerHost =CType(Me.GetService(GetType(IDesignerHost)), IDesignerHost) Dim tp As ToolboxItem = New ToolboxItem(type.FullName)Dim tlh As System.Drawing.Design.ToolboxItemCreatorCallback = New System.Drawing.Design.ToolboxItemCreatorCallback(AddressOf CreateInstance)type.Assembly.GetCustomAttributes(GetType(ToolboxItemAttribu te), False)HosttoolboxService.AddCreator(tlh, tp)End IfEnd SubPrivate Function CreateInstance(ByVal serializedObject As icContainer, ByVal reportedError As String) As Object Return cf.CreateInstance(serializedObject, reportedError)End FunctionEnd Class```通过以上步骤,自定义控件将被自动注册到工具箱中,并可以在其他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中如何动态添加删除控件用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.NET中实现动态增加控件作者:李清霞冯向科邓莹来源:《消费导刊·理论版》2007年第06期[摘要]当用户对记录表进行排序时,记录表的长度往往是不固定的;如果每一个TextBox 控件显示一条记录,则这样的TextBox的数目也是不确定的。
对于Windows窗体中的绝大多数控件来说,它们是在系统绘制窗体的同时一起被绘制了,因此它们不能被动态增加。
通过手工增加控件的方式,我们可以在窗体的任何位置添加任意大小、任意数量的任意控件,从而实现动态增加控件的效果。
[关键词]控件窗体类对象继承属性一、前言对于Windows窗体中的绝大多数控件来说,它们是随着窗体一起出现的。
例如:当Windows XP进入使用界面后,“开始”按钮就出现在整个屏幕的左下角,除非用户重新设置,否则每次都是一个按钮出现在屏幕左下角。
但也有这样的情况:在实现和用户交互工作时,系统最初可能并不清楚整个屏幕或窗体中究竟有多少个控件,具体数目取决于用户的输入值。
在这种情况下,把控件和窗体一起绘出是不可能的,这就要求程序员先绘好窗体,然后根据和用户交互工作的结果,实现在窗体中动态地绘出所需的各种控件。
一般说来,要在窗体中增加一个控件,主要完成三个方面的工作:控件的声明、控件的装载和控件的显示。
控件的声明包括用继承的方法声明控件,创建控件的实例对象等;控件的装载工作指添加控件作为母窗体的控件对象;控件的显示工作包括控制控件在窗体出现的位置、大小、显示文本和索引号等相关内容。
下面分别就三个方面进行介绍,(一)控件的声明在Microsoft Visual Basic .NET环境中,类的概念是一个非常重要的内容,在其上运行的类模块、窗体、各种控件对象等都作为一个类来处理,它们的区别已经不存在了,几乎所有的程序都是由类组成的,它们被按照不同的功能分在不同的功能类库里。
在这一点上,它和Visual Basic 6.0及其前期版本有很大区别。
VB动态添加控件并对其进行拖放操作改变位置用Controls.Add添加控件Dim WithEvents mypic As PictureBoxPrivate Sub Command1_Click()Set mypic = Controls.Add("VB.PictureBox", "mypic")mypic.Left = 50mypic.Top = 50mypic.Visible = TrueEnd Sub至于拖放操作,在程序中设置好mypic控件的有关属性后,处理mypic的有关事件即可注意:如果是控件数组的话,建议采用:load 控件数组名(索引) 的方法添加控件'可先手工画一个控件,Visable设置为False,Index设置为0'若需要多个就用load object(index)来加载,并把它们的visable设置为true;不需要多个就真接把原有的那个的visable设成显示就行了。
Private Declare Function ReleaseCapture Lib "user32" () As LongPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _ByVal hwnd As Long, ByVal wMsg As Long, _ByVal wParam As Long, lParam As Any) As LongPrivate Sub Command1_MouseDown(Index As Integer, Button As Integer, _Shift As Integer, X As Single, Y As Single)If Button = 1 ThenReleaseCapture '移动控件SendMessage Command1(Index).hwnd, &HA1, 2, 0&End IfEnd SubPrivate Sub Form_Click()On Error GoTo endsubFor i = 1 To 5Load Command1(i) '生成控件Command1(i).Top = Command1(i - 1).TopCommand1(i).Left = Command1(i - 1).Left + Command1(i -1).WidthCommand1(i).Visible = TrueNextExit SubEnd Sub‘例如:添加一个commandbuttonPrivate Sub Form_Load()Form1.Controls.Add "mandButton", "cmdOk", Picture1 With Form1!cmdOk.Visible = True.Width = 500.Caption = "确认(&Y)"End WithEnd Sub‘删除控件Form1.Controls.Remove "ctl1" ctl1为控件名。
ExcelVBA在工作表(Worksheet)中动态添加按钮控件并添加事件的示例Sub MakeButton()'自动添加一个Sheet'动态生成一个按钮控件'动态生成事件'Dim WSheet As WorksheetDim MyNewbtn As OLEObjectDim Target As RangeDim ShtCodeName As StringSet WSheet = Worksheets.Add(After:=ActiveSheet)' = "新表"Set Target = Cells(15, 7)'Set MyNewbtn = WSheet.OLEObjects.Add(ClassType:="mandButton.1 ", Link:=False _, DisplayAsIcon:=False, Left:=Target.Left, Top:=Target.Top, Width:=92.25, Height:= _30) = "MyNewButton" '设置按钮名MyNewbtn.Object.Caption = "我的按钮" '设置按钮标题ShtCodeName = WSheet.CodeName'也可以是'ShtCodeName = ThisWorkbook.Worksheets("新表").CodeName''向新表中添加事件'注意:'1、添加事情的程序名一定要与添加的按钮名称对应'2、如果出现"不信任到Visual Basic Project 的程序连接"的错误,解决方法为:' 打开Excel-》工具-》宏-》安全性-》可靠发行商,选中“信任对于Visiual Basic 项目的访问”,按确定即可。
控件的基本操作控件是指在用户界面中用来接收用户输入或显示输出信息的各种组件,如按钮、文本框、下拉列表等。
掌握控件的基本操作是进行界面设计和编程的必备技能之一。
本文将从创建、设置属性、事件处理等方面介绍控件的基本操作。
一、创建控件1. 在窗体上添加控件:在Visual Studio中,打开窗体设计器,选择工具箱中需要添加的控件,然后在窗体上单击鼠标左键即可添加。
2. 动态创建控件:在代码中使用语句创建控件对象,并设置其属性和事件处理程序。
二、设置属性1. 常见属性:包括位置(Location)、大小(Size)、文本(Text)、可见性(Visible)等。
2. 属性设置方法:可以通过设计器中的属性窗格或代码中使用点号引用属性名称的方式进行设置。
三、事件处理1. 常见事件:包括单击(Click)、双击(DoubleClick)、键盘按下(KeyDown)等。
2. 事件处理方法:可以通过设计器中的事件窗格或代码中使用“+=”符号订阅事件处理程序。
四、常用控件操作1. 按钮(Button):① 单击事件处理程序:private void button1_Click(object sender, EventArgs e){//执行操作}② 设置文本:button1.Text = "确定";2. 文本框(TextBox):① 获取文本:string text = textBox1.Text;② 设置文本:textBox1.Text = "请输入内容";3. 下拉列表(ComboBox):① 添加选项:comboBox1.Items.Add("选项一");② 获取选中项:string selected = comboBox1.SelectedItem.ToString();4. 复选框(CheckBox):① 获取状态:bool isChecked = checkBox1.Checked;② 设置状态:checkBox1.Checked = true;五、小结控件的基本操作包括创建、设置属性和事件处理等方面,掌握这些操作是进行界面设计和编程的必备技能之一。
vb6中如何动态添加控件vb6中可以动态添加控件,不用控件数组:object.add (progid, name, container)参数说明:object:必需。
一个对象表达式,其值是“应用于”列表中的一个对象。
progid:必需。
一个标识控件的字符串。
大多数控件的 progid 都可通过查看对象浏览器来决定。
控件的 progid 是由控件的库和类组成的。
例如,commandbutton 控件的 progid 是mandbutton。
在progid 与对象浏览器中所显示的不一样的情况下,visual basic 将显示一个包括正确 progid 的错误信息。
name:必要。
一个字符串,用来标识集合的成员。
container:可选。
一个对象引用,它指定控件的容器。
如果没有指定或为null,缺省值为controls 集合所属的容器。
通过指定该参数,可以把一个控件放置在任何现存的容器控件(如frame 控件)中。
用户控件或 activex 文档也可以作为一个容器。
举例:(在picture1上面添加一个commandbutton)private sub form_load()form1.controls.add "mandbutton", "cmdok", picture1with form1!cmdok.visible = true.width = 500.caption = "确认(&y)"end withend sub重点:当您添加一个未引用的需要许可证的控件到一个现存的(已部署好的)应用程序时,在使用 add 方法之前您必须也添加这个控件的许可证关键字。
在运行时添加未引用的控件您也可以利用 add 方法来动态添加一个在工程中没有被引用的控件。
(“未引用的”控件是不出现在 toolbox 中的控件)。
为此,您必须也把控件的license 关键字添加到 licenses 集合中。
vbgif控件及实例VBGIF控件是一种用于在VB环境中处理GIF图片格式的控件。
通过VBGIF控件,开发人员可以读取、展示、编辑和保存GIF图片,为用户提供更丰富、生动的显示效果。
本文将介绍VBGIF控件的基本原理与使用方法,并提供一个实例来演示如何使用VBGIF控件进行图片处理。
一、VBGIF控件的原理VBGIF控件是基于Visual Basic(VB)环境的一个ActiveX控件,它实现了对GIF图片格式的读取、显示与编辑功能。
GIF (Graphics Interchange Format)是一种常用的动态图像格式,由于能够保存多帧动画,因此非常适合用于实现动态效果。
VBGIF控件的原理包括以下几个核心部分:1、GIF文件解析:VBGIF控件能够解析GIF文件的数据结构,包括文件头、图像描述块、图像数据等。
通过解析GIF文件,控件能够分析出GIF图片的宽度、高度、帧数等基本信息,为后续的处理提供基础。
2、帧显示与控制:GIF图片由多帧图像组成,每一帧图像都有自己的延时时间。
VBGIF控件可以根据延时时间和帧号来控制帧的显示,实现动态效果的播放。
同时,控件还可以控制动画的播放速度、暂停和停止等功能。
3、图像编辑与处理:VBGIF控件提供了多种图像编辑和处理功能,包括缩放、旋转、裁剪、实时滤镜等。
通过这些功能,开发人员可以对GIF图片进行各种处理,创作出更有创意、吸引人的动态效果。
4、GIF文件保存:VBGIF控件可以将编辑后的GIF图片保存为新的文件,以供后续使用。
同时,控件还支持将GIF图片转换为其他格式,如JPEG、PNG等。
二、VBGIF控件的使用方法在VB环境中使用VBGIF控件,需要进行以下几个步骤:1、控件引用:首先,在VB项目中引入VBGIF控件的引用。
可以通过在项目设置中添加对应的组件或直接在代码中使用CreateObject函数来创建控件实例。
2、控件初始化:在控件使用前,需要进行初始化的操作。
资料范本本资料为word版本,可以直接编辑和打印,感谢您的下载VB ActiveX控件的创建地点:__________________时间:__________________说明:本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容1)概述ActiveX是一个Microsoft的术语,它指的是一组包括控件,DLL和ActiveX文档的组件,它通常是以动态链接库的形式存在,因此必须在一个叫容器的独立执行软件中运行。
这样的容器包括Authorware、Delphi,Visual Basic,Visual C++,Internet Explorer和Access等等。
ActiveX控件数据输入和函数功能执行都必须通过容器,因此ActiveX控件和容器都必须支持一些特定的接口协议。
根据Microsoft 相应的规格标准,ActiveX控件应具备如下的性能机制。
属性和方法:ActiveX控件必须提供属性的名称、方法的名称及参数,通过这项机制容器可以存取和改变ActiveX控件的属性参数。
事件:ActiveX控件由这项机制通知容器在ActiveX控件中发生的事件,比如属性参数的改变,用户按下鼠标左键等。
存储:容器由这项机制通知ActiveX控件存储和提取有关信息数据等。
ActiveX控件只要在Windows的Registry数据库中注册后,就可以像其他Windows应用程序一样发挥各自的功能。
ActiveX控件是一个模块化的灵活对象,如果某个应用程序或网页需要增加一项特殊的功能,无须重写整个程序,只要灵活地插入一个具有此项功能的ActiveX控件即可实现。
ActiveX的优势还在于它的动态可交互性,用户可以动态地在使用过程中,通过改变它的属性和参数,在应用程序中实现自己的特殊要求。
也许有的读者会问:目前在市面上可以找到各种各样现成的ActiveX控件,还有没有必要自己创建ActiveX控件呢?关于这个问题很容易解释,现有的控件种类是很多,功能也比较齐全,问题是有许多时候会遇到这种情况:使用现成的控件虽能完成任务,但自己需要的一些特性(属性、事件或方法)该控件却没有提供,还需要自己手工写代码来实现,而这些特性偏偏在自己的应用系统中又经常会用到,为了避免大量的重复劳动,一劳永逸的办法就是在创建自己的ActiveX控件。
VB6.0动态增删控件Vb6.0动态增删控件的实现经常在网上和杂志上看到问vb怎样动态增加控件,笔者在编一程序时,曾经用到,下面作一个较为详细的描述,希望能给大家有所帮助。
最简单的方法:控件数组。
在VB编程中有一个控件数组的概念, 通过置控件的INDEX 索引值的控制, 不仅可以建立一组具有紧密联系的相同控件, 而且可以实现在程序运行状态中增加控件数目功能, 这在实际编程中应用的非常广泛;在编程中实现具体增加控件数组如下代码即可,请先在窗体上添加一个option控件,名称为option1,并将index属性设为0.Private Sub Form_ load()Dim i As IntegerFor i = 1 To 5Load Option1(i) ' 给数组添加 5 个选项按钮。
Option1(i).Top = Option1(i - 1).T op + 350’设置顶端位置Option1(i).left= Option1(i - 1).left+800Option1(i).Visible = True’显示增加的控件Option1(i).caption = iNext iEnd SubPrivate Sub Option1_Click(Index As Integer)MsgBox ("您点击了index为" & Index & "的option控件.")End Sub(二)通过Add方法实现Add方法在Controls集合中添加一个控件并返回一个对控件的引用。
Add 方法的语法为:Object.Add(ProgID,Name,Container)其中Object为要添加元素的集合,ProgID为标示的字符串.可通过对象浏览器来确定,例如,CommandButton控件的ProgID是/doc/867763610.html,mandButton. Name 是控件的名称. Container是包含添加控件的容器,可以为form或Frame控件等等。
VB控件数组的使用一、什么是VB控件数组在VB编程中,控件是指用于构建用户界面的可视化元素,例如按钮、文本框、列表框等。
而控件数组是指将多个相同类型的控件组织在一起以便更方便地进行管理和操作。
二、为什么要使用VB控件数组使用控件数组可以带来许多好处,包括但不限于以下几点:1.简化代码:通过使用控件数组,我们可以减少代码的重复性,只需编写一次代码即可对数组中的所有控件进行操作。
这样可以大大简化代码的编写和维护工作。
2.提高效率:在某些情况下,我们需要对同一类型的多个控件进行相同或类似的操作。
使用控件数组可以避免重复性的操作,提高编程效率。
3.灵活性:控件数组可以动态增加或减少数组中的控件数量,从而使程序更具有灵活性和可扩展性。
4.统一管理:使用控件数组可以将同一类型的控件进行组织和管理,方便对其进行统一的控制和处理。
三、创建VB控件数组的方法在VB中,我们可以使用以下方法来创建和使用控件数组:1. 使用Control数组VB提供了一个叫做Control的特殊数组,可以容纳所有类型的控件。
我们可以通过声明Control类型的数组并将其初始化为特定类型的控件来创建控件数组。
例如,以下代码创建了一个名为btnArray的按钮数组:Dim btnArray() As Control = {btn1, btn2, btn3}其中btn1、btn2和btn3是已经存在于窗体上的按钮控件。
2. 动态创建控件数组除了使用Control数组外,我们还可以在运行时动态创建控件数组。
可以使用ReDim语句来调整数组的大小,并使用循环语句逐个初始化数组中的控件。
例如,以下代码使用循环创建了一个名为txtArray的文本框数组:Dim txtArray() As TextBoxDim i As IntegerReDim txtArray(2) '设置数组大小为3For i = 0 To 2txtArray(i) = New TextBox '创建新的文本框控件txtArray(i).Name = "txt" & (i + 1) '设置控件的名称Me.Controls.Add(txtArray(i)) '将控件添加到窗体上Next i在上述代码中,我们通过ReDim语句设置了txtArray数组的大小为3,并在循环中创建了3个新的文本框控件,并将其添加到窗体上。
VB中动态创建控件VB相关技术:/s/blog_5ccce2820100lof8.html创建数据驱动窗体所谓数据驱动窗体就是根据所请求的数据的不同生成相应的窗体。
举例来讲,假设你现在有一个数据库,其中有些字段必须根据登录者的身份加以显示,授权级别高的用户可以浏览并修改这些字段的内容;授权级别一般的用户只能浏览这些字段中的数据;授权级别低的用户则不能浏览这些字段中的内容。
要做到这一点就得利用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.PrintLicenses.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关键字,你就能直接捕获Validate,GotFocus,LostFocus,DragDrop和DragOver这几个事件了。
如果要捕获其它更多的事件,你可以使用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, 300ctrl.Visible = TrueCtrlItems.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 必需的。