回 帖 发 新 帖 刷新版面

主题:[讨论]关于CallByName的args()参数里不能有me的问题

[code=c]
'* clsAdapter.cls里
Option Explicit
Public Function f1(ByVal a As Integer, ByVal b As Integer, ByRef f As Form1)
    Debug.Print f.Caption
    f1 = a + b
End Function
Public Function f2(ByVal a As Integer, ByVal b As Integer, ByRef f As Form1)
    Debug.Print f.Caption
    f1 = a - b
End Function

'* form1.frm里
Option Explicit
Private Sub Command1_Click()
Dim a As clsAdapter
Set a = New clsAdapter
'如果直接使用Me作为实参传递给f1,则发生 450错误,错误的参数号或无效的属性赋值
'debug.print CallByName(a,"f" & "1",VbMethod,5,9,Me)
'必须另外生成Me的一个拷贝,再作为实参作递给f1 !
Dim f As Form1
Set f = Me
Debug.Print CallByName(a, "f" & "1", VbMethod, 5, 9, f)
set f=nothing
'debug.print Me is Nothing     '结果应为False
End Sub[/code]
[em10][em10],看来有时间得好好看看Matthew Curland的《高级Visual Basic编程》了...

回复列表 (共5个回复)

沙发

又没人理.没人遇到过类似问题?

板凳

你把 me 改为 Form1 试试

3 楼

由于这个窗体需要能够同时生成它的多个实例,且相互之间不能干扰,所以每次在使用时,都是
dim frm as new From1
frm.show
来使用
而不是form1.show 。(可以认为Form1.show就像是单例模式一样?)
在form1的代码里,所以只能用Me来指代当前窗体对象,而不能用Form1。 (用Form1就相当于又生成一个Form1的新引用),但用Me作为实参传递到CallByName的Args()参数时,就出现了上面的问题

PS.:关于"用Form1就相当于又生成一个Form1的新引用"的问题,可以用以下的代码验证
在Form1里
[code=c]
Option Explicit
Private Sub Command1_Click()
Static n As Integer
Dim frm As Form2
Set frm = New Form2
n = n + 1
frm.Caption = "new Instance " & n
frm.Show
Set frm = Nothing
End Sub
[/code]在Form2里
[code=c]Option Explicit
Private Sub Command1_Click()
    '使用Me来引用当前对象,不会增加新的引用。把所有的窗体关闭后,在IDE里应该会退出
    MsgBox Me.Caption     '显示"new Instance n"
    '直接使用Form2来指示当前对象时,会增加一个新的引用(只增加一个,而不是每次增加一个?)。把所有窗体关闭后,在IDE里也没有退出,因为Form2的引用计数不为0
    'MsgBox Form2.Caption   '显示"Form2"
End Sub
[/code]

4 楼

没用过,不过你想简洁的话,可以用 :Command1.Parent ,不想用command1还可以转个圈圈:Me.ActiveControl.Parent 呵呵

5 楼

哎,这问题没讨论的必要。都已经自己解决了的

我来回复

您尚未登录,请登录后再回复。点此登录或注册