有一个activex控件,我原来是单独做的一个ocx,现在我把它拿到工程内部,现在我在form中用form.controls.add()添加这个对象,结果发现控件的left,top ,width ,height,tabindex这些属性通通不能用了,,我囧
请问大家知道怎么回事吗?
请问大家知道怎么回事吗?
解决方案 »
- 如何分析股票软件数据?
- 菜鸟问题:VB+Access 用DAO方法
- 请教各路VB高手:请进 帮小弟个忙了
- 请问我在退出系统的时候,提示:无法插入空行,行必须有一个空列集
- 我的EXE文件在其他人的机器上老提示错误
- 如何用SHELL函数调用控制面板中每个图标所对应的程序?
- 如何在ActiveX DLL里面声明使用ActiveX控件?请大家帮忙呀,我要急死了,只要是建议性的提示,保证送分,有实例者保证另开贴赠100分回报
- 已知一图片地址如果用程序下载包括显示进度条谢谢?
- 高分求救!怎么用SQL语句将SQL Server中的数据导出。
- 用SQL整个数据库搜索
- vb关于日期的一个小疑问
- vb怎么实现C中__DATE__等预处理指令功能
set ctl = me.controls.add(...)
ctl.left = 120
'测试标准控件
Dim myCmd As CommandButton
Set myCmd = Me.Controls.Add("vb.commandbutton", "cmd1")
myCmd.Caption = "vvvddvv"
myCmd.Visible = True
Debug.Print myCmd.Name, myCmd.Left
'测试UserControl
Dim mySl As ShapeLabel
Set mySl = Me.Controls.Add("ControlDemo.ShapeLabel", "sl3")
mySl.Caption = "asdfad"
mySl.Visible = True
Debug.Print mySl.Name, mySl.Left
End Sub
'声明为UserControl类型,编译通不过
Dim mySl As ShapeLabel
Set mySl = Me.Controls.Add("ControlDemo.ShapeLabel", "sl3")
mySl.Caption = "asdfad"
mySl.Visible = True '以下各句都报编译错:没相应属性
Debug.Print mySl.Name, mySl.Left
'声明为Control,有extender的各种属性,但是没办法得到用户控件特有的属性
Dim myCtl As Control
Set myCtl = Me.Controls.Add("ControlDemo.ShapeLabel", "sl5")
myCtl.Caption = "asdfad" '运行时错误,说没这个属性。
myCtl.Visible = True
Debug.Print myCtl.Left, myCtl.TabIndex, myCtl.Width '这句可以正常运行
End Sub这是为什么呢?为什么会丢失这些属性?如何在这种模式下能让UserControl属性和Extender属性都正常得到?
工程内使用,为避免同名冲突,看到的只有类 ShapeLabel,所以没有 Left 属性。不要用“标准”的继承概念去套用,只是一个近似。
就是
public sub controlresize
me.left=30
end sub
类似的?
Public Property Get Left() As Single
Left = Extender.Left
End PropertyPublic Property Let Right(ByVal RHS As Single)
Extender.Left = RHS
End Property
这是你自己的断言,不然还是微软说的???(不要在论谈里轻易下断言,有时这样很没面子:>)
见鬼~~~我怎么记得,微软好象说:所有第三方OCX都要先在windows中注册后才能引用.前几日在网上看到过几篇不注册使用ActiveX DLL例子,看了真想哭~~~~~~(好麻烦的~~~~)我就想注册一下也没啥大不了了了了了了了了了~~~~~~~~~~~~~~~
是的,我是按照这样的方式实现所有的属性,不过会出现冲突,比如使用screetoclient这样的函数会出现问题,
看来这个是非得编译一个单独的文件不可了
不过编译成单独的文件更新起来真的很麻烦,更新组件就是一个超麻烦的事情。。
你说的是7楼的用法么?你看12楼的第二段代码,用control的话,用户控件特有的属性无法访问。
sub MoveControl(byval ctl as control, _
byval Left as single, byval Top as single, _
byval Width as single, byval Height as single)
ctl.Move Left, Top, Width, Height
end subprivate sub Form_Load()
dim ctl as MyControl
set ctl = Me.Controls.Add(...)
MoveControl ctl, 120,120, 600, 240
ctl.属性1 = 1234
ctl.属性2 = "abcd"
...
end sub
byval Left as single, byval Top as single, _
byval Width as single, byval Height as single)
ctl.Move Left, Top, Width, Height
end subprivate sub Form_Load()
dim ctl as MyControl
set ctl = Me.Controls.Add("MyOcx.MyControl"...)
MoveControl ctl, 120,120, 600, 240
ctl.属性1 = 1234
ctl.属性2 = "abcd"
Call ct1.AskTigerZhao()
...
end sub
Call ct1.AskTigerZhao()
是啊。我是说这里通不过。我和楼主都是没明白,在用Controls.Add方法加用户控件的时候,如何可以同时用extender和用户控件特有的属性方法
谢谢。不过,controls.add之后如何能用两个接口同时引用到同一个对象?你能代码示范一下么?
dim ctl as Control
set myCtl = Me.Controls.Add(...)
set ctl = myCtl
Left,Width,Top,Height,这些属性不需要自己实现,是由容器对应自动赋予的属性。以下语句区别两者的区别,希望对你有用。dim myCtl As VBControlExtender
dim ctl as ShapeLabel
Set m_myCtl = Controls.Add("ControlDemo.ShapeLabel", "sl3")
set ctl = myCtl.object
'myCtl具有left等属性,
'但要访问ShapeLabel的方法,只能通过ctl来访问
谢谢。set ctl = myCtl.object
这一句同样报运行时错误:Type mismatch
m_myCtl-》myCtlOption ExplicitPrivate 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
我的测试:
1,新建一个exe工程,添加一个用户控件
用户控件代码Option Explicit'事件调用
Public Event Hit()
Private mblnDead As BooleanPublic Sub Test()
MsgBox "小伙子果然有些来头,竟然找到这里来了!看我灭了你!"
RaiseEvent Hit
End SubPrivate Sub UserControl_Show()
'设置上颜色,好区别
With UserControl
.BackColor = vbBlue
.Width = 1200
.Height = 300
End With
End Sub
Public Property Get Dead() As Boolean
Dead = mblnDeadEnd Property
'测试属性调用
Public Property Let Dead(ByVal NewValue As Boolean)
mblnDead = NewValue
MsgBox "哎呀,CSDN果然厉害!30年后我还会再回来的~!"
End Property
Exe工程中添加按钮
Option ExplicitPrivate WithEvents mobjTest As UserControl1
Private mobjCtl As ControlPrivate Sub Command1_Click()
Call mobjTest.Test
End SubPrivate Sub Form_Load()
Set mobjCtl = Me.Controls.Add("工程1.usercontrol1", "ctl1")
mobjCtl.Move 120, 120
mobjCtl.Visible = True
Set mobjTest = mobjCtl
End SubPrivate Sub mobjTest_Hit()
MsgBox "哼,想杀我,问问我手上的家伙答应不答应吧!"
mobjTest.Dead = True
End Sub
测试完全通过
运行时错误:Type mismatch
http://bloom8848.download.csdn.net/
Set ctl = Me.Controls.Add("Project1.ShapeLabel", "sl3")工程设置是这样的:
我原来是创立的ControlDemo.ShapeLabel控件,要把它赋给Project1.ShapeLabel类型的变量,所以报Tyoe Mismatch。可能是这样解释吧?
(1)controls.add的返回值可以赋给control类型的变量,也可以赋给UserControl类型的变量。
(2)可以用UserControl类型的变量去引用control类型的变量,反之却不行。为什么?照我直观的理解,应该反过来才对。
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