Скрыть элемент управления при нажатии за его пределами, VBA Access - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть форма со следующими элементами управления:

  1. Три текстовых поля (text_box_a, text_box_b, text_box_c)
  2. Список (list_ctrl)
  3. Рамка рисунка(pic_frame)

Я бы хотел, чтобы поле со списком исчезало всякий раз, когда пользователь щелкает за пределами своих границ, но не когда оно щелкает одно конкретное текстовое поле ( text_box_a ).Также, чтобы он появлялся снова, когда он щелкает внутри указанного текстового поля.

Что я пробовал:

Private Sub text_box_a_GotFocus()
    Me.list_ctrl.Visible = True
End Sub

Private Sub list_ctrl_LostFocus()
    If Not (Me.text_box_a Is Me.ActiveControl) Then
        Me.list_ctrl.Visible = False
    End If
End Sub

Я работаю в Microsoft Access 2013

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Один вариант - использовать 2 стандартные функции в вашем коде (одну, чтобы скрыть элемент управления, другую, чтобы показать его), а затем присвоить событиям текстового поля OnGotFocus одну в зависимости от того, является ли она text_box_a или одной.других элементов управления:

Сначала вы устанавливаете 2 разные функции:

Public Function ShowListBox()
    Me.list_ctrl.Visible = True
End Function

Public Function HideListBox()        
    ' if active control is list box, change active control
    ' before hiding list box
    If Me.ActiveControl.Name = Me.list_ctrl.Name Then
        Me.text_box_b.SetFocus
    End If

    Me.list_ctrl.Visible = False

End Function

Затем вы можете назначить различные события управления одному из них в цикле в FormLoad событие.Как то так:

Private Sub Form_Load()
    ' set up the form detail's OnClick event separately from the control loop.
    Me.Detail.OnClick = "=HideListBox()"

    Dim ctl As Access.Control

    For Each ctl In Me.Controls
        If ctl.Name = Me.list_ctrl.Name Then
            ' do nothing here
            ' (control will be hidden or not
            ' based on other control's OnGotFocus,
            ' or Form details OnClick
        ElseIf ctl.Name = Me.text_box_a.Name Then
            ctl.OnGotFocus = "=ShowListBox()"
        ElseIf TypeName(ctl) = "TextBox" Then
            ctl.OnGotFocus = "=HideListBox()"
        End If
    Next ctl
End Sub
0 голосов
/ 07 декабря 2018

Я бы хотел, чтобы поле со списком исчезало всякий раз, когда пользователь щелкает за его пределами ...

Если вы имеете в виду, что вы щелкаете в деталях формыраздел, говоря «вне его границ», вы можете использовать событие Detail_Click() формы.

Использование события Enter текстовых полей также «ловит» щелчки на соответствующих метках, а такжеработать, когда вы используете клавиатуру для перемещения фокуса.

Private Sub Detail_Click()
    If Not (Me.list_ctrl Is Me.ActiveControl) Then
        Me.list_ctrl.Visible = False
    End If
End Sub

Private Sub text_box_a_Enter()
    Me.list_ctrl.Visible = True
End Sub

Private Sub text_box_b_Enter()
    Me.list_ctrl.Visible = True
End Sub

Private Sub text_box_c_Click()
    Me.list_ctrl.Visible = True
End Sub

Но есть проблема с сокрытием list_ctrl, когда он имеет фокус.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...