咨詢:調用FUNCITON時不使用call,則不能返回正確的值.
Private Sub Command1_Click()
'調用事件
Dim l_str As String
l_str = "Z "
GetNextString (l_str) '此調用不能返回正確的值.
' Call GetNextString(l_str) '此調用能返回正確的值.
MsgBox l_str '輸出 "Z "
End Sub
Private Function GetNextString(ByRef p_strValue As String) As Boolean
p_strValue = "0 "
End Function
在調用function前加上call則可得出正確的結果, 但為什麼一定要加上call呢? 沒有加的時候VB不會報錯, 而且還能正確調用. 但卻不會返回正確的結果.
[解决办法]
Option Explicit
Private Sub Command1_Click()
'調用事件
Dim l_str As String
l_str = "Z "
GetNextString l_str '此調用不能返回正確的值.
' Call GetNextString(l_str) '此調用能返回正確的值.
MsgBox l_str '輸出 "Z "
End Sub
Private Function GetNextString(ByRef p_strValue As String) As Boolean
p_strValue = "0 "
End Function
[解决办法]
Private Sub Command1_Click()
Dim l_str As String
l_str = "Z "
GetNextString l_str '这里不用加括号
MsgBox l_str '輸出 "0 "
End Sub
Private Function GetNextString(ByRef p_strValue As String) As Boolean
p_strValue = "0 "
End Function
[解决办法]
'下面的程序也正常,
Private Sub Command1_Click()
'調用事件
Dim tt As Boolean
Dim l_str As String
l_str = "Z "
tt = GetNextString(l_str) '此調用不能返回正確的值.
MsgBox l_str '輸出 "Z "
End Sub
Private Function GetNextString(ByRef p_strValue As String) As Boolean
p_strValue = "0 "
End Function
[解决办法]
不用call且未接收返回值的时候就不要加括号
加完括号后,byref对l_str就没有效果了
像GetNextString(l_str)这种用法,实际是GetNextString (l_str)
就是说把“(l_str)”作为表达式进行计算,把计算结果传给了GetNextString函数
因此GetNextString函数内部的操作不会影响到l_str
[解决办法]
GetNextString 首先要确定你这个函数的返回值的类型
一般boolean型,直接可以调用,不需call
其它类型:先定义一个变量(与函数返回值类型相同)
for ex:
dim str_AA as string=string.empty
private function GetNextString ( byval str_Test as string) as string
调用时应:str_AA=GetNextString (...)
[解决办法]
调用一个过程时,并不一定要使用 Call 关键字。如果使用 Call 关键字来调用一个需要参数的过程,argumentlist 就必须要加上括号。如果省略了 Call 关键字,那么也必须要省略 argumentlis 外面的括号。如果使用 Call 语法来调用内建函数或用户定义函数,则函数的返回值将被丢弃。
[解决办法]
这个问题本人还真的没有注意过,本人编程从来不使用Call,当然过程的参数部分也从来不去加括号,但这样的问题让我想到了VB.Net,它可是无论如何都会去加括号的,如果遇到同样的情况,不知道在.Net中 过程名(参数) 和 过程名((参数)) 会不会产生不同的结果
[解决办法]
好像没有发生过这个问题啊
[解决办法]
Private Function GetNextString(ByRef p_strValue As String) As Boolean
p_strValue = "0 "
End Function
改为
Private Function GetNextString(p_strValue As String) As Boolean
p_strValue = "0 "
GetNextString=true
End Function
[解决办法]
原因是,加了括号,就当成的按值传递了,而不是把地址传过去
[解决办法]
關注
[解决办法]
对啊,这个问题在MSDN中有明确说明的, 原文如下:
Call 语句
将控制权转移到一个 Sub 过程,Function 过程,或动态连接库 (DLL)过程。
语法
[Call] name [argumentlist]
Call 语句的语法具有以下几个部分:
部分 描述
Call 可选参数;关键字。如果指定了这个关键字,则 argumentlist 必须加上括号,例如:
Call MyProc(0)
name 必要参数,要调用的过程名称。
argumentlist
说明
调用一个过程时,并不一定要使用 Call 关键字。如果使用 Call 关键字来调用一个需要参数的过程,argumentlist 就必须要加上括号。如果省略了 Call 关键字,那么也必须要省略 argumentlis 外面的括号。如果使用 Call 语法来调用内建函数或用户定义函数,则函数的返回值将被丢弃。
若要将整个数组传给一个过程,使用数组名,然后在数组名后加上空括号。
Call 语句示例
下列示例示范如何使用 Call 语句来将控制转移到子过程、内在函数、和动态链接库(DLL)过程,
' 调用一个子过程。
Call PrintToDebugWindow( "Hello World ")
' 上面的语句将控制转移到下面的子过程。
Sub PrintToDebugWindow(AnyString)
Debug.Print AnyString ' 在“立即”窗口中显示。
End Sub
' 调用一个内在函数,函数的返回值被忽略不处理。
Call Shell(AppName, 1) ' AppName 包含可执行文件的路径。
' 调用 Microsoft Windows DLL 过程。该声明语句必需是类模块中的私有的,而不是标准模块中的。
Private Declare Sub MessageBeep Lib "User " (ByVal N As Integer)
Sub CallMyDll()
Call MessageBeep(0) ' 调用 Windows DLL 过程。
MessageBeep 0 ' 再次调用,但不用“调用”这个关键字。
End Sub