控件可以当作参数进行传递吗

泥们的脑哥 2019-04-28 03:29:05
例如图里 ,但是会报错要求对象。 只能把控件名称作为字符串通过controls进行传递,有大佬解惑吗,是为什么。 新人只有20分,见笑了
...全文
526 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
milaoshu1020 2019-04-30
  • 打赏
  • 举报
回复
引用 13 楼 亚纹 的回复:
回楼上
ttt x 传递的实参是tt
ttt (x) 传递的是实参是 (x) 表达式 这里的() 是运算符 ,而因为是表达式 其结果保存在临时变量中,与所调用的形参 类型不一样 当然报错!!
所以不要用 ttt (x) 这种写法
要么 ttt x
要么 Call ttt (x)

哦,原来如此.
亚纹 2019-04-30
  • 打赏
  • 举报
回复
回楼上
ttt x 传递的实参是tt
ttt (x) 传递的是实参是 (x) 表达式 这里的() 是运算符 ,而因为是表达式 其结果保存在临时变量中,与所调用的形参 类型不一样 当然报错!!
所以不要用 ttt (x) 这种写法
要么 ttt x
要么 Call ttt (x)
脆皮大雪糕 2019-04-29
  • 打赏
  • 举报
回复
参数声明的是object 是一个对象指针,而不是一个字符串。代码里面的名称字符串只是为了让人看明白,编译以后,这些名字都是各种对象、寄存器的内存地址,这是让CPU看的。所以你如果很明确的传递一个名字进去是不行的,除非你自己在函数里面再进行一次名字和对象的对应转换。 如果非要说传名字,有一个 CallByName 具体的用法查MSDN,那也只是对某个对象的属性方法可以用字符串来call,对象本身还是要用指针传入。
milaoshu1020 2019-04-29
  • 打赏
  • 举报
回复
回9楼,我试了下,真的跟括号有关系!加了括号就报错,搞不明白;
回楼上,确实是脱了裤子放屁,因为Controls本来就可以Controls("Name")这么用,不用另外再放到集合中了;
代码如下:

Option Explicit

Private Sub Command1_Click()
tt
End Sub

Sub ttt(ByRef obj As Object)
MsgBox obj.ListCount
End Sub

Sub tt()
ttt fmDataMerge.lbLot
'ttt (fmDataMerge.lbLot) ' 会出错!
End Sub

Private Sub Command2_Click()
Controls("lbLot").AddItem Rnd
End Sub

运行示例:


下载地址:
链接:https://pan.baidu.com/s/1dwPn-IT-gpr9C2oA1swWtg
提取码:e1p7
脆皮大雪糕 2019-04-29
  • 打赏
  • 举报
回复
用脱裤子放屁的方式使用字符串调用对象: 窗体上两个textbox,一个按钮,试试下面这个代码

Option Explicit
Dim allCtl As New Collection

Private Sub Form_Load()
    Dim ctl
    '初始化,把所有控件放到集合里,并用控件名作为对象的索引key
    For Each ctl In Me.Controls
        allCtl.Add ctl, ctl.Name
    Next
End Sub
Private Sub Command1_Click()
    Call test("Text1", "这是一个测试")
    Call test("Text2", "测试结果看这里")
End Sub

Private Sub test(ByVal strObj As String, ByVal strDisp As String)
    '用控件名提取控件对象,并操作对象的text属性
    allCtl(strObj).Text = strDisp
End Sub

脆皮大雪糕 2019-04-29
  • 打赏
  • 举报
回复
引用 8 楼 weixin_44196531 的回复:
[quote=引用 5 楼 脆皮大雪糕 的回复:]参数声明的是object 是一个对象指针,而不是一个字符串。代码里面的名称字符串只是为了让人看明白,编译以后,这些名字都是各种对象、寄存器的内存地址,这是让CPU看的。所以你如果很明确的传递一个名字进去是不行的,除非你自己在函数里面再进行一次名字和对象的对应转换。 如果非要说传名字,有一个 CallByName 具体的用法查MSDN,那也只是对某个对象的属性方法可以用字符串来call,对象本身还是要用指针传入。
谢谢,明白一些了。对向本身用指针传入要用什么方法呢,能简单说一下思路吗。其实我的本意例如:有多个按钮相同的功能,只是涉及的listbox不一样,我想只写一段代码,靠传递控件名称的方法执行。[/quote] 觉得你需要的是控件数组
舉杯邀明月 2019-04-29
  • 打赏
  • 举报
回复
我刚才写了段代码来试了下。


发现你的“错误”原因是你的代码写法问题。
你把那行代码: ttt(tt)
改成: call ttt(tt)
或者把括号去掉试试。


泥们的脑哥 2019-04-29
  • 打赏
  • 举报
回复
引用 5 楼 脆皮大雪糕 的回复:
参数声明的是object 是一个对象指针,而不是一个字符串。代码里面的名称字符串只是为了让人看明白,编译以后,这些名字都是各种对象、寄存器的内存地址,这是让CPU看的。所以你如果很明确的传递一个名字进去是不行的,除非你自己在函数里面再进行一次名字和对象的对应转换。 如果非要说传名字,有一个 CallByName 具体的用法查MSDN,那也只是对某个对象的属性方法可以用字符串来call,对象本身还是要用指针传入。
谢谢,明白一些了。对向本身用指针传入要用什么方法呢,能简单说一下思路吗。其实我的本意例如:有多个按钮相同的功能,只是涉及的listbox不一样,我想只写一段代码,靠传递控件名称的方法执行。
泥们的脑哥 2019-04-29
  • 打赏
  • 举报
回复
引用 4 楼 milaoshu1020 的回复:
试试这样:

sub ttt(byref obj as object)
msgbox obj.listcount
end sub

sub tt()
ttt(fmdatamerge.lblot)
end sub
也不可以
泥们的脑哥 2019-04-29
  • 打赏
  • 举报
回复
引用 1 楼 舉杯邀明月 的回复:
先不说别的,你的sub ttt( )的代码肯定是错的!

a 的“类型”是 object ,而 a.listcount (假设实参有这个属性)的类型肯定是“整数”。
试想:一个“整数”,岂能赋值给一个 Object ???
a=a.listcount是我写错了,换成其他变量也不可以
milaoshu1020 2019-04-28
  • 打赏
  • 举报
回复
试试这样:

sub ttt(byref obj as object)
msgbox obj.listcount
end sub

sub tt()
ttt(fmdatamerge.lblot)
end sub
X-i-n 2019-04-28
  • 打赏
  • 举报
回复
图呢? 图呢? 图呢?
舉杯邀明月 2019-04-28
  • 打赏
  • 举报
回复
不知道 C# 可不可以这样写。


舉杯邀明月 2019-04-28
  • 打赏
  • 举报
回复
先不说别的,你的sub ttt( )的代码肯定是错的!

a 的“类型”是 object ,而 a.listcount (假设实参有这个属性)的类型肯定是“整数”。
试想:一个“整数”,岂能赋值给一个 Object ???

2,462

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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