Вопрос
От: Алекс Россия http://wise-orm.com
Дата: 08.04.02 04:01
Оценка:
Привет всем!
Очень рад, что появился этот форум.
Несколько вопросов: Чем отличается вызов функции с параметрами через пробел (msgbox "alex") от скобок (msgbox("alex"))?
Для чего и в каких случаях применяется конструкция obj!member. Чем это отличается от обычной точки?
Re: Вопрос
От: SergeMS Россия  
Дата: 08.04.02 04:13
Оценка:
Здравствуйте Алекс, Вы писали:

А>Несколько вопросов: Чем отличается вызов функции с параметрами через пробел (msgbox "alex") от скобок (msgbox("alex"))?


в данном случае они идентичны
это различие проявляется при вызове процедуры или функции с несколькими параметрами

функции вызываются так: a=FuncName(param1,param2,param3)
процедуры так: ProcName param1,param2,param3
Re: Вопрос
От: SergeMS Россия  
Дата: 08.04.02 05:04
Оценка: 9 (1)
Здравствуйте Алекс, Вы писали:

А>Для чего и в каких случаях применяется конструкция obj!member. Чем это отличается от обычной точки?


насколько я помню, этот способ применялся в старых версиях VB
сейчас надо применять object.member

эта конструкция применяется сечас только в ADO, но и ее рекомендуют не использовать
recordset!fieldname -> Recordset.Fields("FieldName").Value

кстати, этот способ (с использованием точки) быстрее на 10-15%
и в VB.NET только он и остался
Re[2]: Вопрос
От: Алекс Россия http://wise-orm.com
Дата: 08.04.02 05:13
Оценка:
Здравствуйте SergeMS, Вы писали:

SMS>Здравствуйте Алекс, Вы писали:


А>>Для чего и в каких случаях применяется конструкция obj!member. Чем это отличается от обычной точки?


SMS>насколько я помню, этот способ применялся в старых версиях VB

SMS>сейчас надо применять object.member

SMS>эта конструкция применяется сечас только в ADO, но и ее рекомендуют не использовать

SMS>recordset!fieldname -> Recordset.Fields("FieldName").Value

SMS>кстати, этот способ (с использованием точки) быстрее на 10-15%

SMS>и в VB.NET только он и остался

Great thanks.
Re: Вопрос
От: grigorash Россия www.geoserver.ru
Дата: 08.04.02 07:27
Оценка:
Здравствуйте Алекс, Вы писали:

А>Привет всем!

А>Очень рад, что появился этот форум. :)
А>Несколько вопросов: Чем отличается вызов функции с параметрами через пробел (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 = 12
    
end sub

private sub SomeSub(byref a_lngArg as long)
    a_lngArg = a_lngArg + 1
end sub

Причём в документации про данные финты ушами ничего не сказано (по крайней мере я ничего не нашёл).
(VB 6 pro, sp4)
Re[2]: Вопрос
От: Алекс Россия http://wise-orm.com
Дата: 08.04.02 08:31
Оценка:
Здравствуйте 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)

А это че за проект такой?
А консольные аплитухи писать можно?
Re[3]: Вопрос
От: grigorash Россия www.geoserver.ru
Дата: 08.04.02 14:16
Оценка:
Здравствуйте Алекс, Вы писали:

А>Здравствуйте grigorash, Вы писали:


G>>Здравствуйте Алекс, Вы писали:


А>А это че за проект такой?

А>А консольные аплитухи писать можно?
Создай Standard Exe, а private sub Main замени на private sub Form_Load
Re[4]: Вопрос
От: Алекс Россия http://wise-orm.com
Дата: 09.04.02 03:03
Оценка:
Здравствуйте grigorash, Вы писали:

G>Здравствуйте Алекс, Вы писали:


А>>Здравствуйте grigorash, Вы писали:


G>>>Здравствуйте Алекс, Вы писали:


А>>А это че за проект такой?

А>>А консольные аплитухи писать можно?
G>Создай Standard Exe, а private sub Main замени на private sub Form_Load

Ты не понял вопрос: консольные аплитухи на VB создавать можно?
Re[5]: Вопрос
От: SergeMS Россия  
Дата: 09.04.02 03:07
Оценка:
Здравствуйте Алекс, Вы писали:


А>Ты не понял вопрос: консольные аплитухи на VB создавать можно?


нельзя
Re[6]: Вопрос
От: grigorash Россия www.geoserver.ru
Дата: 09.04.02 06:05
Оценка:
Здравствуйте SergeMS, Вы писали:

SMS>Здравствуйте Алекс, Вы писали:



А>>Ты не понял вопрос: консольные аплитухи на VB создавать можно?


SMS>нельзя

Очень даже можно. Пример: cool site
Re[7]: Вопрос
От: SergeMS Россия  
Дата: 09.04.02 06:10
Оценка:
Здравствуйте grigorash, Вы писали:

G>Очень даже можно. Пример: cool site


ну так ведь это с использованием Win32 API
с ним много что можно делать

стандартными средствами нельзя
Re[2]: Вопрос
От: al Россия  
Дата: 11.04.02 08:21
Оценка: 6 (1)
Здравствуйте 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.


Re[3]: Вопрос
От: SergeMS Россия  
Дата: 11.04.02 08:30
Оценка:
Здравствуйте 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) использовать стандартный способ вызова процедуры

a=123
SomeSub a
Re[4]: Вопрос
От: al Россия  
Дата: 11.04.02 08:54
Оценка:
SMS>проще всего использовать следующий вариант записи:

SMS>1) всегда объявлять способ передачи аргументов в процедуру

SMS> Sub SomeSub(ByVal arg1 As Integer)

SMS>2) использовать стандартный способ вызова процедуры


SMS> a=123

SMS> SomeSub a



Ты не понял. Конечно, в идеале нужно писать ByVal когда это надо (а в VB7 это вообще делается по умолчанию).
Под стандарным способом запрета я имел в виду тот случай, когда есть процедура, получающая, изменяющая и возвращающая
параметр по ссылке, но в какм-то месте программы при ее вызове изменение аргумента не желательно. В этом случае
вместо введения временной переменной, можно просто заключить параметр в скобки.


 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.