Создание нескольких копий модуля

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

Создание нескольких копий модуля

Сообщение GSerg » 21.10.2003 (Вт) 15:16

Сабж!
Представим, что у нас есть OCX. В оном определён 1 юзерконтрол.ctl и 1 модуль. В этом случае сей модуль является общим для всех экземпляров юзерконтрола, сколько бы их ни было.
Спрашивается, каким образом сделать так, чтобы каждый экземпляр заимел свой собственный, если можно так выразится, модуль? Фишка в том, что в модуле находится callback, и для каждого экземпляра он должен быть свой. В отличие от сабклассинга, где можно по хвнд однозначно понять, чьё сообщение, тут не передаётся никаких опознавательных параметров.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 21.10.2003 (Вт) 15:20

А если поменть модуль на класс.
В этом случае AdressOff будет указывать на процедуру именно этого класса.
Хотя это ИМХО - сам не пробывал.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.10.2003 (Вт) 15:23

Если бы всё было так просто.
AddressOf работает только с модулями.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 21.10.2003 (Вт) 15:29

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

Ducis
Бывалый
Бывалый
 
Сообщения: 232
Зарегистрирован: 24.04.2002 (Ср) 15:36

Сообщение Ducis » 21.10.2003 (Вт) 15:33

Наверное надо создавать проект ActiveX DLL в нем форму с нужным контролом и писать св-ва и методы через которые на этот контрол воздействовать. Компилировать DLL-ку и подключать к своему проекту.
Понимаешь? (с)Б.Ельцин.

Taras2
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 20.06.2003 (Пт) 12:13

Re: Создание нескольких копий модуля

Сообщение Taras2 » 21.10.2003 (Вт) 16:56

GSerg писал(а):Сабж!
...
Спрашивается, каким образом сделать так, чтобы каждый экземпляр заимел свой собственный, если можно так выразится, модуль? Фишка в том, что в модуле находится callback, и для каждого экземпляра он должен быть свой.

Т. е. из модуля вызывается Callback, который вызывает процедуру в этом модуле.
Тогда в модуле необходимо исключить свойства, оставивь только методы. Вызвав callback, другой объект вызвать повторно callback не сможет, до тех пор, пока не отработает первый (поток один).
GSerg писал(а): В отличие от сабклассинга, где можно по хвнд однозначно понять, чьё сообщение, тут не передаётся никаких опознавательных параметров.

Если селекция необходима (мало-ли) тогда вызывай метод в котором callback с каким нибудь параметром ("MyObjectName" as String), по которому и отследиш, откуда вызван метод.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.10.2003 (Ср) 9:07

Нет, не так. Callback вызывает винда. Менять его формат я не могу.

Короче.
В принципе, можно запретить создание более одного инстанса юзерконтрола, тогда проблема отпадает. Просто хотелось узнать, мож есть какой извращённый способ. Неизвращённых нет, знаю. Так что, видимо, фиг с ним, одного инстанса вполне достаточно.
Или есть идеи? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Taras2
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 20.06.2003 (Пт) 12:13

Сообщение Taras2 » 22.10.2003 (Ср) 9:37

GSerg писал(а):Нет, не так. Callback вызывает винда. Менять его формат я не могу.

Я неверно неправильно выразился. Ты вызываеш инициатора Callback (скажем EnumWindow()), а винда, в лице EnumWindow(), вызывает Callback.
GSerg писал(а):Короче.
В принципе, можно запретить создание более одного инстанса юзерконтрола, тогда проблема отпадает. Просто хотелось узнать, мож есть какой извращённый способ. Неизвращённых нет, знаю. Так что, видимо, фиг с ним, одного инстанса вполне достаточно.
Или есть идеи? :)

В принципе самое главное, знать почему разрешено создавать Callback только в модуле? (Я не знаю :( :oops: )
Как один из извращённых способов, могу предложить создать контрол в контроле. Т.е. во внутреннем контроле находиться модуль, причём один. Внешний контрол клонирует внутренние.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.10.2003 (Ср) 9:42

Это ограничение языка.
Модуль в контроле создать нельзя. Если было бы можно, это автоматически приводило бы к возможности создания копий модуля.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Taras2
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 20.06.2003 (Пт) 12:13

Сообщение Taras2 » 22.10.2003 (Ср) 10:44

GSerg писал(а):Это ограничение языка.

Это понятно, но с чем оно связяно, может с динамическим и постоянно меняющимся распределением памяти под методы объекта, или ещё что-то?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.10.2003 (Чт) 8:28

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

Taras2
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 20.06.2003 (Пт) 12:13

Сообщение Taras2 » 23.10.2003 (Чт) 9:04

GSerg писал(а):Не знаю, но это и не важно, поскольку нет способа это обойти.

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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.10.2003 (Чт) 9:07

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

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 24.10.2003 (Пт) 0:18

2 Taras2. Люди написавшие VB не реализовали ету фичу...
------------------------------------------------------------------------------
На мой взгляд это даже теоретичекски не возможно для такого языка как VB. (за простоту и удобство надо платить... ну кое чем покрайней мере, а может-быть это даже и не планировалось никогда ведь работа с указателями из VB невозможна (напрямую))...
Dmitrich


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

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

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

    TopList  
cron