Привет всем!
Очень рад, что появился этот форум.
Несколько вопросов: Чем отличается вызов функции с параметрами через пробел (msgbox "alex") от скобок (msgbox("alex"))?
Для чего и в каких случаях применяется конструкция obj!member. Чем это отличается от обычной точки?
Здравствуйте Алекс, Вы писали:
А>Несколько вопросов: Чем отличается вызов функции с параметрами через пробел (msgbox "alex") от скобок (msgbox("alex"))?
в данном случае они идентичны
это различие проявляется при вызове процедуры или функции с несколькими параметрами
функции вызываются так: a=FuncName(param1,param2,param3)
процедуры так: ProcName param1,param2,param3
Здравствуйте SergeMS, Вы писали:
SMS>Здравствуйте Алекс, Вы писали:
А>>Для чего и в каких случаях применяется конструкция obj!member. Чем это отличается от обычной точки?
SMS>насколько я помню, этот способ применялся в старых версиях VB SMS>сейчас надо применять object.member
SMS>эта конструкция применяется сечас только в ADO, но и ее рекомендуют не использовать SMS>recordset!fieldname -> Recordset.Fields("FieldName").Value
SMS>кстати, этот способ (с использованием точки) быстрее на 10-15% SMS>и в VB.NET только он и остался
Здравствуйте Алекс, Вы писали:
А>Привет всем! А>Очень рад, что появился этот форум. :) А>Несколько вопросов: Чем отличается вызов функции с параметрами через пробел (msgbox "alex") от скобок (msgbox("alex"))? А>Для чего и в каких случаях применяется конструкция obj!member. Чем это отличается от обычной точки?
Есть тут одна хитрость. Например имеем такой код:
private sub Main()
dim l_lngValue as long
l_lngValue = 10
SomeSub l_lngValue
call MsgBox(cstr(l_lngValue)) ' l_lngValue = 11
SomeSub (l_lngValue)
call MsgBox(cstr(l_lngValue)) ' l_lngValue опять = 11 !!!call SomeSub(l_lngValue)
call MsgBox(cstr(l_lngValue)) ' l_lngValue = 12end sub
private sub SomeSub(byref a_lngArg as long)
a_lngArg = a_lngArg + 1
end sub
Причём в документации про данные финты ушами ничего не сказано (по крайней мере я ничего не нашёл).
(VB 6 pro, sp4)
Здравствуйте grigorash, Вы писали:
G>Здравствуйте Алекс, Вы писали:
А>>Привет всем! А>>Очень рад, что появился этот форум. А>>Несколько вопросов: Чем отличается вызов функции с параметрами через пробел (msgbox "alex") от скобок (msgbox("alex"))? А>>Для чего и в каких случаях применяется конструкция obj!member. Чем это отличается от обычной точки? G>Есть тут одна хитрость. Например имеем такой код:
G>
G>private sub Main()
G>dim l_lngValue as long
G> l_lngValue = 10
G>
G> SomeSub l_lngValue
G> call MsgBox(cstr(l_lngValue)) ' l_lngValue = 11
G>
G> SomeSub (l_lngValue)
G> call MsgBox(cstr(l_lngValue)) ' l_lngValue опять = 11 !!!
G>
G> call SomeSub(l_lngValue)
G> call MsgBox(cstr(l_lngValue)) ' l_lngValue = 12
G>
G>end sub
G>private sub SomeSub(byref a_lngArg as long)
G> a_lngArg = a_lngArg + 1
G>end sub
G>
G>Причём в документации про данные финты ушами ничего не сказано (по крайней мере я ничего не нашёл). G>(VB 6 pro, sp4)
А это че за проект такой?
А консольные аплитухи писать можно?
Здравствуйте Алекс, Вы писали:
А>Здравствуйте grigorash, Вы писали:
G>>Здравствуйте Алекс, Вы писали:
А>А это че за проект такой? А>А консольные аплитухи писать можно?
Создай Standard Exe, а private sub Main замени на private sub Form_Load
Здравствуйте grigorash, Вы писали:
G>Здравствуйте Алекс, Вы писали:
А>>Здравствуйте grigorash, Вы писали:
G>>>Здравствуйте Алекс, Вы писали:
А>>А это че за проект такой? А>>А консольные аплитухи писать можно? G>Создай Standard Exe, а private sub Main замени на private sub Form_Load
Ты не понял вопрос: консольные аплитухи на VB создавать можно?
Здравствуйте grigorash, Вы писали:
G>Здравствуйте Алекс, Вы писали:
А>>Привет всем! А>>Очень рад, что появился этот форум. А>>Несколько вопросов: Чем отличается вызов функции с параметрами через пробел (msgbox "alex") от скобок (msgbox("alex"))? А>>Для чего и в каких случаях применяется конструкция obj!member. Чем это отличается от обычной точки? G>Есть тут одна хитрость. Например имеем такой код:
G>
G>private sub Main()
G>dim l_lngValue as long
G> l_lngValue = 10
G>
G> SomeSub l_lngValue
G> call MsgBox(cstr(l_lngValue)) ' l_lngValue = 11
G>
G> SomeSub (l_lngValue)
G> call MsgBox(cstr(l_lngValue)) ' l_lngValue опять = 11 !!!
G>
G> call SomeSub(l_lngValue)
G> call MsgBox(cstr(l_lngValue)) ' l_lngValue = 12
G>
G>end sub
G>private sub SomeSub(byref a_lngArg as long)
G> a_lngArg = a_lngArg + 1
G>end sub
G>
G>Причём в документации про данные финты ушами ничего не сказано (по крайней мере я ничего не нашёл). G>(VB 6 pro, sp4)
Когда ты пишеш call SomeSub(l_lngValue), то это аналогично SomeSub l_lngValue, при этом параметр передается
по ссылке, и SomeSub его изменяет. Когда же ты пишеш SomeSub (l_lngValue) (без call!), то происходит следуещее:
VB передает в SomeSub не ссылку не l_lngValue, а результат вычисления выражения (l_lngValue) (такое вот выражение).
Этим объясняется то, что в твоем примере значение l_lngValue не изменяется. Этот же эффект будет, например
в случае SomeSub (l_lngValue + 1 — 1).
А если ты напишеш SomeSub с двумя параметрами, то ты вообще не засавиш ее так вызыватья :
SomeSub (A, B) ' ошибка, но
SomeSub (A), (B) ' — ок
Запись параметра функции в скобках — стандартный способ запрешения передачи парамета по ссылке в VB.
Здравствуйте al, Вы писали:
al>Когда ты пишеш call SomeSub(l_lngValue), то это аналогично SomeSub l_lngValue, при этом параметр передается al>по ссылке, и SomeSub его изменяет. Когда же ты пишеш SomeSub (l_lngValue) (без call!), то происходит следуещее: al>VB передает в SomeSub не ссылку не l_lngValue, а результат вычисления выражения (l_lngValue) (такое вот выражение). al>Этим объясняется то, что в твоем примере значение l_lngValue не изменяется. Этот же эффект будет, например al>в случае SomeSub (l_lngValue + 1 — 1).
al>А если ты напишеш SomeSub с двумя параметрами, то ты вообще не засавиш ее так вызыватья :
al>SomeSub (A, B) ' ошибка, но al>SomeSub (A), (B) ' — ок
al>Запись параметра функции в скобках — стандартный способ запрешения передачи парамета по ссылке в VB.
проще всего использовать следующий вариант записи:
1) всегда объявлять способ передачи аргументов в процедуру
Sub SomeSub(ByVal arg1 As Integer)
2) использовать стандартный способ вызова процедуры
SMS>проще всего использовать следующий вариант записи:
SMS>1) всегда объявлять способ передачи аргументов в процедуру SMS> Sub SomeSub(ByVal arg1 As Integer)
SMS>2) использовать стандартный способ вызова процедуры
SMS> a=123 SMS> SomeSub a
Ты не понял. Конечно, в идеале нужно писать ByVal когда это надо (а в VB7 это вообще делается по умолчанию).
Под стандарным способом запрета я имел в виду тот случай, когда есть процедура, получающая, изменяющая и возвращающая
параметр по ссылке, но в какм-то месте программы при ее вызове изменение аргумента не желательно. В этом случае
вместо введения временной переменной, можно просто заключить параметр в скобки.