Запуск события формы с помщью текстовой переменной

MorivVV
Дата: 14.01.2016 08:48:42
Всем привет!
Работаю в 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

Может кто знает другие способы, как можно обращаться к событиям формы
Predeclared
Дата: 14.01.2016 09:40:17
Если отвечать только на поставленный вопрос,
то: CallByName

Но, есть весомые основания полагать,
что Вы делаете что-то не так. :)
guest_rusimport
Дата: 14.01.2016 09:45:49
MorivVV,
особо не вчитывался, но может интересует типа такого 1194267
События
Дата: 14.01.2016 10:09:49
MorivVV
После того как пользователь вводит дату руками, происходят события BeforeUpdate
Пока все логично - значение изменено, соответственно выстреливают события.
MorivVV
А вот если мы вызываем календарь двойным кликом, то просто происходит событие двойного клика и ничего не происходит.
Тут не очень понятно. Двойным кликом по полю, куда надо ввести дату? Если да, ваш календарь должен изменить дату в этом поле и событие BeforeUpdate сработает.

Вам нужно показать не свой костыль, а то, как вызывается календарь и что он делает после выбора даты пользователем.
MorivVV
Дата: 14.01.2016 11:32:50
Predeclared
Если отвечать только на поставленный вопрос,
то: CallByName


Спасибо, как раз то, что нужно было.
Странно, что по справке Call не предлагает посмотреть эту функцию
MorivVV
Дата: 14.01.2016 15:35:44
На будущее, чтобы можно было найти, большой кейс в первом сообщении
  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_CALENDAR"
      Forms(tctrl.Parent.Name).DATE_CALENDAR_BeforeUpdate canl
      If Not canl Then Forms(tctrl.Parent.Name).DATE_CALENDAR_AfterUpdate
  End Select
при помощи функции CallByName заменяется на простенькую процедуру
  CallByName Forms(tctrl.Parent.Name), tctrl.Name & "_BeforeUpdate", VbMethod, canl
  If Not canl Then CallByName Forms(tctrl.Parent.Name), tctrl.Name & "_AfterUpdate", VbMethod
Predeclared
Дата: 14.01.2016 15:51:35
Временно НЕ принимая во внимание возможности того,
что парентом контрола может оказаться вовсе не форма:

MorivVV
...
  CallByName Forms(tctrl.Parent.Name), tctrl.Name & "_BeforeUpdate", VbMethod, canl
  ...

Зачем вы получаете ссылку на объект: tctrl.Parent,
читаете его имя: .Name,
чтобы в дальнейшем искать этот объект в коллекции: Forms(...)

Берите сразу ссылку: CallByName tctrl.Parent, ...
23561346
Дата: 14.01.2016 16:42:47
MorivVV
 tctrl.Name & "_AfterUpdate"
13355757
MorivVV
Дата: 15.01.2016 09:37:42
23561346,

Спасибо, тоже полезное замечание
Владимирррр
Дата: 04.04.2016 20:39:03
Вылечил простым копированием неработающей формы. Старую удалил, а новой присвоил имя старой. Все заработало.