Надлежащий корпус в VB6

#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 представляется самым простым способом получения надежных результатов в форме, где требуется форматированный ввод.