Вызов формы из dll

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

Вызов формы из dll

Сообщение ale_x » 04.03.2008 (Вт) 13:23

Как вызвать и управлять контролами формы из dll

ale_x
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 04.03.2008 (Вт) 13:18

Сообщение ale_x » 04.03.2008 (Вт) 13:32

У меня взникла проблема с управленией формой из dll.
В dll были форма и модуль классов. форма Form1. на ней расположены textbox и кнопки.
Как вызвать форму из dll и изменять контролы.
то есть нужно постоянно, передавать в textbox новые значения и изменять активность и название кнопок.

Раньше я просто вызывал форму в модуле класса
Pubcli Function X()
set x =New Form1
x.show
End Function

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

Сообщение Viper » 04.03.2008 (Вт) 15:53

ale_x, сделай третью попытку. Желательно четко и ясно изложи, что и где у тебя есть и откуда до этого тебе надо добраться.
А то непонятно, то ли у тебя есть форма в глубинах dll и до нее надо достучаться из другого проекта, то ли одно из двух.
Весь мир матрица, а мы в нем потоки байтов!

ale_x
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 04.03.2008 (Вт) 13:18

Сообщение ale_x » 04.03.2008 (Вт) 18:50

Вообщем, я делаю чат на VB, и форма чата должна находиться в dll. Так вот как её вызвать и передавать в textbox, расположенный на этой форме, текс с проекта к которому подключена dll.

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

А то у меня получается только вызвать форму, а как её управлять ума ни как не могу дать.
Какой код писать в модули класса dll ? и как вызывать и управлять формой dll из проекта? Если несложно, пожалуйста, покажите мне балбесу :roll: нагдяный пример.

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

Сообщение Viper » 05.03.2008 (Ср) 7:58

Общение с формой, находящейся в DLL производится ровно также, как и с формой,находящейся в "родном" проекте, т.е. объявлешь переменную с необходимым уровнем видимости, создаешь экземпляр формы при помощи New и общаешься с ней так как тебе нужно.
Весь мир матрица, а мы в нем потоки байтов!

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 05.03.2008 (Ср) 11:25

Viper
то есть как это "объявить новый экземпляр формы", если в DLL она компилится как приватная?? Или тогда подскажите, как сделать чтоб она стала MultiUse
Последний раз редактировалось Денис 05.03.2008 (Ср) 13:48, всего редактировалось 1 раз.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

ale_x
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 04.03.2008 (Вт) 13:18

Сообщение ale_x » 05.03.2008 (Ср) 12:55

Че так я не понял, а как вызывать её в проекте. Можно небоьшой примерчик проекта и dll, плиз :lol:

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

Сообщение Viper » 05.03.2008 (Ср) 14:01

Упс... Эт я погорячился конечно. Напрямую никак, однако реализовать общение с формой находящейся в DLL возможно. Вариантов 2:
1. Через позднее связывание. В этом случае в DLL должен быть класс с параметром Instancing равным GlobalMultiuse, который имеет Public свойство (или функцию) возвращающее ссылку на экземпляр формы, например так:
Код: Выделить всё
Public Property Get GetForm() As Object
Set GetForm = New MyMain
End Property

В exe соответственно общаемся с полученным объектом так как нам нужно.
2. При помощи того же механизма возвращаем ссылки на нужные нам свойства. Т.е. например созадаем свойство для доступа к текстовому полю

З.Ы. А вообще такой ситуации быть по идее не должно, что-то неправильно спроектировано в программе
Весь мир матрица, а мы в нем потоки байтов!

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 05.03.2008 (Ср) 15:15

Viper
A есть ли возможность подгружать формы из dll в родительское MDI-окно в программе? Делал так:
Код: Выделить всё
Private frmNew As Form
...

Private Sub MDIForm_Load()

Dim A1 As New clsTools

Set frmNew = A1.GetForm

frmNew.Show

End Sub


но вылетает ошибка, что форма не может найти MDI-форм в проекте (в библиотеке само собой форму предварительно делаю MDIChild=True)
Получается, что MDIChild-форма в библе ищет MDIClient-форму в ней же, в библе, а форма то - в программе.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

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

Сообщение Viper » 05.03.2008 (Ср) 16:44

Денис, можно! У меня такой методой реализован весьма немаленький проект. Щаз код не приведу, но в двух словах из exe вызывется метод, параметром которого является MDIForm, а в DLL соответственно открывается дочерняя форма.
З.Ы. Код поищу.
Весь мир матрица, а мы в нем потоки байтов!

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

Сообщение Viper » 06.03.2008 (Чт) 9:05

А задачка то с отображением дочерней формы из DLL внутри MDI-формы не так уж и проста оказывается... %) Но ведь решается же... %)
З.Ы. И кстати было что-то такое на форуме...
Весь мир матрица, а мы в нем потоки байтов!

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 06.03.2008 (Чт) 10:02

Денис, а просто SetParent не подойдет?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

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

Сообщение Viper » 06.03.2008 (Чт) 11:11

Matew, просто SetParent тут не пройдет, однако SetParent позволяет сию проблему таки решить. Метода такая:
1. В DLL создается форма со всеми нужными контролами, но без заголовка, и со свойством MDIChild = False.
2. В EXE (точнее в приложении, использующем DLL) создаем пустую форму с MDIChild = True.
3. Получаем ссылку на экземпляр формы из DLL, а далее при помощи SetParent делаем местную форму родителем для беззаголовочной формы из DLL.

Вот и все дела.
Весь мир матрица, а мы в нем потоки байтов!

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 06.03.2008 (Чт) 11:31

Viper
Это по описанию получается, как фрейм... А как ты решил вопрос с изменением размера родительской формы (_Resize)?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

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

Сообщение Viper » 06.03.2008 (Чт) 13:30

Денис писал(а): как ты решил вопрос с изменением размера родительской формы (_Resize)?

Никак не решал, мне сие не нужно было. Думаю решить можно. Навскидку - при ресайзе родителя вызывать Public метод DLL, который сделает все что нужно, т.е. передаст сообщение форме из DLL.
З.Ы. Другой способ решения проблемы - вместо формы просто использовать свой контрол. ИМХО: более сложный все же способ.
Весь мир матрица, а мы в нем потоки байтов!

SystemError
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 05.03.2008 (Ср) 17:30

Сообщение SystemError » 13.03.2008 (Чт) 17:31

Я недавно делал точно такую шляпу!
Это делается довольно просто:
1. в длл-ке делается функция которая возвращает объек (в нашем случае этим объектом является форма)
2. подрубаем длл-ку (либо в рантайме либо через references)
3. вызываем нашу функцию и получам объект формы, с которым можно работать также как с самой формой

по поводу MDI:
я пишу на VB2005 и там это делается примерно так:
Код: Выделить всё
            PluginForm = objPlugin.RunPlugin()
            PluginForm.MdiParent = Me
            PluginForm.Show()

objPlugin - это класс самой длл-ки
RunPlugin - функция из длл-ки, которая возвращает объект(форму)

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

Сообщение Viper » 14.03.2008 (Пт) 8:38

SystemError, VB.NET <> VB6, посему твой вариант с MDI-формами не пройдет. Ну а остальное умпешно ответили раньше.
Весь мир матрица, а мы в нем потоки байтов!


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

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

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

    TopList