[急]请问如何将一个Form传入DLL中

Alps_lou 2008-08-27 09:06:18
想要在DLL中实现对传入的Form的所有的控件的大小进行调整,所以在DLL中写了如下这样的函数:
Public Sub GetControlObject(ByRef obj As Form)
Dim objOnFormControl As Control
For Each objOnFormControl In obj.Controls
objOnFormControl.Width = 10
Next
End Sub

但是,编译不通过,提示Form不能作为public的函数的参数传递,请问如何将Form作为参数传入DLL中,谢谢!
...全文
130 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzyong00 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 Alps_lou 的回复:]
引用 14 楼 zzyong00 的回复:
AddSub.ResizeControlObject (Form1)
是这一句报错吗?

是这一句报错
For Each objOnFormControl In obj.Controls

报:
Run-time error '438':
Object doesn't support this property or method
[/Quote]
我开始怀疑你引用的是已注册的、有问题的dll,但如果是这一句报错,应该不是哪个问题
Tiger_Zhao 2008-08-28
  • 打赏
  • 举报
回复
选项:
·Error Trapping = “Break on All Errors”
·不选 “Compile On Demand”
调试运行,错误发生在哪行语句?
Alps_lou 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zzyong00 的回复:]
AddSub.ResizeControlObject (Form1)
是这一句报错吗?
[/Quote]
是这一句报错
For Each objOnFormControl In obj.Controls

报:
Run-time error '438':
Object doesn't support this property or method
Alps_lou 2008-08-27
  • 打赏
  • 举报
回复
谢谢各位,但是我的代码确实会报错,代码贴出,麻烦各位看看有没有问题。
如下:

DLL中的函数:
Public Sub ResizeControlObject(obj As Object)
Dim objOnFormControl As Control
For Each objOnFormControl In obj.Controls
objOnFormControl.Width = 10
Next
End Sub

窗体中的调用:
Option Explicit
Public AddSub As AddClass
Private Sub Command1_Click()
Set AddSub = New AddClass
AddSub.ResizeControlObject (Form1)
End Sub

运行后,产生这样的错误:
Run-time error '438':
Object doesn't support this property or method
zzyong00 2008-08-27
  • 打赏
  • 举报
回复
老鸟的方法确实可以
Tiger_Zhao 2008-08-27
  • 打赏
  • 举报
回复
不可能,我这里调试通过。
·先注释这段代码,保证全编译通过,然后在撤销注释,全编译。
·调用时传入的必须是 Form 对象。
Tiger_Zhao 2008-08-27
  • 打赏
  • 举报
回复
不可能,我这里调试通过。
·先注释这段代码,保证全编译通过,然后在撤销注释,全编译。
·调用时传入的必须是 Form 对象。
zzyong00 2008-08-27
  • 打赏
  • 举报
回复
AddSub.ResizeControlObject (Form1)
是这一句报错吗?
Alps_lou 2008-08-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Sandrer 的回复:]
方法一:
ObjPtr()传递对象的内存地址
CopyMemory根据Form的大小来复制内存

方法二:
传递窗口句柄
有了窗口句柄,还有什么是做不了的?
[/Quote]
传递句柄,使用API确实什么都可以做了,但是这次开发就是要用VB本身语言来做,郁闷啊!

[Quote=引用 2 楼 Tiger_Zhao 的回复:]
只要将 As Form 更改为 As Object 就可以了。
[/Quote]
尝试了一下,会报obj.Controls这里错误。
说obj没有Controls属性
Tiger_Zhao 2008-08-27
  • 打赏
  • 举报
回复
只要将 As Form 更改为 As Object 就可以了。
Sandrer 2008-08-27
  • 打赏
  • 举报
回复
方法一:
ObjPtr()传递对象的内存地址
CopyMemory根据Form的大小来复制内存

方法二:
传递窗口句柄
有了窗口句柄,还有什么是做不了的?
Alps_lou 2008-08-27
  • 打赏
  • 举报
回复
使用Me代替也是一样的错误。
这个Form1上只有一个Button,没有其他的控件了。

不知道怎么解决这个问题呢?
Tiger_Zhao 2008-08-27
  • 打赏
  • 举报
回复
用 Me 代替。

还有错误是否可能发生在 ResizeControlObject 内部,由于某些控件没有 Width 属性?
Alps_lou 2008-08-27
  • 打赏
  • 举报
回复
是启动了Form1后,点击Button,调用Command1_Click()函数,在此函数中调用DLL中的ResizeControlObject函数,来改变Form1中的控件的大小。
Tiger_Zhao 2008-08-27
  • 打赏
  • 举报
回复
你的 Form1 到底启动了没有?如果是当前窗体就直接用 Me 代替好了。
Alps_lou 2008-08-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Tiger_Zhao 的回复:]
改用这要的方式调用试试
VB codeOptionExplicitPublicAddSubAsAddClassPrivateSubCommand1_Click()Dimfrmasformsetfrm=form1SetAddSub=NewAddClass
AddSub.ResizeControlObject (frm)End Sub
[/Quote]
刚才试了一下,报一样的错误。
Tiger_Zhao 2008-08-27
  • 打赏
  • 举报
回复
改用这要的方式调用试试
Option Explicit 
Public AddSub As AddClass
Private Sub Command1_Click()
Dim frm as form
set frm = form1
Set AddSub = New AddClass
AddSub.ResizeControlObject (frm)
End Sub

1,451

社区成员

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

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