Создание объекта по имени класса

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Создание объекта по имени класса

Сообщение Antonariy » 19.12.2007 (Ср) 11:42

Есть dll с кучей приватных классов (около сотни) и публичным, который получает строку - название приватного класса. Чтобы не городить лестницу типа
Код: Выделить всё
select case classname
Case "Class1": set obj = New Class1
Case "Class2": set obj = New Class2
хочется сделать что-то типа CreateObject(classname), однако CreateObject в данном случае не канает. Существует ли выход из положения без объявления классов как public multiuse?
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.12.2007 (Ср) 12:51

А я бы использовал Implements.
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.12.2007 (Ср) 13:13

Как Implements поможет создать объект по имени класса?
Dim obj as Inteface не отменяет лестницы.
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.12.2007 (Ср) 14:11

Это я неправильно вопрос понял.
А Select Case не нравится только из-за того, что набивать много? Или есть еще причины?
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.12.2007 (Ср) 14:29

Все уже набито, и это и есть основная причина. В изначальном виде код был собран в десятке модулей (размер исходников 8,29 мб!!!) и кое-где даже стали вылезать ограничения вб на размер модулей, процедур и даже количество case-элементов. Такой код сложно модернизировать и просто невозможно с ним работать в группе. Сейчас занимаюсь рефакторингом. Хочется ужать код - таких лестниц там навалом. Уже раскидал скриптом главную лестницу по классам, теперь нужно научиться создавать из них объекты.
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.12.2007 (Ср) 15:25

Даже сходу и не скажу.
Но может тогда просто сгруппировать объекты?
Типа Set obj = Catalog("Customers").Object("Class2")
Конечно тот же Select, но его читать будет проще.
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.12.2007 (Ср) 17:04

Не подходит. За сеанс создается лишь один из классов, хранить остальные нигде не нужно.
Лучший способ понять что-то самому — объяснить это другому.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 19.12.2007 (Ср) 20:06

Поглядел в нете. Спросил Tyomitch-а. Новости не особо радужные, но всё же:

1) Создание классов таким образом невозможно из-за того, что в VB не сохраняются метаданные. О как :shock: Ничё про это не знаю. Буду читать :)

2) Есть мысль реализовать это криво. Через MSScriptControl. Загрузив в него код классов. Тогда их можно будет создавать по имени.

3) Переделать все классыв UserControl-ы. И создавать их через Controls.Add

Возможно ошибаюсь, но это пока всё что пришло в голову. :roll:

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.12.2007 (Ср) 22:51

1) Это означает, что в exe не сохраняются имена приватных классов.
2) Не подходит из-за невысокой скорости.
3) Не подходит потому что это IIS-библиотека.
Придется делать multiuse.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.12.2007 (Чт) 3:25

Способ есть.

А что дальше предполагается делать с объектом?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.12.2007 (Чт) 10:21

Выполнить метод и забыть о нем.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.12.2007 (Чт) 10:22

Позднее связывание?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.12.2007 (Чт) 10:34

Позднее связывание возможно только при multiuse и как раз это я сейчас и делаю. Просто надеялся на существование какого-нибудь хитрого способа для создания именно приватного объекта по имени.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.12.2007 (Чт) 11:03

Позднее связывание возможно хоть когда, в том числе и для Private классов.

(Если вдруг не веришь, создай два Private-класса, присваивай их поочерёдно [As Object]-переменной и черз неё вызывай их методы. Вызываются? -- Позднее связывание)

Вобщем, хитрый способ для создания именно Private классов есть.

Функция __vbaNew из msvbvm60.dll является воплощением (в статье ув. тов. GPcH написано, что это, якобы, аналог API-функции DialogBox. ЛОЛ) оператора New.

Это (к счастью) StdCall функция и её можно Declare .... As Object. В качестве аргументов принимает юнион с информацией о классе.

Т.е.
Код: Выделить всё
Declare Function VbaNew Lib "msvbvm60" alias "__vbaNew" (Byval epiClassInfo as long) as object


...


Dim my_obj as object
Set my_obj = VbaNew(...)

my_obj.SomeMethod

...
Set my_obj = Nothing
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.12.2007 (Чт) 11:16

Верю :)
Как-то выпало из головы, что объявление as object это тоже позднее связывание даже при наличии референсов.

А какой параметр она принимает? Указатель на строку? Будет ли это работать в скомпилированном виде учитывая 1)?
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.12.2007 (Чт) 11:21

В скомпиленном будет, а вот будет ли в IDE - не знаю. Принимает не указатель на строку, а указатель на инфу о классе, т.е. на большую структуру, состоящую из кучи указателей на указатели на кучу других указателей (я не знаю, насколько глубока эта цепочка).

В скомпилированном проекте эта информация будет валяться в адресном пространстве процесса, взять её оттуда не будет составлять труда (не пробовал, может и будет).

В IDE надо проверять. Ушёл проверять.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.12.2007 (Чт) 11:28

Жестокий способ. Не стоит овчинка такой выделки. Прятать классы сильной нужды нет, пусть остаются multiuse.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.12.2007 (Чт) 11:29

Проверил: в IDE этот механизм работать не будет. Но если ActiveXDLL - то я не вижу в нём большой необходимости. Разве что для Immediate-кода.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.12.2007 (Чт) 11:41

ВБстритные прогеры настолько суровы, что создают объекты через __vbaNew :lol:
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.12.2007 (Чт) 11:58

:)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

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

    TopList