Access中通过VBA程序代码在Access窗体上动态创建ActiveX控件-高级技巧

2017-08-31 15:06:00
zstmtony
原创
779

Access中通过VBA程序代码在Access窗体上动态创建ActiveX控件


我们知道在Access中可以通过 Createcontrol 来动态在窗体上创建控件,但大家有否发现,创建普通的Access控件是可以的

但是创建Activex或其它Customcontrol是不行。不管你如何创建,这个控件总是无法生效或激活的。

CreateControl 创建 AcitveX 控件 是通过 (acCustomControl 参数),虽然命令是执行成功了,但它仅仅是创建一个空的容器(empty container)

Activex控件的属性 方法 和事件都没有激活。这是为什么呢?


最终几天不断的研究和分析,发现原来是这个Activex的OleData未填充导致的。


有2种方法来实现

1.将每种Activex控件的OleData保存在一个模板表中,在需要的时间将这些OleData内容赋给刚创建的Activex控件

2.从其它窗体或本控件同类型的Activex控件中复制OleData


2种方法都需要 分别 对如 Treeview imagelist listview等这些Activex控件分别处理


以下是使用代码动态创建Activex控件Treeview树控件的方法:


Dim frm As Form, ctl As ControlSet
Docmd.Openform "我的窗体",acDesign ,,,,acHidden  '隐藏打开窗体到设计视图
frm = Forms("我的窗体") 
Set ctl = CreateControl(frm.Name, acCustomControl, acDetail, , , 100, 100, 200, 200)
ctl.OleData = frm("已存在的树控件名").OleData  '已存在的树控件名 是已存在当前窗体上或其它窗体上树控件



同样创建网页浏览器控件也可以通过类似的方法


Dim ctlNew As Access.Control

'********************************************
' 在主体节添加浏览器控件 web browser control
'    a.) OLE Class: Microsoft Web Browser
'    b.) Class: Shell.Explorer.2
'********************************************

Set ctlNew = CreateControl(frmNew.Name, acCustomControl,  acDetail)
      
    With ctlNew

        .OLEClass = "Microsoft Web Browser"
        .Class = "Shell.Explorer.2"
        .Verb = 0
        .Visible = True
        .OleData = forms("另一个窗体").controls("WebBrowser2").OleData

 End With



此知识点相关Access资料


Access VBA教程:OLEData属性

本主题中的部分内容可能不适用于某些语言。

使用 OLEData属性可以将未绑定对象框中的数据复制到其他未绑定对象框,或者将ActiveX 控件中的数据复制到其他 ActiveX 控件。

设置

controlname.OLEData

OLEData属性使用以下设置:

设置 说明
ControlName 必需。表示未绑定对象框控件的名称。
OLEData 必需。表示未绑定对象框或 ActiveX 控件所包含的数据。

OLEData属性仅在使用 Visual Basic 时才可用。对于 ActiveX 控件,只有在“设计”视图中才能将其 OLEData属性设为其他 ActiveX 控件的 OLEData属性。

说明

使用该属性可以在未绑定对象框中显示其他未绑定对象框中的数据。

如果将 ActiveX 控件的 OLEData属性设为其他 ActiveX 控件的 OLEData属性,则第一个 ActiveX 控件将成为第二个 ActiveX 控件的另一个实例。例如,下列对属性进行赋值的代码将 TreeView 控件改为 Calendar 控件:

Me!MyTreeViewControl.OLEData = Me!MyCalendarControl.OLEData
分享