ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:18.88KB ,
资源ID:11494618      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11494618.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VB中动态创建控件.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

VB中动态创建控件.docx

1、VB中动态创建控件VB中动态创建控件VB相关技术:创建数据驱动窗体所谓数据驱动窗体就是根据所请求的数据的不同生成相应的窗体。举例来讲,假设你现在有一个数据库,其中有些字段必须根据登录者的身份加以显示,授权级别高的用户可以浏览并修改这些字段的内容;授权级别一般的用户只能浏览这些字段中的数据;授权级别低的用户则不能浏览这些字段中的内容。要做到这一点就得利用VB动态添加控件的功能。动态创建控件无论你想要创建何种类型的数据驱动窗体,你必须知道如何在运行时动态地创建控件。你可以通过控件数组做到这一点,但VB6的Controls集合所提供的Add方法,功能更强大,灵活性更高。使用该方法,你不需要在设计时将

2、控件的实例放在窗体上。实际上,用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方法的第二个参数:分配给控件的名称。

3、从代码可读性出发,这个名称一般都与变量名相同。你可以用这个名称从Controls集合中获取相应的控件或移除该控件。例如:Controls.Remove txtTotal在变量声明时加上WithEvents关键字,即使在设计时窗体不存在该控件,你也可以为该控件的事件编写代码。上面所讲的方法只适合解决VB内置的控件。例如,当你要添加一个TreeView控件时,VB会要求你证明你已经得到了合法的授权来创建该控件的实例。换句话说,VB要证明这个控件是买来的,而不是从其它附有该控件的程序中借来的。要证明你经过了合法的授权有下面几种方法:在窗体上放置一个控件。这也是最简单的方法。你完全没有必要将这个窗体显

4、示出来。 将相关的控件添加到工具箱中,然后在“工程属性”对话框的“生成”标签页中取消选择“删除有关未使用的ActiveX控件的信息”这一项。 向Licenses集合添加一个元素。例如:Debug.Print Licenses.Add(MSMask.MaskedEdBox) 仅仅创建了控件并不足够要创建一个数据驱动窗体,仅仅知道动态创建控件还不够。例如:现在你要创建一个能根据数据库中表的不同字段自动生成控件的窗体。该窗体可能会创建单行文本框,其长度随字段长度不同而不同;也可能会创建单选按钮或复选按钮以显示布尔型字段;甚至可能创建一个多行文本框显示备注型字段。你需要解决的第一个问题是:文本框控件的

5、Multiline属性在运行时是只读的,只在设计时可用。幸好,微软的Microsoft Windowless Controls 6.0可以解决这个问题。这组控件集包括了轻量级的TextBox,ComboBox,ListBox,CheckBox,OptionButton,CommandButton和两个scrollbar控件。这些控件与VB内置的相应的控件最大的区别在于:这些控件的所有属性在运行时是可读写的。在VB的安装光盘中的CommonToolsVBWinLess文件夹中可以找到这个控件组。用下面的代码可以创建一个多行文本框:Dim WithEvents txtEditor As MSWLe

6、ss.WLTextPrivate Sub CreateEditor()Set txtEditor = Controls.Add( MSWLess.WLText, txtEditor)txtEditor.Move 0, 0, 4000, 4000txtEditor.MultiLine = TruetxtEditor.ScrollBars = wlBothtxtEditor.Visible = TrueEnd Sub另外一个问题比较复杂:在事先不知道要创建多少个控件的情况下,如何给每个对新创建的控件的引用分配唯一的带WithEvents关键字的变量。换句话说就是要对新创建的控件的事件进行编程,前提

7、是你在设计时不知道程序会创建多少个控件。使用对象数组显然不行,因为不能用WithEvents关键字声明一个对象数组;更坏的情况是,资一个变量定义为As Control或As Object也不行,因为还是不能用WithEvents。问题源自于我们无法在运行时捕获一个对象数组事件。所以我们只能采取曲线救国的办法。所要的编写的代码可能比你想象的多,不过这个解决方法很有趣,值得我们这样去做。我们需要两个辅助类模块来捕获事件,分别取名为ControlItems和ControlItem。ControlItems是一个集合类,其中保存了ControlItem对象及其数量。该数量等于你所要对之编程的控件的数量

8、。ControlItem类的每一份实例捕获控件产生的事件,然后调用在其所属的ControlItems集合类中的过程,最后由ControlItems在窗体中触发事件并执行事件中的代码。整个过程如下图所示:捕获多个控件的事件为简单起见,假设你要捕获来自所有的动态添加到窗体上去的控件的Validate事件。为完成这个工作,ControlItems集合类必须向父窗体展示该事件,并随时准备接收来自其子ControlItem类的通知以触发事件。代码如下:Event Validate(CtrlItem As ControlItem, Cancel As Boolean)Private m_ControlIt

9、ems 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(It

10、em, Cancel)End SubControlItem类必须捕获来自动态添加到窗体中的控件的事件,并通知其所属的ControlItems集合类。很显然,ControlItem类必须有一个用WithEvents关键字定义的变量来引用真正的控件。这意味着你不能将变量声明为As Control或As Object。如果你决定在窗体中所动态添加的控件不使用内置的控件的话,这个问题的解决办法相当的简单。你只需要将变量声明为VBControlExtender类型就行了。对于创建数据驱动窗体来讲,不使用内置的控件并不是一件大不了的事。将变量声明为VBControlExtender,并加上WithEven

11、ts关键字,你就能直接捕获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

12、 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,

13、 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

14、 CtrlItem.Ctrl.Text = Then Cancel=TrueEnd Sub现在解决了最困难的部分,要创建一个数据驱动窗体就变得简单了*动态添加控件VB6有一个新功能,可以动态添加控件,不用控件数组:object.Add (ProgID, name, container)参数说明Object 必需的。一个对象表达式,其值是“应用于”列表中的一个对象。ProgID 必需的。一个标识控件的字符串。大多数控件的 ProgID 都可通过查看对象浏览器来决定。控件的 ProgID 是由控件的库和类组成的。例如,CommandButton 控件的 ProgID 是 VB.CommandBut

15、ton。在ProgID 与对象浏览器中所显示的不一样的情况下,Visual Basic将显示一个包括正确 ProgId 的错误信息。name 必要的。一个字符串,用来标识集合的成员。container 可选的。一个对象引用,它指定控件的容器。如果没有指定或为NULL,缺省值为 Controls 集合所属的容器。通过指定该参数,可以把一个控件放置在任何现存的容器控件(如 Frame 控件)中。用户控件或 ActiveX 文档也可以作为一个容器。举例: /在picture1上面添加一个commandbuttonPrivate Sub Form_Load()Form1.Controls.Add VB

16、.CommandButton, cmdOk, Picture1With Form1!cmdOk.Visible = True.Width = 500.Caption = 确认(&Y)End WithEnd Sub重点:当您添加一个未引用的需要许可证的控件到一个现存的(已部署好的)应用程序时,在使用 Add 方法之前您必须也添加这个控件的许可证关键字。在运行时添加未引用的控件:您也可以利用 Add 方法来动态添加一个在工程中没有被引用的控件。(“未引用的”控件是不出现在 Toolbox 中的控件)。为此,您必须也把控件的License 关键字添加到 Licenses 集合中。下面的示例中在添加控

17、件本身之前添加了控件的许可证关键字:Option ExplicitPrivate WithEvents extCtl As VBControlExtenderPrivate Sub Form_Load()Licenses.Add prjWeeks.WeeksCtl, xydsfasfjewfeSet extCtl = Form1.Controls.Add(prjWeeks.WeeksCtl, ctl1)extCtl.Visible = True The control is invisible by default.End Sub但是,为了编程这样一个未引用控件的事件,您必须使用 WithEv

18、ents 关键字声明一个对象变量为VBControlExtender 对象(如上),并且设置该对象变量到Add 方法返回的引用上。然后,利用VBControlExtender 对象的 ObjectEvent事件来编程该控件的事件。下面是一个简单的例子。Option ExplicitDim WithEvents objExt As VBControlExtender 声明 Extender 变量Private Sub LoadControl()Licenses.Add Project1.Control1, xydsfasfjewfeSet objExt = Controls.Add(Projec

19、t1.Control1, myCtl)objExt.Visible = TrueEnd SubPrivate Sub extObj_ObjectEvent(Info As EventInfo)使用 Select Case 编程控件的事件。Select Case Info.NameCase Click这里处理 Click 事件。现在显示其他的 caseCase Else 未知事件这里处理未知事件。End SelectEnd SubNote: 不能把一个固有的控件指定给这个 VBControlExtender 变量; 任何这种试图将引起类型不匹配错误。但是,您也可以通过使用 WithEvents

20、关键字声明一个对象变量,并且设置该方法返回的引用为该变量,从而编程一个动态添加控件的事件,如下所示。Option Explicit声明对象变量为 CommandButton 。Private WithEvents cmdObject As CommandButtonPrivate Sub Form_Load()Set cmdObject = Form1.Controls.Add(VB.CommandButton, cmdOne)cmdObject.Visible = TruecmdObject.Caption = Dynamic CommandButtonEnd SubPrivate Sub

21、cmdObject_Click()Print This is a dynamically added controlEnd Sub如果希望添加一个用户控件或任何 ActiveX 控件到您的窗体,必须或者把这个控件添加到“工具箱”,或者把控件的 License 关键字添加到 Licenses集合中。有关详细信息请参阅“增加方法 (Licenses 集合)”。注意:如果您添加一个 ActiveX 或用户控件到您的工程,但是没有在窗体中使用它,您也必须不要选定“工程属性”对话框的“生成” 选项卡上的“删除有关未使用的 ActiveX 控件”选项。如果您的应用程序试图添加该控件,那么该 Add 方法将失败,因为必需的信息已经被丢弃。问题一:可先手工画一个按钮作为母控件,把它的Index设置为0 代码如下:Dim i As IntegerFor 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 = TrueNext

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1