Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как использовать модули класса из других проектов VBA? / 25 сообщений из 27, страница 1 из 2
02.02.2005, 12:17
    #32896699
tesia2003
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
Одно большое приложение Access (ADP) разбито на 3 части: 1 - содержит только пользовательские модули классов, 2 и 3 содержат собственные формы и отчеты, включая модули классов этих форм и отчетов. В этих модулях должны рождаться экземпляры классов из 1.
Я попытался установить ссылки в References в приложениях 2 и 3 на 1. При этом в проектах VBA 2 и 3 действительно появились ссылки на проект VBA в 1.
Однако, непонятно можно ли и как правильно создать экземпляр класса?
Где бы глянуть примерчик?

Спасибо!
...
Рейтинг: 0 / 0
02.02.2005, 12:36
    #32896759
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
1) для того, чтобы объявления интерфейсов классов были видимыми,
Instancing класса должен быть PublicNotCreatable
2) Создавать экземпляры таких классов нужно функциями, помещенными в публичный (не private) обычный модуль
...
Рейтинг: 0 / 0
02.02.2005, 12:41
    #32896784
Serge Gavrilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
Надо изменить атрибуты класса, для этого выполните экспорт класса в файл cls, откройте файл в текстовом редакторе и замените атрибуты

Код: plaintext
1.
2.
3.
Attribute VB_Creatable = True 
Attribute VB_PredeclaredId = True 
Attribute VB_Exposed = True 
Потом выполните либо импорт файла (File - Import File) либо вставку файла (Insert - File) в пустой модуль класса, удалив лишние (выделенные красным) строки.
...
Рейтинг: 0 / 0
02.02.2005, 13:22
    #32896924
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
Serge GavrilovНадо изменить атрибуты класса, для этого выполните экспорт класса в файл cls, откройте файл в текстовом редакторе и замените атрибуты

Код: plaintext
1.
2.
3.
Attribute VB_Creatable = True 
Attribute VB_PredeclaredId = True 
Attribute VB_Exposed = True 
Потом выполните либо импорт файла (File - Import File) либо вставку файла (Insert - File) в пустой модуль класса, удалив лишние (выделенные красным) строки.

Attribute VB_Exposed = True - заявляем глобальную видимость интерфейса
Attribute VB_Creatable = True - типа разрешаем создание из клиента
а этим - Attribute VB_PredeclaredId = True - что говорим (хотим сказать)?

PS
что-то подобное вычитывал когда-то (кажется, у Каплана)...
кажется, оно даже работало под 97м...

повторно интерес возник уже в 2002м.
заставить заработать New подобным образом мне удалось.
успокоился на ранее отсоветованном варианте...
...
Рейтинг: 0 / 0
02.02.2005, 13:24
    #32896931
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
очепятка:

заставить заработать New подобным образом НЕ мне удалось

(с выражением лица)
...
Рейтинг: 0 / 0
02.02.2005, 13:25
    #32896932
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
мне НЕ
...
Рейтинг: 0 / 0
02.02.2005, 13:26
    #32896937
tesia2003
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
Serge GavrilovНадо изменить атрибуты класса, для этого выполните экспорт класса в файл cls, откройте файл в текстовом редакторе и замените атрибуты

Код: plaintext
1.
2.
3.
Attribute VB_Creatable = True 
Attribute VB_PredeclaredId = True 
Attribute VB_Exposed = True 
Потом выполните либо импорт файла (File - Import File) либо вставку файла (Insert - File) в пустой модуль класса, удалив лишние (выделенные красным) строки.

Да, спасибо, вроде бы что-то получилось. Но вот только проблемы при создании объекта с ключевым словом New:
Dim cnn As NEW sys.sCnn
(sys - проект типа 1, sCnn - модуль класса в нем)
Говорит: неправильное использование ключевого слова NEW
Как правильно создать новый объект?

И еще - у меня таких классов штук 200. Неужели нет других способов изменения атрибутов? Это за пределами возможностей Access?
...
Рейтинг: 0 / 0
02.02.2005, 13:34
    #32896969
tesia2003
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
Victosha1) для того, чтобы объявления интерфейсов классов были видимыми,
Instancing класса должен быть PublicNotCreatable
2) Создавать экземпляры таких классов нужно функциями, помещенными в публичный (не private) обычный модуль

Спасибо.
Не понял, как выполнить условие 1)
У меня классов 200 штук, которые вызываются на каждом шагу - это что, еще 200 штук функций писать надо? или я чего-то не понял?
...
Рейтинг: 0 / 0
02.02.2005, 13:48
    #32897020
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
tesia2003 Victosha1) для того, чтобы объявления интерфейсов классов были видимыми,
Instancing класса должен быть PublicNotCreatable
2) Создавать экземпляры таких классов нужно функциями, помещенными в публичный (не private) обычный модуль

Спасибо.
Не понял, как выполнить условие 1)
У меня классов 200 штук, которые вызываются на каждом шагу - это что, еще 200 штук функций писать надо? или я чего-то не понял?

если ты выполнишь подобны экспорт-импорт, оно само таким станет

иначе, если акцесс 2000 и старше, то - в оне редактора жми Ctrl-R - появится окно эксплорера проекта со списком классов/модулей,

далее жми F4
появится окно свойств

далее в эксплорере выбираешь нужный класс
во второй строке свойств класса (Instancing) через комбобокс выбираешь PublicNotCreatable

дальше заводишь обычный модуль в библиотечном проекте
и пишешь в нем функцию

Код: plaintext
1.
2.
function createMyClass As MyClass
  set createMyClass = new MyClass
end function

что получаешь в итоге:

методы классов объявленных как PublicNotCreatable могут быть (и хорошо если будут) пустыми, без реализации.

каждому такому классуу может соответствовать произвольное количество внутренних, не видимых снаружи классов, каждый из которых реализует поведение заявленного интерфейса с применением ключевого слова
Implements

Твоя порождающая функция тогда может быть записана так

Код: plaintext
1.
2.
function createMyClass As MyClass
  set createMyClass = new MyInternalClass
end function

еще замечание - все функции, записанные в обычном модуле библиотеки будут видны с клиента.

Если тебе нужно скрыть часть функций, размести их в модуле, в объявлениях
которого содержится предложение

Код: plaintext
Option Private Module
...
Рейтинг: 0 / 0
02.02.2005, 14:02
    #32897058
Serge Gavrilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
Victosha
а этим - Attribute VB_PredeclaredId = True - что говорим (хотим сказать)?


На самом деле для New это можно не использовать. Этот аттрибут имеет смысл при импорте файла (не вставке)
А что означает? Именно, я бы сказал, предекларирование, т.е. объявлять уже не нужно - сраззу ссылка на класс и метод (свойство)

MsgBox MyClass.Name

Victosha...заставить заработать New подобным образом НЕ мне удалось

Не знаю, только что попробовал в Access 2002, работает

tesia2003Да, спасибо, вроде бы что-то получилось. Но вот только проблемы при создании объекта с ключевым словом New:
Dim cnn As NEW sys.sCnn

Вы как вставляли модуль? Может именно VB_PredeclaredId = True мешает при импорте, попробуйте убрать
...
Рейтинг: 0 / 0
02.02.2005, 14:12
    #32897098
Serge Gavrilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
Еще удобен атрибут VB_Description, можно добавлять свое описание, которое будет видно в Object Browser
...
Рейтинг: 0 / 0
02.02.2005, 14:44
    #32897231
tesia2003
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
Serge Gavrilov Victosha
а этим - Attribute VB_PredeclaredId = True - что говорим (хотим сказать)?


На самом деле для New это можно не использовать. Этот аттрибут имеет смысл при импорте файла (не вставке)
А что означает? Именно, я бы сказал, предекларирование, т.е. объявлять уже не нужно - сраззу ссылка на класс и метод (свойство)

MsgBox MyClass.Name

Victosha...заставить заработать New подобным образом НЕ мне удалось

Не знаю, только что попробовал в Access 2002, работает

tesia2003Да, спасибо, вроде бы что-то получилось. Но вот только проблемы при создании объекта с ключевым словом New:
Dim cnn As NEW sys.sCnn

Вы как вставляли модуль? Может именно VB_PredeclaredId = True мешает при импорте, попробуйте убрать

Способ Victosha (через глобальные библиотечные функции) работает железно!

А вот NEW побороть не удалось (у меня XP). Файл импортировал. Независимо от VB_PredeclaredId выдает ошибку на NEW
...
Рейтинг: 0 / 0
02.02.2005, 15:10
    #32897303
Serge Gavrilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
tesia2003
А вот NEW побороть не удалось (у меня XP). Файл импортировал. Независимо от VB_PredeclaredId выдает ошибку на NEW
Да, согласен, через импорт получается только глобальный класс, который не надо декларировать (VB_PredeclaredId = True)
А через меню Insert - File предложенный мной способ со строками
Attribute VB_Creatable = True
Attribute VB_Exposed = True
работает тоже "железно" :-)
по крайней мере у меня
Victosha, не проверишь?
tesia2003
Способ Victosha (через глобальные библиотечные функции) работает железно!

Видны ли при этом классы, их свойства и методы в Object Browser?
...
Рейтинг: 0 / 0
02.02.2005, 15:26
    #32897341
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
щаз посмотрю.

----------------
про видимость - в просмотрщике объектов видно.
PublicNotCreatable - он тут в стандартной функции объявления интерфейса
используется. Фактически как чистое объявление типа данных.
(чисто TypeLibrary - Так думаю, что в атрибутах это чистая комбинация
Attribute VB_Exposed = True
и
Attribute VB_Creatable = False
и
Attribute VB_GlobalNameSpace = False
)

Более того - реализация вообще может быть локальной
так, если заявлен Iface1 и Iface2 и есть библиотечная функия CreateIface1

а у IFace1
заявлен Sub TestSub( IobjFace1 as IFace1)

то на клиенте можно получить экземпляр

dim obj1 as IFace1
set obj1 = createIface1

пусть есть локальный клиентский класс
clsLocImplClass

который реализует IFace2

тогда продолжение кода будет таким

dim obj2 as clsLocImplClass

set obj2 = New clsLocImplClass

call obj1.TestSub(obj2)

ЗЫ2
про msgbox MyClass.Name сильно заинтересовался, вечером надо глянуть...
...
Рейтинг: 0 / 0
02.02.2005, 15:28
    #32897342
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
поторопился - д.б. так

автора у IFace1
заявлен Sub TestSub( IobjFace as IFace2)
(с выражением лица)
...
Рейтинг: 0 / 0
02.02.2005, 15:38
    #32897362
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
с разбегу не получилось "проимпортировать правильно"
видимо, Attribute VB_Creatable = True сбрасывается в момент сохранения модуля.

VBA retail 6.4.8869
A2002 SP3
...
Рейтинг: 0 / 0
02.02.2005, 15:44
    #32897376
Serge Gavrilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
Victoshaс разбегу не получилось "проимпортировать правильно"
видимо, Attribute VB_Creatable = True сбрасывается в момент сохранения модуля.

VBA retail 6.4.8869
A2002 SP3

Проверил еще раз
набрал прямо в окне отладки
?testlib.Class1.Count
2
т.е. работает

VBA retail 6.4.9972
A2002 SP3

Но работало и раньше (IMHO)
...
Рейтинг: 0 / 0
02.02.2005, 15:45
    #32897380
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
Чума
чере Insert-File - действительно ПОЛУЧИЛОСЬ!!!
(вставить пустой класс, встать на него и сделать Insert-File)

Instancing при этом пустой (и трогать его страшно...)
но работает ведь...


так - очередь за predeclared... (вечерком)

2 Serge Gavrilov
Спасибо большое!
...
Рейтинг: 0 / 0
02.02.2005, 15:49
    #32897389
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
может так и формы можно будет использовать из библиотечных проектов?

set frm = new lib.form_libform
...
Рейтинг: 0 / 0
02.02.2005, 16:01
    #32897426
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
вот как раз через "конструирующие функции" и пользую
...
Рейтинг: 0 / 0
02.02.2005, 16:04
    #32897440
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
2 Serge Gavrilov
т.е. получается, что у А97
Attribute VB_PredeclaredId = True по умолчанию стоит?
...
Рейтинг: 0 / 0
02.02.2005, 16:51
    #32897613
tesia2003
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
Ребята, всем спасибо - очень здорово помогли!!!
...
Рейтинг: 0 / 0
02.02.2005, 20:57
    #32898055
Serge Gavrilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
Victosha2 Serge Gavrilov
Спасибо большое!
Да не за что!

Victoshaт.е. получается, что у А97
Attribute VB_PredeclaredId = True по умолчанию стоит?
Это, увы, не знаю. С msa 97 в эти игрушки не играл
...
Рейтинг: 0 / 0
15.12.2005, 12:41
    #33437794
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
Victosha 2 Serge Gavrilov
Спасибо большое!
фкаторый расс присаидиняюсс.

(И в 97 барабан от Serge Gavrilov тоже работает - при импорте в класс, что кажется мною давно проверялось. Но вот сейчас - еще раз пригодилось). New подымаются в лучшем виде.


PS Одно досадно - VB убивает ссылки на порядок медленнее, чем создает. (вставляю 20000 узлов с установкой взаимных ссылок - 2 секунды, чищу ссылки - +15 сек ). Был глуппый мысел, что End одного проекта не подействует в другом (по аналогии с хранением глобальных переменных в подцепленном по референсу проекте - во избежание потерь при Error). Но - "ува-ува и голова барабартает с плетч". Мдя .

Как еще можно чистить вба-шные ссылки в ыхнем счетчике патчками? (где-то видел упоминание на стремное ковыряние в памяти руками, но не видел сцылку).
...
Рейтинг: 0 / 0
15.12.2005, 13:36
    #33438009
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать модули класса из других проектов VBA?
если у тебя в 20000 узлах ссылка на единственный экземпляр одного и того же класса
и
по смыслу алгоритма он гарантированно переживет все 20000 узлов
(ни при каких обстоятельствах не разрушится до разрушения любого из этих узлов, если представить, что ссылка на этот класс в узлах не хранится)

То ссылку на такой экземпляр можно заменить на целое, хранящее его ObjPtr.
для целей уведомления о событии должно быть достаточно.
вот тут цитата, подходящая к случаю
http://www.sql.ru/forum/actualthread.aspx?tid=43786&hl=objptr#298962

На этом можно сэкономить 20000 Release-ов
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как использовать модули класса из других проектов VBA? / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]