Как работать с группами проектов?

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

Как работать с группами проектов?

Сообщение kuhtiov » 17.05.2011 (Вт) 18:07

Добрый день. Я хочу некоторые классы и некоторые формы вынести в dll. Предположим, у меня есть группа проектов, куда добавлен обычный проект и dll (ActiveX dll). Вопрос, как мне из первого проекта обратиться к функции, которая находится в классе или в форме проекта dll. Приведу пример (пример.zip)
Вложения
пример.zip
(6.3 Кб) Скачиваний: 173

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

Re: Как работать с группами проектов?

Сообщение Хакер » 17.05.2011 (Вт) 20:13

TLB-шку второго проекта надо добавить в ссылки первого.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Как работать с группами проектов?

Сообщение kuhtiov » 17.05.2011 (Вт) 21:46

А можешь пример привести?

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

Re: Как работать с группами проектов?

Сообщение Хакер » 17.05.2011 (Вт) 21:49

Тут нет чего-то такого, ради чего нужно городить пример.
—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
Откуда: Мимо проходил

Re: Как работать с группами проектов?

Сообщение Antonariy » 17.05.2011 (Вт) 22:05

Хакер в своем мутном репертуаре, объясняет непонятное еще более непонятным, но правильным!!адинадин
Суть его "подсказки": Project - References - галку на project2.
Чтобы получить доступ к функциям формы, нужно сделать для них переходник в классе.
Лучший способ понять что-то самому — объяснить это другому.

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

Re: Как работать с группами проектов?

Сообщение Хакер » 17.05.2011 (Вт) 22:14

Antonariy писал(а):Чтобы получить доступ к функциям формы, нужно сделать для них переходник в классе.

Достаточно сделать публичную функцию-обёртку над New, а доступ к методам иметь через IDispatch (As Object). Но если IDispatch не устраивает, можно на основе формы сгенерировать TypeInfo и поместить его в отдельную TLB.
—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
Откуда: Мимо проходил

Re: Как работать с группами проектов?

Сообщение Antonariy » 17.05.2011 (Вт) 22:16

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

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Как работать с группами проектов?

Сообщение kuhtiov » 17.05.2011 (Вт) 22:36

спасибо Antonariy, но при компиляции следующие грабли:
Проект 'Project1' не может быть сформирован, потому что он ссылается на проект 'трам парам папам\Project2.vbp' который не имеет двоичного набора файлов совместимости. Что у меня не так с вторым проектом?

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

Re: Как работать с группами проектов?

Сообщение Хакер » 17.05.2011 (Вт) 22:40

kuhtiov писал(а):двоичного набора

Убери ты этот руссифицированный VB подальше. Поразительно, какую отвратительную ахинею готовы смотреть (и пытаться в неё вникать) люди, ради возможности не учить английский.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Как работать с группами проектов?

Сообщение kuhtiov » 17.05.2011 (Вт) 22:42

Хакер писал(а):
kuhtiov писал(а):двоичного набора

Убери ты этот руссифицированный VB подальше. Поразительно, какую отвратительную ахинею готовы смотреть (и пытаться в неё вникать) люди, ради возможности не учить английский.


Ну, собственно, что подарили, на том и работаем :) и все же, что VB мне хочет этим сказать?

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

Re: Как работать с группами проектов?

Сообщение Хакер » 17.05.2011 (Вт) 22:51

Не знаю, если напишешь оригинальный английский аналог этого бреда, сразу же станет ясно.

ADDED:
Нашёл:
The project 'Project1' can not be built because it references project 'Project3' which does not have a binary compatibility file set.

Авторов «русского VB» нужно казнить изображением подноса.

Собственно, что тут думать, у второго проекта включена Binary Compatibility, но с файлом на вкладке выбора режима совместимости что-то не так. Например это совершенно левый файл.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Как работать с группами проектов?

Сообщение kuhtiov » 18.05.2011 (Ср) 12:06

Спасибо, с этим разобрался. А почему я не могу вызвать форму, которую создал в проекте dll?
Делаю например так:
Код: Выделить всё
Msgbox From2.Visable


Хотя с классом работаю нормально

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Как работать с группами проектов?

Сообщение Viper » 18.05.2011 (Ср) 12:20

kuhtiov писал(а):
Код: Выделить всё
Msgbox From2.Visable
Хотя с классом работаю нормально
А собственно что должен делать этот код? В котором минимум одна опечатка к тому же.
Весь мир матрица, а мы в нем потоки байтов!

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Как работать с группами проектов?

Сообщение kuhtiov » 18.05.2011 (Ср) 13:29

Он должен вернуть False или True
P.S. Конечно же Form, а не From

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

Re: Как работать с группами проектов?

Сообщение Хакер » 18.05.2011 (Ср) 13:40

kuhtiov писал(а):Спасибо, с этим разобрался. А почему я не могу вызвать форму, которую создал в проекте dll?
Делаю например так:
Код: Выделить всё
Msgbox From2.Visable


Хотя с классом работаю нормально

Потому что, и это сообщение на 100 процентов подтверждает это, ты совершенно неверное понимаешь суть форм. Когда форма была в том же проекте, жуткое заблуждение не вылазило боком. Как только форма ушла в другой проект, жуткое заблуждение сразу показало себя во всей красе.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Как работать с группами проектов?

Сообщение kuhtiov » 18.05.2011 (Ср) 14:02

А в чем заблуждение? Что есть форма?

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

Re: Как работать с группами проектов?

Сообщение Хакер » 18.05.2011 (Ср) 14:05

Когда ты пишешь MsgBox Form2.Visible.
В этой записи:
MsgBox — это имя функции.
Visible — это имя свойства.
А Form2 — имя чего?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: Как работать с группами проектов?

Сообщение alibek » 18.05.2011 (Ср) 14:30

Form2 это имя экземляра класса. И это также имя самого класса.
VB6 сам, неявно, для форм создает экземпляры класса, имеющие то же имя.
Когда ты пишешь MsgBox Form2.Visible, это фактически означает следующее (красный цвет — класс, синий цвет — переменная):
Dim Form2 = Form2
Set Form2 = New Form2
MsgBox Form2.Visible
Lasciate ogni speranza, voi ch'entrate.

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

Re: Как работать с группами проектов?

Сообщение Хакер » 18.05.2011 (Ср) 14:47

alibek писал(а):Form2 это имя экземляра класса. И это также имя самого класса.

Ну вот, испортил весь процесс.
Не имя экземпляра, а имя глобальной переменной.
Не Dim Form2 = Form2, а Dim Form2 As Form2.
Не Set Form2 = New Form2, а If Form2 Is Nothing Then Set Form2 = New Form2.

И вообще указанным поведением (if x is nothing then sex x=new class) обладают DAN-ссылки (declared «as new»), то есть
Dim Form2 As New Form2

И если уж быть совсем дотошным, то вот это:
Dim Form2 As Form2
Set Form2 = New Form2
Form2.Show

неправильная раскраска-легенда.

Вот правильная:
Dim Form2 As Form2
Set Form2 = New Form2
Form2.Show

(Переменная, класс, интерфейс).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Как работать с группами проектов?

Сообщение kuhtiov » 18.05.2011 (Ср) 17:01

Все равно не выходит
Код: Выделить всё
Dim Form2 As Form2
Set Form2 = New Form2
Form2.Show


Опишу ситуацию подробнее. Я пытаюсь объединить 2 EXE-проекта (пусть будет Project1 и Project2). Из проекта Project2 я делаю DLL, и добавляю его к проекту Project1. Итог, у меня группа из EXE-проекта Project1 и DLL-проекта Project2. Мне нужно из Project1 вызвать Project2. Как это сделать?

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

Re: Как работать с группами проектов?

Сообщение Хакер » 18.05.2011 (Ср) 18:01

kuhtiov писал(а):Все равно не выходит

Надо думать, а не подбирать первые попавшиеся написанные решения, подобно неумелому домушнику, который ещё не умеет вскрывать замки, но у которого есть большая связка ключей.

Формы являются приватными объектами, поэтому их coclass-описания (а) и interface-описания (б) не попадают в TLB, а значит за рамками родного проекта экземпляр формы не создать при помощи New (а) и не объявить переменную при помощи As Form2 (б).

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

Последний метод мною ни разу не опробывался, и вряд ли кто-то ещё это делал. Попробуй, будет чем хвастаться.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Как работать с группами проектов?

Сообщение Diamock » 18.05.2011 (Ср) 18:16

kuhtiov писал(а):Опишу ситуацию подробнее. Я пытаюсь объединить 2 EXE-проекта (пусть будет Project1 и Project2). Из проекта Project2 я делаю DLL, и добавляю его к проекту Project1. Итог, у меня группа из EXE-проекта Project1 и DLL-проекта Project2. Мне нужно из Project1 вызвать Project2. Как это сделать?

kuhtiov, я правильно понял,что тебе из Project2 (ActiveX Dll), подключенного к Project1 (Standard Exe), нужно вызвать форму?
In der Beschrankung zeigt sich erst der Meister
Графоманю...

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Как работать с группами проектов?

Сообщение kuhtiov » 18.05.2011 (Ср) 19:18

Diamock писал(а):
kuhtiov писал(а):Опишу ситуацию подробнее. Я пытаюсь объединить 2 EXE-проекта (пусть будет Project1 и Project2). Из проекта Project2 я делаю DLL, и добавляю его к проекту Project1. Итог, у меня группа из EXE-проекта Project1 и DLL-проекта Project2. Мне нужно из Project1 вызвать Project2. Как это сделать?

kuhtiov, я правильно понял,что тебе из Project2 (ActiveX Dll), подключенного к Project1 (Standard Exe), нужно вызвать форму?

Нет, мне нужно вызвать форму, которая расположена в проекте Project2 (ActiveX Dll), с кнопки расположенной в форме проекта Project1 (Standard Exe)

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

Re: Как работать с группами проектов?

Сообщение Antonariy » 18.05.2011 (Ср) 21:33

kuhtiov писал(а):Что у меня не так с вторым проектом?
Нужно в свойствах проекта выставить совместимость не двоичную, а "проектную" (не знаю, как этот там у вас po-russki, tovarisch), второй пункт вместо третьего. Третий заработает когда будет скомпилированная dll.
Лучший способ понять что-то самому — объяснить это другому.

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Как работать с группами проектов?

Сообщение Diamock » 19.05.2011 (Чт) 3:28

Код для Dll.
Имя проекта ExempleProject.
Имя класса ExempleClass.
Имя формы ExempleFormDll.
Код для класса ExempleClass.
Код: Выделить всё
Public Sub ShowFormDll()
     ExempleFormDll.Show 1
End Sub

Компилируешь библиотеку, подключаешь к проекту.
Код для проекта
Код: Выделить всё
Private Sub Command1_Click()
     Dim qq As New ExempleProject.ExempleClass
     qq.ShowFormDll
End Sub

Оно?
In der Beschrankung zeigt sich erst der Meister
Графоманю...

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Как работать с группами проектов?

Сообщение kuhtiov » 19.05.2011 (Чт) 7:00

Теперь понял. Спасибо!

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

Re: Как работать с группами проектов?

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

Один гадость советует, другой гадости радуется. Цирк.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Как работать с группами проектов?

Сообщение kuhtiov » 19.05.2011 (Чт) 19:33

К стати, Хакер прав. Форма появляется, но такой подачи я не ожидал. Там одна операция должна выполняться по таймеру, так вот, таймер не врубается или врубается, но замораживается когда появляется форма. Не понятно

P.S. и появляется форма кстати не сразу, а со второй попытки (если второй раз нажать на кнопку). Вариант отметается
Последний раз редактировалось kuhtiov 19.05.2011 (Чт) 19:35, всего редактировалось 1 раз.

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Как работать с группами проектов?

Сообщение Diamock » 19.05.2011 (Чт) 19:34

Хакер писал(а):Один гадость советует, другой гадости радуется. Цирк.

Почему гадость? Очень хочется знать. :cry:
In der Beschrankung zeigt sich erst der Meister
Графоманю...

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

Re: Как работать с группами проектов?

Сообщение Хакер » 19.05.2011 (Чт) 19:36

kuhtiov писал(а):К стати, Хакер прав. Форма появляется, но такой подачи я не ожидал. Там одна операция должна выполняться по таймеру, так вот, таймер не врубается или врубается, но замораживается когда появляется форма. Не понятно

Это, потому, что Diamock влепил vbModal в качестве первого параметра. Вообще-то он влепил единицу, что ещё больше усугубляет дурность совета, но на эффект это не влияет, что vbModal, что единица, эффект одинаков, только стиль пострадал.


Diamock писал(а):Почему гадость? Очень хочется знать. :cry:

Всё плохо.
Зачем создавать посредника над методом Show? Метод Show и так может быть вызван из стороннего проекта.
Экземпляры класса ExempleClass можно множить до посинения. При том класс с ущербной конституцией. Внутри класса используется одноимённая неявная DAN-ссылка. А значит форма будет вести себя как singleton (из-за DAN-ссылки, неявной). То есть форма — singleton, а посредников для вызова Show можно расплодить до бесконечности. Тысячи объектов, у каждого из которых есть метод, который сделает видимой одну единственную (для каждого экземпляра-посредника из тысячи) форму-singleton. Ну не чушь ли? И при том, кроме возможности Show-нуть форму, нет возможности ну совершенно ничего иного с ней сделать. Ни данные какие-то взять установить, ни хотя бы уничтожить её во имя дьявола.

Правильный подход — использовать паттерн Factory и паттерн Singleton. Сделать синглетон SomeFormFactory, который будет множить сколько угодно экземпляров SomeForm и возвращать ссылки на них клиенту. А клиент уже может рулить формой и её содержанием напрямую, без всяких отвратительных (свей ущербностю) посредников.

То есть по сути, ровно то, о чём я говорил — сделать публичную обёртку над New. Но вы же предпочитаете делать какую-то гадость...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29

    TopList