VBA, MS Access MS Access в примерах

Циклическое перемещение по значениям поля со списком (ListBox) и обработка нажатий клавиш.

Данная процедура "вешается" на событие "Клаваша вниз" поля со списком.

В данном примере рассмотрен случай когда форма не несет на себе ничего кроме самого списка.
То есть, это некое меню - единственным предназначением которого служит выбор одного значения из нескольких.
Работает это так:
      Если пользователь находится на самом нижнем элементе списка и нажимет клавишу ВНИЗ - то тут же оказывается на первом элементе списка, и наоборот, если на самом верхнем нажимет клавишу ВВЕРХ - то оказывается на последнем.
... а при нажатии ENTER - программа принимает значение выбранное в списке, закрывает форму и делает то что положено при выборе данного значения.

Private Sub lstTypeSID_KeyDown(KeyCode As Integer, Shift As Integer)
'Нажатие клавиши в списке - Бегаем по кругу и ждём [ENTER]
'--------------------------------------------------------------------------
Dim crlListBox As ListBox
On Error GoTo ListBoxKeyDown_Err
    
    Set crlListBox = Me!lstTypeSID 'Установка текущего контрола ListBox
    
    Select Case KeyCode
        Case vbKeyUp 'Нажата клавиша ВВЕРХ
            If crlListBox.ListIndex = 0 Then
                KeyCode = 0
                crlListBox.ListIndex = Me!lstTypeSID.ListCount - 1
            End If
        Case vbKeyDown 'Нажата клавиша ВНИЗ
            If crlListBox.ListIndex = crlListBox.ListCount - 1 Then
                KeyCode = 0
                crlListBox.ListIndex = 0
            End If
        Case vbKeyReturn 'Нажата клавиша ENTER
            ' Обработка того что выбрал пользователь
            Set crlListBox = Nothing
            'cmdSave_Click 'Закрытие
    End Select
    
ListBoxKeyDown_Bye:
    Set crlListBox = Nothing
    Exit Sub

ListBoxKeyDown_Err:
    Debug.Print Err.Description
    Err.Clear
    KeyCode = 0
    Resume ListBoxKeyDown_Bye
End Sub

Private Sub lstTypeSID_DblClick(Cancel As Integer)
'И двойной клик мышкой заодно
    cmdSave_Click 'Закрытие
End Sub





Ещё вариант:


Private Sub lstInterface_KeyDown(KeyCode As Integer, Shift As Integer)
'es - 08.08.2019 LE 09.08.2019
'Выбор интерфеса создаваемой записи ... по Me!lstInterface  ...
'Нажатие клавиши в поле со списком - Бегаем по кругу и ждём [ENTER]
'----------------------------------------------------------------
Dim ctrlListBox As ListBox
Dim lLCount&
On Error GoTo lstInterface_KeyDown_Err

    Set ctrlListBox = Me!lstInterface  'Установка текущего контрола ListBox
    lLCount = ctrlListBox.ListCount    'Всего элементов в списке
    
    Select Case KeyCode
        Case vbKeyUp 'Нажата клавиша ВВЕРХ
            If ctrlListBox.ListIndex = 0 Then 'Мы на первой записи
                KeyCode = 0
                ctrlListBox.ListIndex = lLCount - 1 'На последнюю
            End If
        Case vbKeyDown 'Нажата клавиша ВНИЗ
            If ctrlListBox.ListIndex = lLCount - 1 Then
                KeyCode = 0
                ctrlListBox.ListIndex = 0           'На первую
            End If
        Case vbKeyReturn 'Нажата клавиша ENTER
            ' Обработка того что выбрал пользователь
            Set ctrlListBox = Nothing
            cmdAdd_Click ' Обработка выбора
    End Select


lstInterface_KeyDown_End:
    On Error Resume Next
    Set ctrlListBox = Nothing
    Err.Clear
    Exit Sub

lstInterface_KeyDown_Err:
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in Sub lstInterface_KeyDown.", vbCritical, "Произошла ошибка!"
    Err.Clear
    Resume lstInterface_KeyDown_End

End Sub
Назад ToTop
L.E. 25.08.2023
Рейтинг@Mail.ru