Access中通過VBA程序代碼在Access窗體上動態創建ActiveX控件-高級技巧

2017-08-31 15:06:00
zstmtony
原創
1383

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
分享