我自己创建一个控件,在一个编译好的应用程序里调用,注:没有引用该控件
用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属性没有改变
有请高手高手高高手出手~~~~~~~~~~~~~~~~~~~~~~~~~~
用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属性没有改变
有请高手高手高高手出手~~~~~~~~~~~~~~~~~~~~~~~~~~
类型不匹配
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
因为这个控件的名称是不固定的,因为控件的名称可以通过程序外来给,所以不能直接定义成ttt
也不能在程序中引用
这个问题一定要解决的
555555555555555555555
加入 xx = CreateOjbect(………)如果引用时一切OK,那使用CreateObject也一样OK,VB没这个Bug,我写过很多的ActiveX dll,而且都用CreateObject进行实例化的
MsgBox obj.ss你这是写的什么?
我是把引用去掉了
就是这么做的,不过我做的是OCX不是DLL啊
要不我把我的程序打个包给你看看?csdngoodnight(居然比我还快,你真行!)
obj.ss= "ssss"
MsgBox obj.ss
这个检查是否在这个里可以操作属性,这样做是成功的,但是在控件本身改变 ss的值就有问题
在ActiveX控件中,只定义是没有用的,你定义的属性没有保存,所以你要在下面两个过程中分别存储和读取,这也称作控件的属性袋
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
具体的语法怎麽写,你可以参照www.21code.com上的源程序
m_ss = vNewValue
PropertyChanged "ss"
End Property
最简单的方法,你可以在控件的几个比较重要的事件里加入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事件,因为没必要再去作保存操作,这是基本的优化。
应用的程序
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现在按着几个老大的意思弄了一下,仍然没有解决