Всем привет!
Работаю в MS Access 2002, c недавнего времени начал работать с модулями классов, понял что это очень классная вещь, позволяет экономить кучу времени для создания однотипных задач в разных формах.
Из того что у меня уже работает на модуле класса, это
-получение/потеря фокуса(Lost/Got): обработка событий всех текст и комбо боксов в формах (подсветка поля зеленым цветом при получении фокуса);
-клавиша вверх(KeyUp):отображение переключения раскладки клавиатуры в доп. форме (необходимо для удаленного рабочего стола)
-двойной клик(DblClik): вызов календаря во всех формах для полей, которые имеют короткий формат даты
-отслеживания запущенных программ у пользователей (Open/Unload)
Вроде все замечательно, но столкнулся с одной проблемой программирования.
Так вот вроде выглядит все хорошо, но проблема в том, что если в коллекции форм и контролов я могу выбрать итем с помощью строковой переменной, то для публичного события мне нужно жесткое название ИмениКонтрола.
Все это нужно для события вызова календаря в полях даты. После того как пользователь вводит дату руками, происходят события BeforeUpdate, которые обычно проверяют возможно ли введение данного значения в поле и далее разрешают выполнение AfterUpdate, в которых происходят основные изменения и вызовы различных функций.
А вот если мы вызываем календарь двойным кликом, то просто происходит событие двойного клика и ничего не происходит.
Для автоматизации написал в модуле класса вызов необходимых событий.
Модуль класса работает с формой по ссылке, поэтому напрямую выполнять процедуры в форме не получается, приходится обращаться по именам форм и контролов в формате
Forms("ИмяФормы").Controls("ИмяКонтрола").ИмяКонтрола_AfterUpdate
Поэтому пока приходится использовать вот такой костыль для обработки событий
Private Sub SelectAfterUpdate(tctrl As Object)
Dim canl As Integer
On Error Resume Next
Select Case tctrl.Name
Case "DATE_BEG"
Forms(tctrl.Parent.Name).DATE_BEG_BeforeUpdate canl
If Not canl Then Forms(tctrl.Parent.Name).DATE_BEG_AfterUpdate
Case "DATE_END"
Forms(tctrl.Parent.Name).DATE_END_BeforeUpdate canl
If Not canl Then Forms(tctrl.Parent.Name).DATE_END_AfterUpdate
Case "DATE_ZAKAZ"
Forms(tctrl.Parent.Name).DATE_ZAKAZ_BeforeUpdate canl
If Not canl Then Forms(tctrl.Parent.Name).DATE_ZAKAZ_AfterUpdate
Case "DATE_POSTAVKI"
Forms(tctrl.Parent.Name).DATE_POSTAVKI_BeforeUpdate canl
If Not canl Then Forms(tctrl.Parent.Name).DATE_POSTAVKI_AfterUpdate
Case "DATE_DOC"
Forms(tctrl.Parent.Name).DATE_DOC_BeforeUpdate canl
If Not canl Then Forms(tctrl.Parent.Name).DATE_DOC_AfterUpdate
Case "DATE_NEXT"
Forms(tctrl.Parent.Name).DATE_NEXT_BeforeUpdate canl
If Not canl Then Forms(tctrl.Parent.Name).DATE_NEXT_AfterUpdate
Case "DATE_PREV"
Forms(tctrl.Parent.Name).DATE_PREV_BeforeUpdate canl
If Not canl Then Forms(tctrl.Parent.Name).DATE_PREV_AfterUpdate
Case "DATE_CALENDAR"
Forms(tctrl.Parent.Name).DATE_CALENDAR_BeforeUpdate canl
If Not canl Then Forms(tctrl.Parent.Name).DATE_CALENDAR_AfterUpdate
End Select
End Sub
Притом это только основные и самые распространенные названия для полей, а есть еще много других, около 2-3 десятков и для каждого прописывать новый кейс, как то неправильно.
Хотелось использовать что-то более изящное,вроде
Forms(tctrl.Parent.Name).(tctrl.Name).AfterUpdate
Может кто знает другие способы, как можно обращаться к событиям формы