Let me add a couple points to the excellent explanation by Doug Lee. In VBScript, parentheses are not needed even when a return value is used if the function has no parameters. For example, the Date function returns today's date, and it may be called like d = Date rather than d = Date()
If the function has at least one parameter, however, parentheses are necessary if the return value is used. It is true that VBScript effectively passes a parameter by value if it is surrounded by parentheses. I think what is actually happening is that the enclosed parameter is evaluated as an expression before being passed to the routine. So, the parentheses syntactically denote an expression to be evaluated in-line, and then the resulting value, rather than a variable pointer, is passed to the routine. Jamal -- Original Message-- From: Doug Lee [EMAIL PROTECTED] Sent: Tuesday, September 02, 2008 2:18 PM To: [email protected] Subject: Re: can somebody help me with this? Several have answered already, but I have one thing to add. You indicate confusion about why parentheses seem to be required sometimes and not others. Of the following two lines, the first is invalid and the second is valid (at least as far as the syntax of using parentheses is concerned), for rather obscure reasons: ConnectEvent(DesktopWindow, "OnChildActivate", "MyOnChildActivate") Disconnect(Desktop.Window) Here's a brief but thorough treatment of why: If you're keeping the return value, always use parentheses. If you're not assigning the return value, you can use "call" and use parentheses or don't use "call" and also don't use parentheses. If you do not use "call" and still use parentheses, you'll get a syntax error unless the sub you're calling only takes one argument. This is because VBScript interprets the parentheses in that case as a request to pass the argument by value instead of by reference. To summarize by example, the following lines (which use hypothetical subs and functions) are all syntactically correct and have the indicated effects: ' Normal function calls, pass by reference. result = func1(arg1) result = func2(arg1, arg2) ' The same but passing all results by value. result = func1((arg1)) result = func2((arg1), (arg2)) ' The same four but for subs that don't return anything. ' First using "call," though this is older and a deprecated style. call func1(arg1) call func2(arg1, arg2) call func1((arg1)) call func2((arg1), (arg2)) ' Now using the newer style, without "call." ' First pass-by-reference, the usual case. func1 arg1 func2 arg1, arg2 ' And finally, the pass-by-value case that caused all the confusion. func1 (arg1) func2 (arg1), (arg2) Notice in particular that the next-to-last line above looks just like a "normal" sub invocation, but using parentheses around the argument. That line just happens to succeed syntacticatlly because of the pass-by-value thing. The last line, though, fails, because in order to pass arguments by value, you have to surround each argument individually with parentheses, not surround the whole lot of them with a single set. I regard the above parentheses issue as one of the more confusing issues in VBScript for those who get their start in another language. On Sat, Aug 30, 2008 at 04:43:26AM -0700, martin webster wrote: Hi all, I got an example from Doug which disables most hotkeys globally, but I can't seem to get this routine to work in VB script. I get the error, "cannot call a sub with parentheses when calling a sub". I've looked at some other examples I have and this looks correct to me. This script should disable most hotkeys for 5 seconds, and then disconnect this event, in other words, I want this action only to accur for 5 seconds, and then I want the hotkeys to be enabled again. Begin VB script. ConnectEvent(DesktopWindow, "OnChildActivate", "MyOnChildActivate") Sub MyOnChildActivate(win) win.Overlap.Settings.General.Hotkeys = FALSE Sleep 5000 Disconnect(Desktop.Window) Playsound, "c:\whistle wake.wav" End Sub Warm regards. Martin Webster. -- Doug Lee, Senior Accessibility Programmer SSB BART Group - Accessibility-on-Demand mailto:[EMAIL PROTECTED] http://www.ssbbartgroup.com "While they were saying among themselves it cannot be done, it was done." --Helen Keller
