我自己创建一个控件,在一个编译好的应用程序里调用,注:没有引用该控件
用CreateObject()创建该控件后如何操作该控件的属性?
callbyname 没有用的,
设定好后再去读还是原来的值
控件程序如下:Dim m_ss As IntegerPrivate Sub UserControl_Click()
m_ss = 5
End SubPublic Property Get ss() As Integer
ss = m_ss
End PropertyPublic Property Let ss(ByVal vNewValue As Integer)
m_ss = vNewValue
End Property引用如下:
Dim obj As ObjectPrivate Sub Form_Load()
  objj = "ttttt.ttt"
  s_name = "ssss"
  Set obj = CreateObject(objj)
  Me.Controls.Add objj, s_name
  Controls(s_name).Visible = True
End SubPrivate Sub Command1_Click() obj.ss= "ssss"
 
 MsgBox obj.ss
End Sub得出的SS属性没有改变
有请高手高手高高手出手~~~~~~~~~~~~~~~~~~~~~~~~~~

解决方案 »

  1.   

    补充,上面的msgbox 弹出的是 正确的,但是在控件本身取到的值没有改变 在单击过控件后SS应该等于5 如果直接msgbox obj.ss 就没有改变
      

  2.   

    obj.ss= "ssss"
    类型不匹配
      

  3.   

    是呀,类型有问题,定义的是Integer,赋给的值是字符串。
      

  4.   

    或者将代码改为这样也正常
    Public ssss As tttPrivate Sub Form_Load()
    Dim objj As String
    Dim s_name As String
      objj = "ttttt.ttt"
      s_name = "ssss"
      Set ssss = Me.Controls.Add(objj, s_name)
      Controls(s_name).Visible = True
    End SubPrivate Sub Command1_Click() 'obj.ss = 14
     
     MsgBox ssss.ss
    End Sub
      

  5.   

    我在应用程序里不知道类型的啊
    因为这个控件的名称是不固定的,因为控件的名称可以通过程序外来给,所以不能直接定义成ttt
    也不能在程序中引用
      

  6.   

    这个是不是VB的bug啊?
    这个问题一定要解决的
    555555555555555555555
      

  7.   

    老天啊,你建立工程组用引用进行调试,发现一切Ok后,把引用去掉加入把原来的 直接定义改为 dim xx as Object
    加入 xx = CreateOjbect(………)如果引用时一切OK,那使用CreateObject也一样OK,VB没这个Bug,我写过很多的ActiveX dll,而且都用CreateObject进行实例化的
      

  8.   

    obj.ss= "ssss"
     
     MsgBox obj.ss你这是写的什么?
      

  9.   

    cdknet(cdksoft)
    我是把引用去掉了
    就是这么做的,不过我做的是OCX不是DLL啊
    要不我把我的程序打个包给你看看?csdngoodnight(居然比我还快,你真行!) 
    obj.ss= "ssss"
      MsgBox obj.ss
    这个检查是否在这个里可以操作属性,这样做是成功的,但是在控件本身改变 ss的值就有问题
      

  10.   

    你没有添加属性的读和写过程,怎末可能会发生属性改变呢,
    在ActiveX控件中,只定义是没有用的,你定义的属性没有保存,所以你要在下面两个过程中分别存储和读取,这也称作控件的属性袋
    Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
    Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
    具体的语法怎麽写,你可以参照www.21code.com上的源程序
      

  11.   

    Public Property Let ss(ByVal vNewValue As Integer)
    m_ss = vNewValue
    PropertyChanged "ss"
    End Property
      

  12.   

    做控件首先你要知道其原理。如yujiabian() 所说,如果需要记录控件的属性状态值,就需要在以上事件中使用propbag的writeproperty方法和readproperty进行参数的保存。因为控件不象组件,不仅仅是在运行时可用,在设计时也是要运行控件的代码的。
    最简单的方法,你可以在控件的几个比较重要的事件里加入debug代码就会知道整个运行流程,主要的事件是
    Private Sub UserControl_InitProperties()
    Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
    Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
    当你在设计时将一个控件放入窗体时,这时会先先运行InitProperties()事件,这里可放置控件的一些默认属性值。
    而在你的设计窗体关闭或将控件移除时,即控件容器或本身在设计时销毁则会触发WriteProperties事件。这时如果是需要保存的属性值则需要使用propbag对象的writeproperty方法保存在oca文件(运行OCX都会自动生成一个OCA文件)中,以便设计再调用时读取,因为此时该控件在内存中是不存在的。
    当你将设计窗体再次打开时,则会运行控件的ReadProperties事件,这时可以使用propbag对象的readproperty方法来读取先前保存在oca中的数据。因为控件是重新加载到内存的,所以对于先前设置的值就只有重新获取。
    在控件的设计状态转到运行状态时,仍然是经历上述过程,因为控件先会销毁设计时的实例,从而先进行WriteProperties事件以保存设置数据,然后便是运行时的实例开始,先进行ReadProperties事件以读取先前的设置,从而在运行时能够起到作用。
    还有些需要说明的是,运行状态不会触发InitProperties事件,该事件只有在设计状态下才会触发。当你的属性设置没有发生改变则不会触发WriteProperties事件,因为没必要再去作保存操作,这是基本的优化。
      

  13.   

    把所有代码拿出来给大家看
    应用的程序
    Dim obj As Object
     Private Sub LoadControl()
      Set obj = CreateObject("whyocx1.ttt")
       Controls.Add "whyocx1.ttt", "myCt"
       Controls("myct").Visible = True
     End Sub
     Private Sub Command1_Click()
        a = CallByName(obj, "ss", VbGet)
       MsgBox a
       
       
     End Sub
    Private Sub Form_Load()
    LoadControl
     End Sub
     控件的程序
    Dim m_ss As Integer
    Dim m_setMove As Boolean
    Dim myname As StringPublic Event Click()Private Sub Command1_Click()
    MsgBox ss
    End SubPrivate Sub UserControl_Click()
    ss = 5
    RaiseEvent Click
    End SubPublic Property Get setMove() As Boolean
    setMove = m_setMove
    End PropertyPublic Property Let setMove(ByVal vNewValue As Boolean)
    m_setMove = vNewValue
    End PropertyPublic Property Get ss() As Integer
    ss = m_ss
    End PropertyPublic Property Let ss(ByVal vNewValue As Integer)
    m_ss = vNewValue
    Text1 = vNewValue
    PropertyChanged "ss"End PropertyPublic Sub itname(file As String)
    myname = fileOpen "d:\Move.txt" For Output As #1
    Print #1, myname
    Close #1End SubPublic Sub gogo(ByVal name As String, ByVal vNewValue As String, ByVal stype As String)
     If stype = "int" Then If name = "ss" Then ss = vNewValue
     
    End SubPrivate Sub UserControl_WriteProperties(PropBag As PropertyBag)
    PropBag.WriteProperty "ss", ss
    End Sub现在按着几个老大的意思弄了一下,仍然没有解决
      

  14.   

    你没有readproperties么?,光写不读出来有什么用?