#vb6
#vb6
Вопрос:
Я играю в викторину в VB6. Мне нужно, чтобы текстовое поле автоматически подписывало первую букву, но этот код
Private Sub Anstxt_Change()
Anstxt.Text = StrConv(Anstxt.Text, vbProperCase)
End Sub
вызывает инверсию слова. Таким образом, вместо «Деревьев» он превращается в «Seert»
Как мне это изменить?
Комментарии:
1.
vbProperCase
работает здесь. Используете ли вы языковой стандарт справа налево в Windows, например, иврит или арабский?
Ответ №1:
Обратите внимание на то, где курсор находится в текстовом поле, когда Change
происходит событие: он находится в начале текстового поля. Добавьте Debug.Print
оператор, чтобы увидеть, что происходит во время ввода:
Private Sub Anstxt_Change()
Debug.Print StrConv(Anstxt.Text, vbProperCase)
Anstxt.Text = StrConv(Anstxt.Text, vbProperCase)
End Sub
Результат выглядит следующим образом
T
T
Rt
Rt
Ert
Ert
Eert
Eert
Seert
Seert
Здесь следует отметить две вещи: Change
событие запускается дважды: один раз при вводе текста и один раз при изменении значения текстового поля в Change
событии. Это дает вам представление о том, что манипулирование текстом текстового поля в его Change
событии не является хорошей идеей. Я предлагаю вместо этого поместить этот код в LostFocus
событие.
Второе, на что следует обратить внимание, это то, что, поскольку курсор всегда находится в начале текстового поля, вводимые вами буквы вставляются туда перед существующими буквами. Итак, после изменения .Text
свойства текстового поля вы должны поместить курсор в конец текстового поля с .SelStart
помощью метода:
Anstxt.SelStart = Len(Anstxt.Text)
например
Private Sub Anstxt_Change()
Anstxt.Text = StrConv(Anstxt.Text, vbProperCase)
Anstxt.SelStart = Len(Anstxt.Text)
End Sub
Комментарии:
1. Отличное объяснение
2. Согласен, отличное объяснение. Я также обнаружил, что использование события LostFocus представляется самым простым способом получения надежных результатов в форме, где требуется форматированный ввод.