Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запуск события формы с помщью текстовой переменной / 10 сообщений из 10, страница 1 из 1
14.01.2016, 08:48
    #39146951
MorivVV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск события формы с помщью текстовой переменной
Всем привет!
Работаю в MS Access 2002, c недавнего времени начал работать с модулями классов, понял что это очень классная вещь, позволяет экономить кучу времени для создания однотипных задач в разных формах.
Из того что у меня уже работает на модуле класса, это
-получение/потеря фокуса(Lost/Got): обработка событий всех текст и комбо боксов в формах (подсветка поля зеленым цветом при получении фокуса);
-клавиша вверх(KeyUp):отображение переключения раскладки клавиатуры в доп. форме (необходимо для удаленного рабочего стола)
-двойной клик(DblClik): вызов календаря во всех формах для полей, которые имеют короткий формат даты
-отслеживания запущенных программ у пользователей (Open/Unload)

Вроде все замечательно, но столкнулся с одной проблемой программирования.
Так вот вроде выглядит все хорошо, но проблема в том, что если в коллекции форм и контролов я могу выбрать итем с помощью строковой переменной, то для публичного события мне нужно жесткое название ИмениКонтрола.
Все это нужно для события вызова календаря в полях даты. После того как пользователь вводит дату руками, происходят события BeforeUpdate, которые обычно проверяют возможно ли введение данного значения в поле и далее разрешают выполнение AfterUpdate, в которых происходят основные изменения и вызовы различных функций.
А вот если мы вызываем календарь двойным кликом, то просто происходит событие двойного клика и ничего не происходит.
Для автоматизации написал в модуле класса вызов необходимых событий.
Модуль класса работает с формой по ссылке, поэтому напрямую выполнять процедуры в форме не получается, приходится обращаться по именам форм и контролов в формате
Код: vbnet
1.
Forms("ИмяФормы").Controls("ИмяКонтрола").ИмяКонтрола_AfterUpdate


Поэтому пока приходится использовать вот такой костыль для обработки событий
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
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 десятков и для каждого прописывать новый кейс, как то неправильно.
Хотелось использовать что-то более изящное,вроде
Код: vbnet
1.
Forms(tctrl.Parent.Name).(tctrl.Name).AfterUpdate


Может кто знает другие способы, как можно обращаться к событиям формы
...
Рейтинг: 0 / 0
14.01.2016, 09:40
    #39146975
Predeclared
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск события формы с помщью текстовой переменной
Если отвечать только на поставленный вопрос,
то: CallByName

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

Вам нужно показать не свой костыль, а то, как вызывается календарь и что он делает после выбора даты пользователем.
...
Рейтинг: 0 / 0
14.01.2016, 11:32
    #39147108
MorivVV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск события формы с помщью текстовой переменной
PredeclaredЕсли отвечать только на поставленный вопрос,
то: CallByName


Спасибо, как раз то, что нужно было.
Странно, что по справке Call не предлагает посмотреть эту функцию
...
Рейтинг: 0 / 0
14.01.2016, 15:35
    #39147432
MorivVV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск события формы с помщью текстовой переменной
На будущее, чтобы можно было найти, большой кейс в первом сообщении
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  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 заменяется на простенькую процедуру
Код: vbnet
1.
2.
  CallByName Forms(tctrl.Parent.Name), tctrl.Name & "_BeforeUpdate", VbMethod, canl
  If Not canl Then CallByName Forms(tctrl.Parent.Name), tctrl.Name & "_AfterUpdate", VbMethod
...
Рейтинг: 0 / 0
14.01.2016, 15:51
    #39147442
Predeclared
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск события формы с помщью текстовой переменной
Временно НЕ принимая во внимание возможности того,
что парентом контрола может оказаться вовсе не форма:

MorivVV
Код: vbnet
1.
2.
3.
...
  CallByName Forms(tctrl.Parent.Name), tctrl.Name & "_BeforeUpdate", VbMethod, canl
  ...


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

Берите сразу ссылку: CallByName tctrl.Parent, ...
...
Рейтинг: 0 / 0
14.01.2016, 16:42
    #39147529
23561346
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск события формы с помщью текстовой переменной
MorivVV
Код: vbnet
1.
 tctrl.Name & "_AfterUpdate"

13355757
...
Рейтинг: 0 / 0
15.01.2016, 09:37
    #39147933
MorivVV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск события формы с помщью текстовой переменной
23561346,

Спасибо, тоже полезное замечание
...
Рейтинг: 0 / 0
04.04.2016, 20:39
    #39207899
Запуск события формы с помщью текстовой переменной
Вылечил простым копированием неработающей формы. Старую удалил, а новой присвоил имя старой. Все заработало.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запуск события формы с помщью текстовой переменной / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]