为什么用Control.Add加入的控件无法访问其属性、方法?但是可以响应事件。
但是用CreateObject就是访问属性、方法。

解决方案 »

  1.   

    你试试这段代码,怎么会不能访问属性呢?????'在窗体上加一个CommandButton和一个Frame,运行时单击按钮就会在Frame中添加
    Option ExplicitPrivate Sub Command1_Click()
    Dim opt1 As OptionButton, opt2 As OptionButton
    Set opt1 = Controls.Add("VB.OptionButton", "opt1", Frame1)
    Set opt2 = Controls.Add("VB.OptionButton", "opt2", Frame1)
    With opt1
        .Left = 200
        .Top = 400
        .Height = 200
        .Width = 1000
        .Caption = "Option1"
        .Visible = True
    End WithWith opt2
        .Left = 200
        .Top = 800
        .Height = 200
        .Width = 1000
        .Caption = "Option2"
        .Visible = True
    End WithEnd Sub
      

  2.   

    Option Explicit 
        Private WithEvents btnObj As CommandButton 
         
        Private Sub btnObj_Click() 
         MsgBox "这是动态添加的按钮。" 
        End Sub 
         
        Private Sub Form_Load() 
         Set btnObj = Controls.Add("VB.CommandButton", "btnObj") 
         With btnObj 
         .Visible = True 
         .Width = 2000 
         .Caption = "Hello" 
         .Top = 1000 
         .Left = 1000 
         End With 
        End Sub 
        这里使用WithEvent指定动态添加的控件的事件
      

  3.   

    自己写的控件也可以,在部件中加入后dim btnObj as 控件名
    Set btnObj = Controls.Add("工程序名.控件名", "btnObj") with btnObj
        .method     (为你写的方法)end with(工程名为你的自定义控件工程名)
    你写的控件和那里面的控件有区别吗?只要是ActiveX控件,就没区别了!
      

  4.   

    vb就是为了简化界面设计,你这么搞又浪费精力,又没有多少效果
    如果你非要这么干建议你不要用vb,干脆用汇编
      

  5.   

    dim btnObj as 控件名
    不会被通过
    因为自己写的控件不在一个工程,是一个已经编译好的文件。To crazyxf(网海鲨鱼) ( ) :
    非也,我是有特殊运用
      

  6.   

    我倒,大哥,你在部件里看到的那些控件不都是已经编译好的文件吗?
    dim btnObj as 控件名没有被通过只能说明你这个部件没有正确注册或控件本身有问题
    在运行时用Control.Add 加入的控件和你在设计时手动加入的控件没啥区别的 ,一样可以访问属性方法
      

  7.   

    非也,我的控件没有加在部件里
    是我用Liscense.Add添加的
    另外,现在总结一下问题1、该控件如果静态调用能访问到方法
    2、如果该控件放到同一个工程里面,动态、静态调用都能访问到方法
      

  8.   

    另:对于 dim btnObj as 控件名
    因为控件名是不固定的,在运行时我读取配置文件才能得到。
    所以,我现在是
    Private WithEvents objOcx As VBControlExtender
    ……
    另外奉献Form_Load的代码
    Private Sub Form_Load()
        '读取数据
        Dim strParam As String
        strParam = GetParam(m_ConfigID)    Dim ConfigProgID As String
        Dim DriverID As String
        DriverID = Trim(GetKeyVal(SYS_PATH + CONFIG_INI, CONFIG_PREFIX + m_ConfigID, "DriverID"))
        ConfigProgID = Trim(GetKeyVal(SYS_PATH + DRIVER_INI, DRIVER_PREFIX + DriverID, "ConfigProgID"))    '相当于动态引用该工程
        Licenses.Add ConfigProgID
        
        VB.Clipboard.SetText strParam
        Set objOcx = Me.Controls.Add(ConfigProgID, "objOcx", Me.fraParam)
        'MsgBox objOcx.PrintA
        fraParam.Width = objOcx.Width + BORDER * 2
        fraParam.Height = objOcx.Height + BORDER * 4
        cmdClose.Top = fraParam.Top + fraParam.Height + BORDER
        cmdSave.Top = cmdClose.Top
        cmdClose.Left = fraParam.Left + fraParam.Width - cmdClose.Width
        cmdSave.Left = cmdClose.Left - cmdSave.Width - BORDER
        
        Me.Width = fraParam.Width + BORDER * 4
        Me.Height = fraParam.Height + cmdClose.Height + txtConfigName.Height * 2 + BORDER * 10
        objOcx.Top = BORDER * 2
        objOcx.Left = BORDER
        objOcx.Visible = True
        
        Call ShowConfig(m_ConfigID)
    End Sub