100分,好囧的问题,activex设置合并到工程内部出现的问题

高手都到碗里来 2009-08-05 11:06:02
有一个activex控件,我原来是单独做的一个ocx,现在我把它拿到工程内部,现在我在form中用form.controls.add()添加这个对象,结果发现控件的left,top ,width ,height,tabindex这些属性通通不能用了,,我囧


请问大家知道怎么回事吗?
...全文
389 63 打赏 收藏 转发到动态 举报
写回复
用AI写文章
63 条回复
切换为时间正序
请发表友善的回复…
发表回复
slowgrace 2009-08-14
  • 打赏
  • 举报
回复
甲虫,53楼的问题明明还没解决啊。
  • 打赏
  • 举报
回复
还需要讨论吗?不需要讨论的话我准备结贴了,哈哈
slowgrace 2009-08-14
  • 打赏
  • 举报
回复
可以用UserControl类型的变量去引用control类型的变量,反之却不行。为什么?

Option Explicit

Private Sub Form_Load()
Dim myCtl As MyControl
Dim ctl As Control

'*****这个可以
Set ctl = Me.Controls.Add("Project1.MyControl", "ctl")
Set myCtl = ctl

'*****这个不可以
Set myCtl = Me.Controls.Add("Project1.MyControl", "ct2")
Set ctl = myCtl '这一句运行时错误:Type mismatch.

End Sub
slowgrace 2009-08-14
  • 打赏
  • 举报
回复
像51楼那样用对Class String之后,40楼的办法也可以通过。

39楼的代码还是不行,不过这回是报错在set ctl = myctl.

小结
(1)controls.add的返回值可以赋给control类型的变量,也可以赋给UserControl类型的变量。
(2)可以用UserControl类型的变量去引用control类型的变量,反之却不行。为什么?照我直观的理解,应该反过来才对。
slowgrace 2009-08-14
  • 打赏
  • 举报
回复
我弄错了,现在我也可以通过了。

我原来是这样加控件的:

Set ctl = Me.Controls.Add("ControlDemo.ShapeLabel", "sl3")

现在改成这样就可以了:
Set ctl = Me.Controls.Add("Project1.ShapeLabel", "sl3")

工程设置是这样的:


我原来是创立的ControlDemo.ShapeLabel控件,要把它赋给Project1.ShapeLabel类型的变量,所以报Tyoe Mismatch。可能是这样解释吧?
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 slowgrace 的回复:]
bloom8848,把你46楼测试的时候的工程浏览器截图给我看看,我才信你。
[/Quote]
我已经上传到这里了,请下载
http://bloom8848.download.csdn.net/
slowgrace 2009-08-14
  • 打赏
  • 举报
回复
bloom8848,把你46楼测试的时候的工程浏览器截图给我看看,我才信你。
slowgrace 2009-08-14
  • 打赏
  • 举报
回复
楼上各位谢谢,不过在测试的时候请注意按12楼截图那样设置工程,不要用工程组
slowgrace 2009-08-14
  • 打赏
  • 举报
回复
45楼仍然报错:

Set myCtl = ctl
运行时错误:Type mismatch
  • 打赏
  • 举报
回复
Tiger_Zhao的这个方案是可行的
我的测试:
1,新建一个exe工程,添加一个用户控件
用户控件代码

Option Explicit

'事件调用
Public Event Hit()
Private mblnDead As Boolean

Public Sub Test()
MsgBox "小伙子果然有些来头,竟然找到这里来了!看我灭了你!"
RaiseEvent Hit
End Sub

Private Sub UserControl_Show()
'设置上颜色,好区别
With UserControl
.BackColor = vbBlue
.Width = 1200
.Height = 300
End With

End Sub
Public Property Get Dead() As Boolean
Dead = mblnDead

End Property
'测试属性调用
Public Property Let Dead(ByVal NewValue As Boolean)
mblnDead = NewValue
MsgBox "哎呀,CSDN果然厉害!30年后我还会再回来的~!"
End Property




Exe工程中添加按钮


Option Explicit

Private WithEvents mobjTest As UserControl1
Private mobjCtl As Control

Private Sub Command1_Click()
Call mobjTest.Test
End Sub

Private Sub Form_Load()
Set mobjCtl = Me.Controls.Add("工程1.usercontrol1", "ctl1")
mobjCtl.Move 120, 120
mobjCtl.Visible = True
Set mobjTest = mobjCtl
End Sub

Private Sub mobjTest_Hit()
MsgBox "哼,想杀我,问问我手上的家伙答应不答应吧!"
mobjTest.Dead = True
End Sub




测试完全通过
Tiger_Zhao 2009-08-14
  • 打赏
  • 举报
回复
要反过来转换
Option Explicit

Private Sub Form_Load()
Dim myCtl As MyControl
Dim ctl As Control

Set ctl = Me.Controls.Add("Project1.MyControl", "ctl")
ctl.Move 120, 120
ctl.Visible = True

Set myCtl = ctl
myCtl.Caption = "hello"
End Sub
  • 打赏
  • 举报
回复
我晕,这个帖子这么长
slowgrace 2009-08-14
  • 打赏
  • 举报
回复
赵老虎不愿意说了,那甲虫结帖吧。
liguicd 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 myjian 的回复:]
路过...........困..........睡觉...........
[/Quote]
老马越来越牛B了,边睡觉边上网
Tiger_Zhao 2009-08-14
  • 打赏
  • 举报
回复
慢慢啃 MSDN 吧。
slowgrace 2009-08-14
  • 打赏
  • 举报
回复
反正是很难理解和记忆,可能是中间我缺乏的基础知识太多了。

比如,类型转换和接口多少有嘛关系啊?难道类型转换实质上就是接口转换?我明明记得是指针赋值。
Tiger_Zhao 2009-08-14
  • 打赏
  • 举报
回复
slowgrace 2009-08-14
  • 打赏
  • 举报
回复
当我们使用set的时候,实际上是发生了类型转换的吧?
Tiger_Zhao 2009-08-14
  • 打赏
  • 举报
回复
因为不是按照通常意义的“继承”实现的,MyControl 是单一接口,Control 是“混合”接口。
slowgrace 2009-08-13
  • 打赏
  • 举报
回复
另外,40楼代码有个笔误:第3行m_myCtl -》myCtl
加载更多回复(43)

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧