|
|
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
Одно большое приложение Access (ADP) разбито на 3 части: 1 - содержит только пользовательские модули классов, 2 и 3 содержат собственные формы и отчеты, включая модули классов этих форм и отчетов. В этих модулях должны рождаться экземпляры классов из 1. Я попытался установить ссылки в References в приложениях 2 и 3 на 1. При этом в проектах VBA 2 и 3 действительно появились ссылки на проект VBA в 1. Однако, непонятно можно ли и как правильно создать экземпляр класса? Где бы глянуть примерчик? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 12:17 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
1) для того, чтобы объявления интерфейсов классов были видимыми, Instancing класса должен быть PublicNotCreatable 2) Создавать экземпляры таких классов нужно функциями, помещенными в публичный (не private) обычный модуль ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 12:36 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
Надо изменить атрибуты класса, для этого выполните экспорт класса в файл cls, откройте файл в текстовом редакторе и замените атрибуты Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 12:41 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
Serge GavrilovНадо изменить атрибуты класса, для этого выполните экспорт класса в файл cls, откройте файл в текстовом редакторе и замените атрибуты Код: plaintext 1. 2. 3. Attribute VB_Exposed = True - заявляем глобальную видимость интерфейса Attribute VB_Creatable = True - типа разрешаем создание из клиента а этим - Attribute VB_PredeclaredId = True - что говорим (хотим сказать)? PS что-то подобное вычитывал когда-то (кажется, у Каплана)... кажется, оно даже работало под 97м... повторно интерес возник уже в 2002м. заставить заработать New подобным образом мне удалось. успокоился на ранее отсоветованном варианте... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 13:22 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
очепятка: заставить заработать New подобным образом НЕ мне удалось (с выражением лица) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 13:24 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
мне НЕ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 13:25 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
Serge GavrilovНадо изменить атрибуты класса, для этого выполните экспорт класса в файл cls, откройте файл в текстовом редакторе и замените атрибуты Код: plaintext 1. 2. 3. Да, спасибо, вроде бы что-то получилось. Но вот только проблемы при создании объекта с ключевым словом New: Dim cnn As NEW sys.sCnn (sys - проект типа 1, sCnn - модуль класса в нем) Говорит: неправильное использование ключевого слова NEW Как правильно создать новый объект? И еще - у меня таких классов штук 200. Неужели нет других способов изменения атрибутов? Это за пределами возможностей Access? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 13:26 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
Victosha1) для того, чтобы объявления интерфейсов классов были видимыми, Instancing класса должен быть PublicNotCreatable 2) Создавать экземпляры таких классов нужно функциями, помещенными в публичный (не private) обычный модуль Спасибо. Не понял, как выполнить условие 1) У меня классов 200 штук, которые вызываются на каждом шагу - это что, еще 200 штук функций писать надо? или я чего-то не понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 13:34 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
tesia2003 Victosha1) для того, чтобы объявления интерфейсов классов были видимыми, Instancing класса должен быть PublicNotCreatable 2) Создавать экземпляры таких классов нужно функциями, помещенными в публичный (не private) обычный модуль Спасибо. Не понял, как выполнить условие 1) У меня классов 200 штук, которые вызываются на каждом шагу - это что, еще 200 штук функций писать надо? или я чего-то не понял? если ты выполнишь подобны экспорт-импорт, оно само таким станет иначе, если акцесс 2000 и старше, то - в оне редактора жми Ctrl-R - появится окно эксплорера проекта со списком классов/модулей, далее жми F4 появится окно свойств далее в эксплорере выбираешь нужный класс во второй строке свойств класса (Instancing) через комбобокс выбираешь PublicNotCreatable дальше заводишь обычный модуль в библиотечном проекте и пишешь в нем функцию Код: plaintext 1. 2. что получаешь в итоге: методы классов объявленных как PublicNotCreatable могут быть (и хорошо если будут) пустыми, без реализации. каждому такому классуу может соответствовать произвольное количество внутренних, не видимых снаружи классов, каждый из которых реализует поведение заявленного интерфейса с применением ключевого слова Implements Твоя порождающая функция тогда может быть записана так Код: plaintext 1. 2. еще замечание - все функции, записанные в обычном модуле библиотеки будут видны с клиента. Если тебе нужно скрыть часть функций, размести их в модуле, в объявлениях которого содержится предложение Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 13:48 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
Victosha а этим - Attribute VB_PredeclaredId = True - что говорим (хотим сказать)? На самом деле для New это можно не использовать. Этот аттрибут имеет смысл при импорте файла (не вставке) А что означает? Именно, я бы сказал, предекларирование, т.е. объявлять уже не нужно - сраззу ссылка на класс и метод (свойство) MsgBox MyClass.Name Victosha...заставить заработать New подобным образом НЕ мне удалось Не знаю, только что попробовал в Access 2002, работает tesia2003Да, спасибо, вроде бы что-то получилось. Но вот только проблемы при создании объекта с ключевым словом New: Dim cnn As NEW sys.sCnn Вы как вставляли модуль? Может именно VB_PredeclaredId = True мешает при импорте, попробуйте убрать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 14:02 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
Еще удобен атрибут VB_Description, можно добавлять свое описание, которое будет видно в Object Browser ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 14:12 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 14:44 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
tesia2003 А вот NEW побороть не удалось (у меня XP). Файл импортировал. Независимо от VB_PredeclaredId выдает ошибку на NEW Да, согласен, через импорт получается только глобальный класс, который не надо декларировать (VB_PredeclaredId = True) А через меню Insert - File предложенный мной способ со строками Attribute VB_Creatable = True Attribute VB_Exposed = True работает тоже "железно" :-) по крайней мере у меня Victosha, не проверишь? tesia2003 Способ Victosha (через глобальные библиотечные функции) работает железно! Видны ли при этом классы, их свойства и методы в Object Browser? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 15:10 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
щаз посмотрю. ---------------- про видимость - в просмотрщике объектов видно. 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 сильно заинтересовался, вечером надо глянуть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 15:26 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
поторопился - д.б. так автора у IFace1 заявлен Sub TestSub( IobjFace as IFace2) (с выражением лица) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 15:28 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
с разбегу не получилось "проимпортировать правильно" видимо, Attribute VB_Creatable = True сбрасывается в момент сохранения модуля. VBA retail 6.4.8869 A2002 SP3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 15:38 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
Victoshaс разбегу не получилось "проимпортировать правильно" видимо, Attribute VB_Creatable = True сбрасывается в момент сохранения модуля. VBA retail 6.4.8869 A2002 SP3 Проверил еще раз набрал прямо в окне отладки ?testlib.Class1.Count 2 т.е. работает VBA retail 6.4.9972 A2002 SP3 Но работало и раньше (IMHO) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 15:44 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
Чума чере Insert-File - действительно ПОЛУЧИЛОСЬ!!! (вставить пустой класс, встать на него и сделать Insert-File) Instancing при этом пустой (и трогать его страшно...) но работает ведь... так - очередь за predeclared... (вечерком) 2 Serge Gavrilov Спасибо большое! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 15:45 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
может так и формы можно будет использовать из библиотечных проектов? set frm = new lib.form_libform ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 15:49 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
вот как раз через "конструирующие функции" и пользую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 16:01 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
2 Serge Gavrilov т.е. получается, что у А97 Attribute VB_PredeclaredId = True по умолчанию стоит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 16:04 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
Ребята, всем спасибо - очень здорово помогли!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 16:51 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
Victosha2 Serge Gavrilov Спасибо большое! Да не за что! Victoshaт.е. получается, что у А97 Attribute VB_PredeclaredId = True по умолчанию стоит? Это, увы, не знаю. С msa 97 в эти игрушки не играл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2005, 20:57 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
Victosha 2 Serge Gavrilov Спасибо большое! фкаторый расс присаидиняюсс. (И в 97 барабан от Serge Gavrilov тоже работает - при импорте в класс, что кажется мною давно проверялось. Но вот сейчас - еще раз пригодилось). New подымаются в лучшем виде. PS Одно досадно - VB убивает ссылки на порядок медленнее, чем создает. (вставляю 20000 узлов с установкой взаимных ссылок - 2 секунды, чищу ссылки - +15 сек ). Был глуппый мысел, что End одного проекта не подействует в другом (по аналогии с хранением глобальных переменных в подцепленном по референсу проекте - во избежание потерь при Error). Но - "ува-ува и голова барабартает с плетч". Мдя . Как еще можно чистить вба-шные ссылки в ыхнем счетчике патчками? (где-то видел упоминание на стремное ковыряние в памяти руками, но не видел сцылку). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 12:41 |
|
||
|
Как использовать модули класса из других проектов VBA?
|
|||
|---|---|---|---|
|
#18+
если у тебя в 20000 узлах ссылка на единственный экземпляр одного и того же класса и по смыслу алгоритма он гарантированно переживет все 20000 узлов (ни при каких обстоятельствах не разрушится до разрушения любого из этих узлов, если представить, что ссылка на этот класс в узлах не хранится) То ссылку на такой экземпляр можно заменить на целое, хранящее его ObjPtr. для целей уведомления о событии должно быть достаточно. вот тут цитата, подходящая к случаю http://www.sql.ru/forum/actualthread.aspx?tid=43786&hl=objptr#298962 На этом можно сэкономить 20000 Release-ов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 13:36 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32897380&tid=1635570]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
147ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
83ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 487ms |

| 0 / 0 |
