|
49 Кб. |
|
| В наборе элементов управления MSA имеется довольно интересный элемент - SubForm. Данный элемент насколько полезный, настолько и специфичный. К примеру, имеет всего два события - Enter и Exit, при этом все остальные события скрываются в форме, запросе, которые могут являться источником данных для этого элемента контроля.
Каким же существуют способы работы с SubForm по передачи событий в главную форму?
- Вариант 00 - Разделенная форма - создается автоматически на основе таблицы. То, что, при небольшом приближении, хотелось бы получить. Т.е. перемещаясь по записям в подчиненной форме, получать значения (с возможностью редактирования) в полях главной формы. Грубо говоря использовать элемент SubForm как "расширенный ListBox" (перемещать колонки, редактировать их ширину, применение различных фильтров и т.п.)
Недостатки:
- По сути не содержит SubForm;
- Работает с MSA2007 и выше.
- Вариант 01 - SubForm создается мастером, при этом автоматом в качестве источника данных присваивается вновь созданная форма, созданная на основе таблицы или запроса. Данные в полях главной формы, отображающих значения из подчиненной формы, связываются с SubForm вручную, через построитель.
Недостатки:
- Невозможно редактировать данные в полях главной формы;
- Для SubForm, в качестве объекта-источника, которого, используется запрос, таким способом связывание невозможно.
- Вариант 02 - связывание полей главной формы с записями SubForm через процедуру, функцию. Т.е. в подчиненной форме на событие Current ставится вызов процедуры, функции главной формы.
Недостатки:
- Для SubForm, в качестве объекта-источника, которого, используется запрос, таким способом связывание невозможно.
- Вариант 03 - связывание полей главной формы с записями SubForm через общую функцию. Т.е. в главной форме, при загрузке, обработчик события Current подчиненной формы ставится на вызов общей функции, которая, в свою очередь вызывает процедуру, функцию главной формы.
Недостатки:
- Как то некрасиво вызывать общую функцию, которая вызовет процедуру, функцию.
Похоже, что существует всего один универсальный способ (для форм, запросов) - Вариант 03?
Может кто поделится идеями, опытом, наработками в этом вопросе.
Прикреплен пример всех описанных вариантов для MSA2010 и 2003. (Правда экспорт в 2003 формат произошел как то не очень гладко, так что не пинайте ) | |
|
| |
|
|
|
|
You transferred an archive of format that McAfee Web Gateway cannot extract.
The security settings do not allow this archive to pass without virus scanning.
Please contact your administrator.
|
| |
|
| |
|
33 Кб. |
|
| Повторяю архивы в WinRAR для MSA2003 | |
|
| |
|
41 Кб. |
|
| Повторяю архивы в WinRAR для MSA2010 | |
|
| |
|
16 Кб. |
|
| Написано много, но понял мало. Жара.
...способы работы с SubForm по передачи событий в главную форму...
|
1. Начнем с того, что события могут быть только у класса, если они описаны и публичны.
2. Если мы используем запрос(спецформа) в качестве "вложения" контейнера "подчиненная форма",
то о событиях можно сразу забыть, потому как эта спецформа их не генерирует.
2. Если в качестве "вложения" контейнера "подчиненная форма" используется форма, то как всегда,
подписавшись на эти события, мы их могем слушать.
Пример: в форме frmParents слушается событие Current объекта frmChilds, находящегося в контейнере подчиненной формы. | |
|
| |
|
|
|
| А чего хотите то?
мне (старой больной обезьяне) вообще ни чего не понятно | |
|
| |
|
|
|
| Грубо говоря использовать элемент SubForm как "расширенный ListBox" (перемещать колонки, редактировать их ширину, применение различных фильтров и т.п.)
А может у меня старческий маразм начался на фоне жары | |
|
| |
|
|
|
|
|
такое ощущение, что контейнер "подчиненная форма", обладает всеми теми же событиями, что и форма. Я ошибаюсь?
|
Да. Контейнер один класс, вложение - другой класс.
Me.SubForm_qryTest.Form.OnCurrent = "=ToCurrentQ()"
|
Это мостик. Мы не можем подписаться на это событие,
но мы можем назначить функцию, которая будет вызвана на это событие.
Могет и ошибаюсь.
Добавлено:
А может 2007 или 2010 уже дают возможность слушать эти события?
Проверьте на своем 2010. | |
|
| |
|
|
|
| Похоже, что в этом плане в 2010 ничего не изменилось, если я все правильно сделал.
Private WithEvents frmSub03a As Form
Private Sub Form_Open(Cancel As Integer)
Me.SubForm_qryTest.SourceObject = "Query.qryTest"
Set frmSub03a = Me.SubForm_qryTest.Form
' Me.SubForm_qryTest.Form.OnCurrent = "=ToCurrentQ()"
frmSub03a.OnCurrent = "[Event Procedure]"
End Sub
Private Sub frmSub03a_Current()
'не отрабатывается
MsgBox "Current_Sub03a"
End Sub
|
| |
|
| |
|
|
|
| Понятно. У меня в 2003/sp2 тоже тишина. | |
|
| |