Как свойство ComboBox.MatchEntry может иметь значение `fmMatchEntryComplete`, но иметь возможность перезаписывать функцию автозаполнения? - PullRequest
0 голосов
/ 27 ноября 2018

Моя проблема в том, что в поле со списком имплантирован список со ComboBox.List = MyArr в качестве данных списка в окне.Я надеялся, что он будет работать аналогично большинству пользовательских форм, которые вы видите в других приложениях, где при наборе в выпадающем списке будет отображаться наилучшее совпадение по отношению к вводу пользователя, но удаляется функция автозаполнения, когда вы нажимаете кнопку возврата на клавиатуре.

Проблема возникает, когда я пытаюсь ввести только сокращенную версию текста.Примером этого является то, что в предопределенном списке содержится слово «СОЛНЦЕ», но вместо этого я хочу ввести «СОЛНЦЕ».Поле со списком всегда будет автоматически заполняться до "СОЛНЦЕ", что бы я ни делал.Но я также не хочу удалять функцию автозаполнения.

Ниже приведен образец моей формы: enter image description here

1 Ответ

0 голосов
/ 27 ноября 2018

Я думаю, что есть обходной путь для достижения желаемого поведения с помощью события _KeyDown.

Вы можете изменить поведение вашего ComboBox1, используя это:

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If Me.ComboBox1.SelLength > 0 And KeyCode = 8 Then
        KeyCode = 46
    End If
End Sub

Он смотрит, есть ли выделенный текст, и если нажата клавиша возврата KeyCode = 8, если это так, он меняет его на удаление KeyCode = 46.Если ничего не выбрано, он будет как обычно.событие.

  1. Добавьте модуль класса и назовите его CmbClass следующим кодом:

    Option Explicit
    
    Public WithEvents ComboBoxGroup As MSForms.ComboBox
    
    Private Sub ComboBoxGroup_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If ComboBoxGroup.SelLength > 0 And KeyCode = 8 Then
            KeyCode = 46
        End If
    End Sub
    
  2. Добавьте следующий код к каждомуUserForm вы хотите применить поведение:

    Option Explicit
    
    Dim ComboBoxes() As New cmbClass
    
    Private Sub UserForm_Initialize()
        Dim ComboBoxCount As Integer
        Dim ctl As Control
        ComboBoxCount = 0
        For Each ctl In Me.Controls
            If TypeName(ctl) = "ComboBox" Then
                ComboBoxCount = ComboBoxCount + 1
                ReDim Preserve ComboBoxes(1 To ComboBoxCount)
                Set ComboBoxes(ComboBoxCount).ComboBoxGroup = ctl
            End If
        Next ctl
    End Sub
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...