Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/35: Рейтинг темы: голосов - 35, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 02.10.2014
Сообщений: 2
1

Создать обработчик событий для группы однотипных объектов на форме Access

02.10.2014, 13:45. Показов 6699. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здраствуйте, уважаемые знатоки) Пишу VBA код в Access2003. Ситуация следующая: на форме есть массив однотипных контролов; хочу настроить их поведение при правом клике, для чего создал модуль класса "DelSampleBut" с кодом примерно следующим:
Visual Basic
1
2
3
4
5
6
7
8
Public WithEvents SampleBut As Access.ToggleButton
Public Sub SampleBut_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 2 Then
        MsgBox "aaa"
    Else
        MsgBox Button
    End If
End Sub
В модуле формы:
Visual Basic
1
2
3
4
Dim AllButs As New DelSampleBut
Private Sub Form_Open(Cancel As Integer)
    Set AllButs.SampleBut = Me.Controls("Toggle1")
End Sub
Как вы понимаете - не работает.(коды был модифицирован из примера с др. сайта) После пары дней экспериментов и поисков обнаружил что всё начинает работать, если в код формы добавить ДВЕ строки
Visual Basic
1
2
3
Private Sub Toggle1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
 
End Sub
Если б контролов было 2 я б не парился, но их м/б до 192х. Где я ошибся?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2014, 13:45
Ответы с готовыми решениями:

Обработка событий группы однотипных элементов управления польз. формы
Имеется следующая проблема. На пользовательской форме есть несколько элементов ComboBox Для всех...

Общий обработчик событий для однотипных компонентов (например CheckBox)
Всем доброго времени суток. Прошу помощи в решении данного вопроса. Возникла маленькая проблемка. ...

Обработчик событий для объектов Node
Уважаемые знатоки. Вы не подскажите, если у меня есть объект класса Retangle, созданный таким...

Один обработчик событий для нескольких объектов
Здравствуйте, подскажите пожалуйста, как так сделать? В VB.NET надо после Handler(вроде) писать, а...

2
6081 / 1325 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
02.10.2014, 23:33 2
Лучший ответ Сообщение было отмечено tak-tak как решение

Решение

Здравствуйте, tak-tak,
Дело в том, что для объектов Access предусмотрено три разных типа обработчика для событий этих объектов, например для события OnMouseDown.

Откройте форму в режиме конструктора, нажмите на "Обработка событий..." (или как там у вас в англоязычной версии?) и в меню построителя обработчика событий вы увидите три варианта обработки: макросы, выражения и программы. В вашем случае события обрабатываются с помощью программы, но Access об этом не знает. Надо ему об этом сообщить, и ваш способ - один из вариантов намекнуть Access, что вы хотите обрабатывать события с помощью программы (но этот способ - самый топорный).

Более простой и корректный путь - прямо указать Access, какой конкретно тип обработчика вы хотите использовать. Если вы хотите использовать...

...макрос - пишете в свойстве OnMouseDown элемента управления имя макроса.

...выражение - пишете в свойстве OnMouseDown элемента управления "=<выражение>", где вместо <выражение> подставляете выражение так, как оно отображается в Построителе Выражений.

...программу - пишете в свойстве OnMouseDown элемента управления значение "[Event Procedure]".

Теперь, зная теорию, напишем код, обрабатывающий события наших переключателей:
  1. Модуль общего назначения Module1:

    Visual Basic
    1
    
    Public AllToggleButtons As Collection
  2. Модуль класса DelSampleBut:

    Visual Basic
    1
    2
    3
    4
    5
    
    Public WithEvents SampleBut As Access.ToggleButton
     
    Private Sub SampleBut_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
        If Button = 2 Then MsgBox "Элемент управления """ & SampleBut.Name & """ сообщает: нажата правая кнопка мыши."
    End Sub
  3. Модуль формы:

    Visual Basic
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    Private Sub Form_Open(Cancel As Integer)
        Dim c As Object, c1 As DelSampleBut
        Set AllToggleButtons = New Collection
        For Each c In Me.Controls
            If TypeOf c Is Access.ToggleButton Then
                Set c1 = New DelSampleBut
                Set c1.SampleBut = c
                c1.SampleBut.OnMouseDown = "[Event Procedure]" 'Указываем, что обработка события OnMouseDown производится именно с помощью программного кода.
                AllToggleButtons.Add c1 'Сохраняем ссылку на объект класса, чтобы обрабатывались события его встроенного объекта SampleBut.
            End If
        Next c
    End Sub

С уважением,
Аксима
1
0 / 0 / 0
Регистрация: 02.10.2014
Сообщений: 2
03.10.2014, 00:04  [ТС] 3
Да-да, я как раз наткнулся на решение на др сайте, только там свойство OnMouseDown = "[Event Procedure]" устанавливается сразу в модуле класса, но ваш код понятнее. Спасибо за уделённое мне время)
0
03.10.2014, 00:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.10.2014, 00:04
Помогаю со студенческими работами здесь

Можно ли создать обработчик события для группы контролов
Вопрос такой - Есть комбобокс, для отлавливания события на изменении выбора позиции в нем мы...

Общий обработчик событий CheckBox на листе Excel (не форме)
Доброго времени суток! Для каждого чекбокса на листе создается свой отдельный обработчик нажатия :...

Одна функция для обрабатывания разный однотипных событий
Доброго дня суток, Недавно начал разбирать c++ builder и на днях наткнулся на проблему которую...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru