Как поймать событие от коллекции динамических контролов?

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

Как поймать событие от коллекции динамических контролов?

Сообщение kibernetics » 05.05.2013 (Вс) 23:30

Народ, если кто в курсе темы, может подскажет в какую сторону двигаться...
В общем есть класс, в нём объявлены пару контролов и одно событие:
Код: Выделить всё
Option Explicit

Private WithEvents ctlTextbox    As VB.TextBox
Private WithEvents ctlCheckBox   As VB.CheckBox

Public Event OnChange(ByVal Text As String)

Private Sub Change(ByVal Text As String)
    RaiseEvent OnChange(Text)
End Sub

Public Property Set TextBox(rhs As TextBox)
    Set ctlTextbox = rhs
End Property

Public Property Get TextBox() As TextBox
    Set TextBox = ctlTextbox
End Property

Public Property Set CheckBox(rhs As CheckBox)
    Set ctlCheckBox = rhs
End Property

Public Property Get CheckBox() As CheckBox
    Set CheckBox = ctlCheckBox
End Property

Private Sub ctlCheckBox_Click()
    Call Change("clatz")
End Sub


На форме объявляю событие для этого класса
Код: Выделить всё
Option Explicit
Public WithEvents cls           As cClass1

Private Sub cls_OnChange(ByVal Text As String)
    Debug.Print Text
End Sub


В общем, эта тема работает если я добавляю только одну группу контролов:
Код: Выделить всё
Private Sub Form_Load()
    Set cls = New cClass1   
    Set cls.TextBox = Controls.Add("VB.TextBox", "txt1", Form1)
    Set cls.CheckBox = Controls.Add("VB.CheckBox", "chk1", Form1)

    'если добавляем ещё одну группы контролов, то событие не генерится от первого чекбокса   
    Set cls.TextBox = Controls.Add("VB.TextBox", "txt2", Form1)
    Set cls.CheckBox = Controls.Add("VB.CheckBox", "chk2", Form1)
   
    SetTopMostWindow Me.hwnd, True
End Sub


Вопрос: как добиться генерирования события и от первого чекбокса и от второго?

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

Re: Как поймать событие от коллекции динамических контролов?

Сообщение Хакер » 05.05.2013 (Вс) 23:33

kibernetics писал(а):В общем, эта тема работает если я добавляю только одну группу контролов:

А причём тут группа.

Во-первых, судя по комментарию, ты не понимаешь как устроен мир. Вот по конкретно этому:
kibernetics писал(а):то событие не генерится от первого чекбокса

Событие генерится от всех. А вот обрабатывается от тех и теми, кто на них подписан. Ты подписываешься на события первого, и сразу же отписываешься от него и подписываешься на событие второго.

Результат логичен.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как поймать событие от коллекции динамических контролов?

Сообщение kibernetics » 05.05.2013 (Вс) 23:39

Хакер писал(а):Во-первых, судя по комментарию, ты не понимаешь как устроен мир.

как будто кто-то знает как устроен мир 8)

Хакер писал(а):Событие генерится от всех. А вот обрабатывается от тех и теми, кто на них подписан. Ты подписываешься на события первого, и сразу же отписываешься от него и подписываешься на событие второго.


Хакер, как стать подписчиком у обоих чекбоксов? Может подскажешь? Уже второй день не выходит ничего путного.

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

Re: Как поймать событие от коллекции динамических контролов?

Сообщение Хакер » 05.05.2013 (Вс) 23:40

kibernetics писал(а):Хакер, как стать подписчиком у обоих чекбоксов?

Например(именно на-пример), можно объявить две WithEvents-переменных.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как поймать событие от коллекции динамических контролов?

Сообщение kibernetics » 05.05.2013 (Вс) 23:46

Хакер писал(а):Например(именно на-пример), можно объявить две WithEvents-переменных.

Этот вариант не совсем подходит, изначально неизвестно сколько будет добавлено динамических контролов.
Может один, а может штук под 15-20...

Была ещё идея воспользоваться индексами контролов. Но дальше идеи дело не продвигается.

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

Re: Как поймать событие от коллекции динамических контролов?

Сообщение Хакер » 05.05.2013 (Вс) 23:53

kibernetics писал(а):Этот вариант не совсем подходит, изначально неизвестно сколько будет добавлено динамических контролов.
Может один, а может штук под 15-20...

Хорошо, тогда какая система тебе подходит?

Ах, я бы хотел рассказать всю систему подписки на событий, но во-первых мне некогда, а во-вторых, думаю, мало смысла.

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

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Как поймать событие от коллекции динамических контролов?

Сообщение kibernetics » 06.05.2013 (Пн) 0:03

Хакер писал(а):Ах, я бы хотел рассказать всю систему подписки на событий, но во-первых мне некогда, а во-вторых, думаю, мало смысла.

Хакер, надо отвлечься от дел и помочь мне, ведь ты умный и опытный программист и кодокопатель.

Хакер писал(а):Эта тема уже тысячу раз обсуждалась. Решение в общих чертах выглядит так: создаётся класс для объектов-спутников. На каждый объект, на события которого мы хотим подписаться, мы должны создать спутник-подписчик. Все спутники подписчики будут вызывать метод мастер-объекта, пердавая кроме актуальных параметров события ещё и опознавательный знак.

Что нужно в этом классе прописывать и как мониторить вновь созданные спутники? Мне эта идея вообще никак не видится толком.
Я бросил клич, здесь на форуме, т.к. vbstreets последнее на что я могу рассчитывать. Я уже перелопатил tons of code на всевозможных форумах, чтобы задать вопрос здесь.

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

Re: Как поймать событие от коллекции динамических контролов?

Сообщение Хакер » 06.05.2013 (Пн) 0:47

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

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

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как поймать событие от коллекции динамических контролов?

Сообщение iGrok » 06.05.2013 (Пн) 21:17

Один из ключей для поиска, если не ошибаюсь, слово "медиатор".
label:
cli
jmp label


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

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

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

    TopList