Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Как скрыть элемент при потери им фокуса?  [new]
e-raven
Member

Откуда:
Сообщений: 91
Есть поле со списком, по умолчанию скрытое. Программно (по нажатию кнопки) поле выводится на экран, получает фокус, открывает список для выбора конкретного значения пользователем. Если пользователь выбирает значение, то возникает событие обновления, по которому фокус переводится с поля, само поле скрывается. Но вот если пользователь ничего из списка не выбирает, то и событий никаких нет, кроме событий выхода и потери фокуса. Но они не позволяют скрыть поле - оно по-прежнему в фокусе! Подскажите, как данную проблему лучше обойти?
18 янв 07, 15:02    [3661279]     Ответить | Цитировать Сообщить модератору
 Re: Как скрыть элемент при потери им фокуса?  [new]
Любопыт
Member

Откуда:
Сообщений: 1599
e-raven
Но вот если пользователь ничего из списка не выбирает, то и событий никаких нет.

Так по какому событию вы хотите скрыть это поле?
Вообще не рекомендуется делать контролы, которые исчезают и появляются, лучше Enable использовать... Это так совет. Пользователя может обескуражить если контрол вдруг исчезнет.
18 янв 07, 15:14    [3661424]     Ответить | Цитировать Сообщить модератору
 Re: Как скрыть элемент при потери им фокуса?  [new]
e-raven
Member

Откуда:
Сообщений: 91
В том-то и дело, что не найду такого события. А скрывать комбобокс нужно по той причине, что с помощью него и кнопки эмулируется тулбар с кнопкой DropDown. Если сделать высоту комбобокса нулевой, всё равно комбобокс немного виден.
18 янв 07, 18:01    [3662771]     Ответить | Цитировать Сообщить модератору
 Re: Как скрыть элемент при потери им фокуса?  [new]
Бенедикт
Member

Откуда:
Сообщений: 2099
e-raven,
может, у комбобокса уменьшить ширину (не высоту), оставив видимой только кнопку (а, свойству "Ширина списка" присвоить конкретное значение, а не "Авто")? И - вот ещё.
18 янв 07, 18:51    [3663134]     Ответить | Цитировать Сообщить модератору
 Re: Как скрыть элемент при потери им фокуса?  [new]
e-raven
Member

Откуда:
Сообщений: 91
Если уменьшить и высоту и ширину поля со списком до нуля, то на экране комбобокс проявляется в виде точки, что не очень смотрится. Уж лучше в виде горизонтальной или вертикальной черты, которую можно расположить под кнопкой или слева от неё (справа неудобно, так как список открывается вправо; если только кнопку со стрелкой расположить слева от обычной кнопки, но это непривычное расположение). Вариант с контекстным меню сам по себе более громоздкий, к тому же в моей базе все меню формируются динамически при входе в базу - не хотелось бы их плодить. Блокировать комбобокс, как предлагают некоторые, не получится - та же проблема, что и со скрытием: пока элемент имеет фокус, его ни блокировать, ни скрыть нельзя!!!
19 янв 07, 10:30    [3664933]     Ответить | Цитировать Сообщить модератору
 Re: Как скрыть элемент при потери им фокуса?  [new]
e-raven
Member

Откуда:
Сообщений: 91
В одноименной закрытой ветке Люботыт (сбасибо ему) дал очевидное решение: в процедуре обработки события потери фокуса комбобокса использовать SetFocus на другой элемент. Но по ходу пришлось решать следующую проблему. После открытия списка возможны следующие варианты: пользователь делает выбор мышью, нажимает ESC, щелкает мышью на форме (фокус остается на комбобоксе) или переводит фокус на другие элементы мышью, нажатием клавиш Enter,Tab. В первых случаях для инициирования события потери фокуса необходимо программно передать фокус другим элементам, а вот этого как раз сделать и нельзя - возникает ошибка с сообщением о невозможности в данный момент передать фокус другому элементу. Поэтому пришлось использовать в соответствующих процедурах On Error Resume Next, что не очень-то хорошо.

В упрощенном варианте это стало выглядеть следующим образом:

Private Sub Кнопка1_Click()
    If Me.ПолеСоСписком1.Visible = True Then
        Me.ПолеСоСписком1.Visible = False
    Else
        Me.ПолеСоСписком1.Visible = True
        Me.ПолеСоСписком1.SetFocus
        Me.ПолеСоСписком1.Dropdown
    End If
End Sub

Private Sub ОбластьДанных_Click()
    On Error Resume Next
    If Screen.ActiveControl.Name = "ПолеСоСписком1" Then Me.Кнопка1.SetFocus
End Sub

Private Sub ПолеСоСписком1_AfterUpdate()
    On Error Resume Next
    Me.Кнопка1.SetFocus
    ' обработка выбора пользователя
End Sub

Private Sub ПолеСоСписком1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyEscape Then
        On Error Resume Next
        Me.Кнопка1.SetFocus
    End If
End Sub

Private Sub ПолеСоСписком1_LostFocus()
    Me.Кнопка1.SetFocus
    Me.ПолеСоСписком1.Visible = False
End Sub

Private Sub ПолеСоСписком1_NotInList(NewData As String, Response As Integer)
    Me.ПолеСоСписком1 = Null
End Sub
19 янв 07, 14:52    [3667459]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить