Объявление одинаковых функций в разных модулях

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Объявление одинаковых функций в разных модулях

Сообщение dimix » 15.09.2005 (Чт) 18:48

Есть у меня программка. Я использовал в ней чужой модуль (чего велосипед-то изобретать, тем более когда не умеешь :) ). В этом модуле объявлена функция:

Public Declare Function GetWindowLong Lib "user32".........

Понадобилось мне добавить еще один модуль (вы не поверите - снова чужой!). VB выругался нехорошими словами, типа что-то там с чем-то совпадает. Тогда я создал новый модуль и просто копирнул в него код. Когда стал смотреть, увидел, что и там объявляется GetWindowLong. Чем это черевато? Как может отрицательно сказаться на работе программы? И как с этим бороться? И, самое для меня непонятное, почему программа нормально работает? (или плохо проверял?). Ой, столько вопросов... Щас точно отправят книжки читать :roll:

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 15.09.2005 (Чт) 19:16

Действительно, неплохо бы почитать про область видимости (scope, scoping).
Моду создают модоки, а распространяют модозвоны.

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 15.09.2005 (Чт) 19:35

Дык, чукча не хочет быть читателем, чукча хочет быть писателем :D

Есть очень много всего, что было бы полезно почитать. А где взять время на это? Можете сказать: "ну и нефиг тогда было..." и в какой-то степени будете правы. Да только это все философия. Лучше объясните в двух словах, я понятливый :wink:

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 15.09.2005 (Чт) 19:48

Итак, создай два модуля - Module1 и Module2 и одну форму - Form1.

В Module1:
Код: Выделить всё
Public Sub Test()
    MsgBox "Чукча - бывший действительный член ССП!"
End Sub


В Module2:
Код: Выделить всё
Public Sub Test()
    Debug.Print "Who is Чукча?"
End Sub


В Form1:
Код: Выделить всё
Private Sub Form_Load()
    Test
End Sub


Жмешь F5. Лицезреешь сообщение: "Ambigious name detected: Test".
Как ты заметил, и в первом, и во втором модуле есть процедура Test, причем область видимости у них одна и та же (обе - Public, т.е. полная видимость. Private - видимость внутри модуля.) Поскольку компилятор не может решить, какую из двух процедур Test, обладающих одинаковой видимостью, надо использовать, то он говорит: "Ты чего?!"

Теперь в Module2 впиши еще:

Код: Выделить всё
Public Sub PrintTest()
    Test
End Sub


В Form1:

Код: Выделить всё
Private Sub Form_Load()
    Test
    PrintTest
End Sub


Что будет?
Покажется сообщение: "Чукча - бывший действительный член ССП!"
После закрытия сообщения в окне Immediate выведется строчка: "Who is Чукча?"

Понял?
Последний раз редактировалось hCORe 15.09.2005 (Чт) 20:10, всего редактировалось 1 раз.
Моду создают модоки, а распространяют модозвоны.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.09.2005 (Чт) 19:53

hCORe писал(а):Как ты заметил, и в первом, и во втором модуле есть процедура Test, причем область видимости у них одна и та же (обе - Public, т.е. полная видимость. Поставишь Friend - будет видимость в пределах проекта. Private - видимость внутри модуля.)

Friend в модулях не бывает. Только в классах.
Изображение

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 15.09.2005 (Чт) 21:18

Понял. Но только первую половину. Две процедуры, называются одинаково, видимость одинаковая, что выполнять не понятно - поэтому ошибка. Со второй половиной труднее... Что меняется от того, что во второй модуль мы добавили еще одну процедуру? Ведь Form_Load все равно сначала вызывает Test, а их по-прежнему две и по-прежнему видимость одинаковая...

P.S. Спасибо, что все-таки не послал а объяснил.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 15.09.2005 (Чт) 22:16

dimix, попробуй вызывать вункции с указанием имени модуля, например так:

Sub Form1_Load()
Call Module1.Test()
Call Module2.Test()
End Sub
ХЎ

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 16.09.2005 (Пт) 10:26

По поводу второй части...
Процедура Test() в модуле Module2 "невидима" из других модулей проекта, т.к. объявлена как Private. Зато внутри модуля вполне можно ее вызвать, что и делает c успехом Public-процедура PrintTest. Можно и вызывать функции и процедуры с указанием имени модуля и (если у тебя группа проектов) проекта.

Код: Выделить всё
Module1.ADTP
Project1.Module1.ADTP
Project2.Module1.ADTP
Моду создают модоки, а распространяют модозвоны.

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Сообщение Al Khamid » 16.09.2005 (Пт) 11:32

""
Последний раз редактировалось Al Khamid 02.12.2007 (Вс) 13:02, всего редактировалось 1 раз.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4168
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 16.09.2005 (Пт) 14:12

А еще в Public Declare Function есть волшебное слово Alias. Можно не делать никаких переадресаций, просто назвать по-разному ф-ции, и обе ф-ции иметь Public.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 16.09.2005 (Пт) 14:44

Да, но зачем ему две идентичных GetWindowLong под разными именами? К тому же, надо будет переименовывать все вхождения функции в одном из модулей. Иначе тоже будут конфликты.

Другое дело, когда Alias используется во благо: к примеру, с функциями, работающими с As Any (RtlMoveMemory, SendMessage, PostMessage)...
Моду создают модоки, а распространяют модозвоны.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot, Yandex-бот и гости: 12

    TopList  
cron