На форме 30 флажков (check box) - все буквы алфавита.
Именно флажки, чтобы можно было выбрать сразу пару-тройку букв.
Как бы это отслеживать изменение состояния этих флажков в каком-нить
групповом режиме, не определяя 30 процедур _AfterUpdate. Т.е. как
просмотреть все контролы понятно, а вот после какого события и в каком
месте, вот в чем вопрос? Такое вообще возможно?
Всего наилучшего, Юрий Петров!
Thu Jan 11 2007 16:13, Юрий Петров wrote to All:
ЮП> Hа форме 30 флажков (check box) - все буквы алфавита.
ЮП> Именно флажки, чтобы можно было выбрать сразу пару-тройку букв.
ЮП> Как бы это отслеживать изменение состояния этих флажков в каком-нить
ЮП> групповом режиме, не определяя 30 процедур _AfterUpdate. Т.е. как
ЮП> просмотреть все контролы понятно, а вот после какого события и в каком
ЮП> месте, вот в чем вопрос? Такое вообще возможно?
Вряд ли. Я в таком случае просто пишу в обработчике события для каждого бокса
вызов основной процедуры в одно слово.
Пью за мир, за гуманизм и за трезвость всей Земли.
Old Nick [TEAM: None]
ЮП> Hа форме 30 флажков (check box) - все буквы алфавита.
ЮП> Именно флажки, чтобы можно было выбрать сразу пару-тройку букв.
ЮП> Как бы это отслеживать изменение состояния этих флажков в каком-нить
ЮП> групповом режиме, не определяя 30 процедур _AfterUpdate. Т.е. как
ЮП> просмотреть все контролы понятно, а вот после какого события и в каком
ЮП> месте, вот в чем вопрос? Такое вообще возможно?
Конечно, можно. У каждого комбобокса в дизайнере в поле обработчика события
After Update пишешь, например:
=HelloWorld("a")
а в коде формы создаёшь функцию:
Sub HelloWorld(letter as String)
Любопытно: если это не функция, а процедура, то она вызывается два раза! :-О
PS: А можно поставить всем совершенно одинаковый обработчик, не различающийся
аргументом. Тогда в функции надо будет использовать Me.ActiveControl, чтобы
узнать, какое именно поле обновилось.
╚═[ Andrew Usachov ]═══════════════[ 14 Jan 07, 01:18 ]══───-─-
> ЮП> Hа форме 30 флажков (check box) - все буквы алфавита.
> ЮП> Именно флажки, чтобы можно было выбрать сразу пару-тройку букв.
> ЮП> Как бы это отслеживать изменение состояния этих флажков в
> ЮП> каком-нить групповом режиме, не определяя 30 процедур
> ЮП>_AfterUpdate. Т.е. как
> ЮП> просмотреть все контролы понятно, а вот после какого события и в
> ЮП> каком месте, вот в чем вопрос? Такое вообще возможно?
> Вряд ли. Я в таком случае просто пишу в обработчике события для
> каждого бокса вызов основной процедуры в одно слово.
Попробовал этот вариант и вариант от Andrew Usachov. Для глаза
незаметно, но интересно, есть ли в таких ситуациях различие по
скорости обработки события?
Всего наилучшего, Юрий Петров!
> ЮП> Hа форме 30 флажков (check box) - все буквы алфавита.
> ЮП> Именно флажки, чтобы можно было выбрать сразу пару-тройку букв.
> ЮП> Как бы это отслеживать изменение состояния этих флажков в
> ЮП> каком-нить групповом режиме, не определяя 30 процедур
> ЮП>_AfterUpdate. Т.е. как
> ЮП> просмотреть все контролы понятно, а вот после какого события и в
> ЮП> каком месте, вот в чем вопрос? Такое вообще возможно?
>
> Конечно, можно. У каждого комбобокса в дизайнере в поле обработчика
> события After Update пишешь, например:
>
> =HelloWorld("a")
>
> а в коде формы создаёшь функцию:
> Sub HelloWorld(letter as String)
Отлично, работает. Без параметра. Мне параметр не нужен. И не Sub,
а Function, почему читай ниже.
> Любопытно: если это не функция, а процедура, то она вызывается два
> раза! :-О
У меня если это процедура, то выскакивает сообщение об ошибке, мол
нужен макрос, функция или строка [Процедура обработки событий...]. Как
ты вообще ее вызываешь? Access не ругается?
> PS: А можно поставить всем совершенно одинаковый обработчик, не
> различающийся аргументом. Тогда в функции надо будет использовать
> Me.ActiveControl, чтобы узнать, какое именно поле обновилось.
Я использую не ActiveControl, а цикл по Me.Controls - для
формирования строки фильтра каждый раз пробегаюсь по всем флажкам,
чтобы показывать только те записи, у которых первый символ - одна из
выбранных букв.
Спасибо и...
Всего наилучшего, Юрий Петров!
Может и не будешь использовать - но как вариант для расширения кругозора
будет думаю полезно. Для решения таких задач можно воспользоваться
способностью VBA наследовать/праязывать обработчики событий, т.е. обьявлять
переменные при помощи WithEvents.
Решение:
1. Создаем класс clsFlagEvt
Option Compare Database
Option Explicit
Private WithEvents cbxE As CheckBox
Private Sub cbxE_AfterUpdate()
If cbxE.Value = True Then
Debug.Print "tag", cbxE.Tag, "Down"
Else
Debug.Print "tag", cbxE.Tag, "UP"
End If
End Sub
Public Property Set ChekBox(cbxAct As CheckBox)
Set cbxE = cbxAct
cbxAct.AfterUpdate = "[Процедура обработки событий]"
End Property
2. В форме при загрузке привязываем флажки к нашему класу:
Option Compare Database
Option Explicit
Private a_evtFlags(1 To 4) As clsFlagEvt
Private Sub Form_Load()
Dim c As Control
Dim i As Integer
On Error Resume Next
i = 1
For Each c In Me.Controls
If c.ControlType = 106 Then ' 106 - CheckBox
Set a_evtFlags(i) = New clsFlagEvt
Set a_evtFlags(i).ChekBox = c
i = i + 1
End If
Next c
End Sub
У меня на форме было 4-ре флажка, поэтому и взял массив с четырмя
элементами. Можно вообще сделать динамический массив и расширять его по ходу
заполнения. Тогда можно просто ляпнуть на форму флажек и он у тебя сразу
подцепится к обработчику. Удобно :-)
Ну остальные детали, для идентификации флажка например использовать tag,
думаю понятны.
Валера
Только вышел, после непродолжительной болезни, на работу. Разгребу
текучку, попробую.
Всего наилучшего, Юрий Петров!