Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

когда много check box

7 views
Skip to first unread message

Юрий Петров

unread,
Jan 11, 2007, 8:13:05 AM1/11/07
to
Привет, All!
access2002,2003

На форме 30 флажков (check box) - все буквы алфавита.
Именно флажки, чтобы можно было выбрать сразу пару-тройку букв.
Как бы это отслеживать изменение состояния этих флажков в каком-нить
групповом режиме, не определяя 30 процедур _AfterUpdate. Т.е. как
просмотреть все контролы понятно, а вот после какого события и в каком
месте, вот в чем вопрос? Такое вообще возможно?

Всего наилучшего, Юрий Петров!

Nick Zykow

unread,
Jan 12, 2007, 2:16:18 AM1/12/07
to
Hello Юрий!

Thu Jan 11 2007 16:13, Юрий Петров wrote to All:
ЮП> Hа форме 30 флажков (check box) - все буквы алфавита.
ЮП> Именно флажки, чтобы можно было выбрать сразу пару-тройку букв.
ЮП> Как бы это отслеживать изменение состояния этих флажков в каком-нить
ЮП> групповом режиме, не определяя 30 процедур _AfterUpdate. Т.е. как
ЮП> просмотреть все контролы понятно, а вот после какого события и в каком
ЮП> месте, вот в чем вопрос? Такое вообще возможно?
Вряд ли. Я в таком случае просто пишу в обработчике события для каждого бокса
вызов основной процедуры в одно слово.

Пью за мир, за гуманизм и за трезвость всей Земли.
Old Nick [TEAM: None]

Andrew Usachov

unread,
Jan 13, 2007, 5:26:58 PM1/13/07
to
╔═[■]════════════════════════[ Hello Юрий! ]═══════─────────--─--─-
│ 11 Jan 07 16:13, Юрий Петров wrote to All:

ЮП> 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 ]══───-─-

Юрий Петров

unread,
Jan 17, 2007, 3:32:00 AM1/17/07
to
Привет, Nick Zykow!
"Nick Zykow" пишет:

> ЮП> Hа форме 30 флажков (check box) - все буквы алфавита.
> ЮП> Именно флажки, чтобы можно было выбрать сразу пару-тройку букв.
> ЮП> Как бы это отслеживать изменение состояния этих флажков в

> ЮП> каком-нить групповом режиме, не определяя 30 процедур
> ЮП>_AfterUpdate. Т.е. как


> ЮП> просмотреть все контролы понятно, а вот после какого события и в

> ЮП> каком месте, вот в чем вопрос? Такое вообще возможно?


> Вряд ли. Я в таком случае просто пишу в обработчике события для
> каждого бокса вызов основной процедуры в одно слово.

Попробовал этот вариант и вариант от Andrew Usachov. Для глаза
незаметно, но интересно, есть ли в таких ситуациях различие по
скорости обработки события?

Всего наилучшего, Юрий Петров!


Юрий Петров

unread,
Jan 17, 2007, 3:43:04 AM1/17/07
to
Привет, Andrew Usachov!
"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 - для
формирования строки фильтра каждый раз пробегаюсь по всем флажкам,
чтобы показывать только те записи, у которых первый символ - одна из
выбранных букв.

Спасибо и...

Всего наилучшего, Юрий Петров!


Valera

unread,
Jan 23, 2007, 3:43:09 AM1/23/07
to
Привет!!!

Может и не будешь использовать - но как вариант для расширения кругозора
будет думаю полезно. Для решения таких задач можно воспользоваться
способностью 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,
думаю понятны.

Валера


Юрий Петров

unread,
Jan 29, 2007, 10:40:28 AM1/29/07
to
Привет, Valera!
"Valera" пишет:

> Может и не будешь использовать - но как вариант для расширения
> кругозора
> будет думаю полезно. Для решения таких задач можно воспользоваться
> способностью VBA наследовать/праязывать обработчики событий, т.е.
> обьявлять переменные при помощи WithEvents.
...

Только вышел, после непродолжительной болезни, на работу. Разгребу
текучку, попробую.

Всего наилучшего, Юрий Петров!

0 new messages