Обработка событий динамически созданных контролов (формы)

Программирование на Visual Basic for Applications
Natuzzi
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 26.04.2007 (Чт) 14:43
Откуда: Питер

Обработка событий динамически созданных контролов (формы)

Сообщение Natuzzi » 27.04.2007 (Пт) 9:41

Требуется помощь от знатоков VBA. Сама справится пока не могу, хотя и стараюсь. Видимо не хватает знаний и опыта :?

Суть проблемы: необходимо обрабатывать события у динамически созданных контролов в формах в MS Excel. Конкретнее - событие click или change для checkbox'ов.

Какие действия предпринимала: изучила аналогичную задачу(http://www.dimit.pochta.ru/wopr.html#2). Попыталась применить нечто подобное, но, увы...

К сожалению не нашла ничего больше в интернете по теме обработки событий для динамичесикх конторолов в VBA :(

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

Сообщение GSerg » 27.04.2007 (Пт) 9:51

Обработка событий для динамических конторолов в VBA ничем не отличается от обработки событий для динамических конторолов в VB. Разве что отсутствием массивов контролов, но это не принципиально.

Поиск по слову WithEvents даст массу примеров для единичного контрола.
А если нужно событие массива контролов, см. http://bbs.vbstreets.ru/viewtopic.php?p=37547#37547
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 27.04.2007 (Пт) 13:32

Natuzzi, а конкретнее, что не идет? Класс с WithEvents создали? Контролы (чекбоксы) в массив загнали? В модуле массив прописали? В классе событие описали?

Natuzzi
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 26.04.2007 (Чт) 14:43
Откуда: Питер

Сообщение Natuzzi » 27.04.2007 (Пт) 15:22

bi-lyaВообще просто не получалось отловить событие, т.к. я уж очень начинающий в этом деле. С классами была знакома только номинально. Короче, полный чайник, который и не знает как подойти к проблеме. :D

Однако, вот что получилось за сегодня.

TO ALL: Буду очень признательна если откомментируете мой файл и скажете, что может глючить, что лишнее, а чего, наборот, стоит добавить.
Вложения
checkbox_events.xls
(40 Кб) Скачиваний: 130

Natuzzi
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 26.04.2007 (Чт) 14:43
Откуда: Питер

Сообщение Natuzzi » 27.04.2007 (Пт) 16:36

:!: И еще вопрос возник:

создается аналогичная форма (как в файле, см. выше), но добавляются дополнительные динамические контролы, например textbox.

Форма инициализируется.

После этого кликаем на checkbox - переходим в обработчик событий - в нем добавили код, чтобы при значении false для checkbox'а textbox становился enabled. После выполнения такой строки, программа переходит опять в userform_initialize. Почему?

Ведь судя по хэлпу. Initialize - событие, возникающее после того как объект загружен, но до того как он показан.

А в данном случае изменяемые объект (textbox) уже давно загружен и показан.

:?: Почему так происходит и как это обойти? :?:

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 28.04.2007 (Сб) 0:45

Natuzzi, поменяйте ваш
Код: Выделить всё
     Set MyNC = Controls.Add("forms.checkbox.1", "Checkbox" & i)
на этот (у вас там, похоже, кириллица) и вместо вашего
Код: Выделить всё
    ReDim Preserve MyArray(1 To i)
Set MyArray(i).MyNC = MyNC
примените этот:
Код: Выделить всё
a = 1
For Each MyNC In Me.Controls
    If Left(MyNC.Name, 8) = "Checkbox" Then
        ReDim Preserve MyArray(1 To a)
        Set MyArray(a).MyNC = MyNC
        a = a + 1
    End If
Next
Это работает

Natuzzi
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 26.04.2007 (Чт) 14:43
Откуда: Питер

Сообщение Natuzzi » 28.04.2007 (Сб) 9:17

bi-lya, не совсем понимаю, что дает
a = 1
For Each MyNC In Me.Controls
If Left(MyNC.Name, 8) = "Checkbox" Then
ReDim Preserve MyArray(1 To a)
Set MyArray(a).MyNC = MyNC
a = a + 1
End If
Next


по сравнению с тем, что у меня было.

И совсем ничего не понимаю по поводу изменения других контролов к процессе обработки события.

Для наглядности добавила label'ы. Но они почему-то не деактивируются.

Помогите, плз!

см. файл.
Вложения
checkbox_events(2).xls
(46.5 Кб) Скачиваний: 111

Natuzzi
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 26.04.2007 (Чт) 14:43
Откуда: Питер

Сообщение Natuzzi » 28.04.2007 (Сб) 13:48

ОЧЕНЬ НУЖНА помощь!!!

Вообще ничего не понимаю.

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

Когда запускаю ИЗ окна Visual Basic'a. напрямую из ФОРМЫ это все возникает ситуация, тогда все работает как и задумано - т.е. кликаю на Чекбокс1 - он декативируется и Лэйбл один тоже. Кликаю еще раз оба активны. и так для всех контролов. Красота и Счастье.

Запускаю в другой раз с кнопки или процедуру start - сееют только Чекбоксы, а Лэйблы - нет.

Что происходит? Нужна помощь

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 29.04.2007 (Вс) 13:17

Для чего вы в модуле делаете это:
Код: Выделить всё
Sub Start()
    Dim MyForm As New UserForm1
    MyForm.Show
End Sub
? Форма у вас статическая есть, зачем объявлять и перекрывать существующую? Из-за этого и глюки при запуске с кнопки листа. Вообще это уберите с модуля, а в листе просто обрабатываете клик:
Код: Выделить всё
Private Sub CommandButton1_Click()
    UserForm1.Show
End Sub
и все идет.
:D


Вернуться в VBA

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

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

    TopList