动态生成的控件,如何添加事件和事件代码???###!!!

ccblmpt 2003-03-11 12:18:21
rt.谢谢
...全文
564 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccblmpt 2003-03-11
  • 打赏
  • 举报
回复
ding
山顶洞人-平 2003-03-11
  • 打赏
  • 举报
回复
VB中不知道,VB.NET中怎么实现我知道
ccblmpt 2003-03-11
  • 打赏
  • 举报
回复
如下;
Set pics = Me.Controls.Add("vb.picturebox", "pics")
' Set pics.Container = Me.ItemIE(i - 1)
pics.Visible = True
pics.Height = 300
pics.Width = 300
我需要点击事件或其他事件中添加代码
ccblmpt 2003-03-11
  • 打赏
  • 举报
回复
关键是无法为动态添加的控件动态设置事件
icnetcn 2003-03-11
  • 打赏
  • 举报
回复
VB 自带的控件声明用相应的对象 Private WithEvents cmdOK as VB.CommandButton
第三方控件中VBControlExtender Private WithEvents ctlCustom as VBControlExtender
liberte 2003-03-11
  • 打赏
  • 举报
回复
dim a as object
ccblmpt 2003-03-11
  • 打赏
  • 举报
回复
熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程,但
唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。
VB6.0已能够解决该问题,只是帮助中没有明确说明,并且没有描述到一些关键功能,
由于以前的版本中可以动态创建进程外服务:如果对象是外部可创建的,可在 Set 语
句中用 New 关键字、CreateObject 或 GetObject 从部件外面将对象引用赋予变量。
如果对象是从属对象,则需使用高层对象的方法,在 Set 语句中指定一个对象引用:

Dim xlApp1 As Excel.Application
Set xlApp1 = New Excel.Application

Dim xlApp As Object '定义存放引用对象的变量。
Set xlApp = CreateObject("excel.application")
xlApp.Visible = True

---- 这些语法很容易造成误导,以为动态加载ActiveX控件也是此方法,可能有朋友也
象我一样利用CreateObject尝试了无数次,却无功而返,不知微软公司是出于何种考
虑,动态加载ActiveX控件是扩展控件集合的方式实现,通过实际摸索,终于就如何实
现动态ActiveX控件找出了一条切实可行的方法,下面以一个具体的实例来详细说明。

一、ActiveX控件

---- ActiveX 控件是 Visual Basic 工具箱的扩充部分。使用 ActiveX 控件的方法与
使用其它标准内装的控件,如 CheckBox 控件,完全一样。在程序中加入 ActiveX 控
件后,它将成为开发和运行环境的一部分,并为应用程序提供新的功能。

---- ActiveX 部件通过客户端/服务器关系与应用程序— 及与部件相互之间— 交互作
用。客户端是使用部件功能的应用程序代码或部件。服务器是部件及其关联的对象。例
如,假设应用程序使用 ActiveX 控件来提供一个标准的雇员窗体,供公司的多种应用
程序使用。提供雇员窗体的 ActiveX 控件就是服务器,使用这个控件的应用程序就是
服务器的客户端。

二、加载方法

---- VB6.0中对Controls 集合进行了扩展,以前版本中Controls 集合在窗体上列举出
已加载的控件,这在迭代过程中是很有用的。Controls 集合标识一个叫做 Controls
的内在窗体级变量。如果忽略可选的 object 所在处的整数,则关键字 Controls 必须
包括在内。我们通常在窗口中使用如下代码:

Text1.Text="Hello, world"
其实也可以使用如下代码达到同一目的:
Controls(1).Text="Hello, world"

---- 在VB6.0中除了原来的Clear、Remove 方法外(很奇怪,为什么微软在VB5.0中只提
供这两种方法,而没有提供Add方法,因为没有Add,这两种方法也就没什么用处),增
加了Add方法,该方法就是用于动态加载控件的:
Controls.Add(progid as String, Name as String);
progid: ActiveX部件的ProgID,如:"VB.CheckBox";
Name:ActiveX部件加载后的名称,如: "MyCheckBox";

若要在窗体上添加一个名为MyButton的按钮,可以使用:
dim oControl as Object '窗体级变量
注意:这里声明为Object对象类型
Private Sub LoadControl()
Set oControl = Controls.Add
("VB.CommandButton", "MyButton")
oControl.Left = 10
oControl.Top = 10
oControl.Visible = True '使控件可见
End Sub

---- 这是VB6.0的标准语法,它在例程中也是如此演示的,不过该方法虽然现实了控件
的动态加载,按钮显示在窗体上,可以象普通按钮一样按下去,但加载的控件不能预先
设计响应事件代码,如:事件Sub MyButton_Click()将是非法的,当然,可以将要响应
的事件封装在控件内部。就编程的观点来看该方法没什么大的用处,开发ActiveX控件
的目的是为了资源共享,为了被其他开发人员利用,所以要提供必要的事件接口,显然
利用该方法不行,通过分析VBControls等相关对象,找出VBControlExtender对象与
EventInfo相结合能提供事件陷井捕捉,VBControlExtender对象对动态添加控件特别有
用,它提供了一套通用的属性、方法、事件给开发人员,它的一个突出特点是能编程设
计控件的事件,熟习类编程的朋友对带事件的对象声明一定不会陌生:
---- Dim WithEvents objElemt as CElemtVBControlExtender也不例外,声明的语法
一样,只不过它有个特殊的事件ObjectEvent(Info As EventInfo),它能捕捉到对象使
用RaiseEvent产生的所有事件,EventInfo数据结构映射了事件的名称、参数个数和参
数的值。VBControlExtender和 EventInfo相结合,采用Select Case 就可以预先将不
同类对象的事件放置一起,各自独立运作。将上面的代码改写一下就能提供Click事件
了:

---- Dim WithEvents oControl As VBControlExtender '带事件声明声明之后您就可
以在代码窗口的左上角的对象下拉框中发现该对象出现了,也就是说,该对象有了事件
或方法了,它的事件有DragDrop,DragOver ,LostFocus ,GotFocus ,ObjectEvent
和Validate,其中ObjectEvent是通用的事件捕捉。


Private Sub LoadControl()
Set oControl = Controls.Add
("VB. CommandButton", "MyButton")
oControl.Visible = True
End Sub

Private Sub oControl_ObjectEvent(Info As EventInfo)
Select Case Info.Name
Case "Click" 'Click事件
'您可以添加处理Click事件代码
MsgBox "您按了MyButton!"
Case Else ' 其他事件
' Handle unknown events here.
End Select
End Sub

---- 当然对微软提供的标准控件能采用该方法添加,大家都不会怀疑,但自己开发的
控件也能吗?答案是肯定的,我们可以用一个实际的例子进行说明。
Sean918 2003-03-11
  • 打赏
  • 举报
回复
VBControlExtender就是VB自代的控件

无能为力,关注
ccblmpt 2003-03-11
  • 打赏
  • 举报
回复
或者那位老大告诉我如何申明动态控件

dim Ocontrol() 可以,但是无法为它编写事件

Dim WithEvents ocontrol As PictureBox 不能声明动态
ccblmpt 2003-03-11
  • 打赏
  • 举报
回复
VBControlExtender不支持内部控件,内部控件是否就是VB自代的控件
ccblmpt 2003-03-11
  • 打赏
  • 举报
回复
楼上的
我是动态添加控件与动态捕捉事件,采用
Private Sub pic_ObjectEvent(Info As EventInfo)
' 使用 Select Case 语句编写控件的事件处理程序。
Select Case Info.Name
Case "Click"
' 在此处处理 Click 事件。
' 在这里处理其他情况
Case Else ' 未知事件
' 在此处理各种未知的事件。
End Select
End Sub

MSDN的案例是如下:

Option Explicit
Dim WithEvents objExt As VBControlExtender ' 使用 WithEvents 声明 VBControlExtender 变量

Private Sub LoadControl()
Licenses.Add "Project1.Control1", "ewrinvcmcoe" ‘在此设置老是报错
Set objExt = Controls.Add("Project1.Control1", "myCtl")
objExt.Visible = True ' 该控件在缺省情况下为不可见的。
End Sub

Private Sub extObj_ObjectEvent(Info As EventInfo)
' 使用 Select Case 语句编写控件的事件处理程序。
Select Case Info.Name
Case "Click"
' 在此处处理 Click 事件。
' 在这里处理其他情况
Case Else ' 未知事件
' 在此处理各种未知的事件。
End Select
End Sub




Sean918 2003-03-11
  • 打赏
  • 举报
回复
Private WithEvents NewCommand As CommandButton


Private Sub Form_Load()
''load comandbutton
Set NewCommand = Controls.Add("VB.CommandButton", "cmdNew", Me)
NewCommand.Move 0,0
NewCommand.Caption = "hello"
NewCommand.Visible = True

End Sub

Private Sub NewCommand_Click()
MsgBox "点击事件!"
End Sub


参照上面的例子!
ccblmpt 2003-03-11
  • 打赏
  • 举报
回复
Dim WithEvents pic As VBControlExtender

Private Sub LoadControl()

Set pic = Controls.Add("VB.textbox", "ocontrol") ‘此处报类型不匹配
pic.Visible = True
end sub
kensu 2003-03-11
  • 打赏
  • 举报
回复
这个问题有人问过了。
请看 http://expert.csdn.net/Expert/topic/1513/1513143.xml?temp=.4090692

7,766

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧