Авто заглавные буквы в ограниченных формах - PullRequest
2 голосов
/ 09 июня 2011

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

Private Sub textbox_BeforeUpdate(Cancel As Integer)
    Me.textbox = UCase(Me.textbox)
End Sub

, но это вызывает ошибку ... Есть предложения?

И я заметил, что в ограниченном, непрерывномформа, я не могу переместить указатель в его наборе записей.

Me.Recordset.MoveNext

Это вызывает ошибку (номер 3462).Почему?

Ответы [ 4 ]

2 голосов
/ 09 июня 2011

Поместите выражение UCase в событие после обновления текстового поля элемента управления.

Private Sub textbox_AfterUpdate()
    Me.textbox = UCase(Me.textbox)
End Sub

Что касается второго вопроса, то он работает без ошибок для кнопки в моей форме.

Private Sub cmdMoveNext_Click()
    Me.Recordset.MoveNext
End Sub

Это то, что я получаю в «Немедленном окне» для вашего номера ошибки.

? AccessError(3462)
Failure to load a DLL.

Это текст ошибки, который вы видите?Если это так, я не знаю причину, но я хотел бы знать, если ваша база данных повреждена.Можете ли вы создать упрощенную версию этой формы в новой базе данных, чтобы посмотреть, работает ли она там?Если это также не удается, возможно, ваша установка Access не работает.

Честно говоря, я просто хватаюсь за соломинку.Это кажется мне очень необычным.

1 голос
/ 09 июня 2011

По первому вопросу: используйте событие «Нажатие клавиши», чтобы проверить наличие строчных букв, а затем вернуть его верхний регистр:

Private Sub textbox_KeyPress(KeyAscii As Integer)
  Const ASCII_LOWER_A = 97
  Const ASCII_LOWER_Z = 122
  Const UPPER_MODIFIER = -32

  If KeyAscii >= ASCII_LOWER_A And KeyAscii <= ASCII_LOWER_Z Then
    KeyAscii = KeyAscii + UPPER_MODIFIER
  End If

End Sub

ОБНОВЛЕНИЕ : так как яПолучив критику и отрицательный ответ за мой ответ, я уточню, когда и почему вы можете использовать приведенный выше код.

Сначала позвольте мне сказать, что событие * After_Update * срабатывает после того, как элемент управления, связанный с этим событием, теряет фокус(либо через вкладку, либо фактически переходя к следующей записи).* After_Update * также распознает вставку, если пользователь вырезает и вставляет текст;по общему признанию, мой код не делает.Если ваша единственная задача - сохранить текст в базе данных в верхнем регистре, непременно используйте * After_Update * для UCase значения.

Однако есть одно преимущество, которое дает нажатие * KEY_PRESS *: возможностьчтобы исправить букву, нажатую в режиме реального времени.

Разработчику-пуристу это событие может показаться расточительным.Тем не менее, любой, кто получил зарплату от компании, должен признать, что обязательным условием является поддержание платежеспособного клиента.Если этот платный клиент говорит « Я хочу видеть заглавные буквы, когда пользователь начинает вводить », тогда вы должны использовать код выше.Это будет иметь незначительное влияние (если таковое имеется) на поведение приложения и будет отвечать требованиям вашего начальника.

На самом деле, может быть, клиент говорит « Эй, это поле для ввода серийных номеров для нашего инвентаря.Все серийные номера продуктов используют нули, а не букву O. Поэтому, пожалуйста, убедитесь, что они не вводят O для этого поля . ”

Теперь * KEY_PRESS * имеет дополнительное использование.Вы можете либо отрицать нажатую букву O, либо вы можете заменить букву O нажатой на нужное вам значение:

Private Sub TextBox_KeyPress(KeyAscii As Integer)
    Const ASCII_LOWER_A = 97
    Const ASCII_LOWER_Z = 122
    Const UPPER_MODIFIER = -32

    Const UPPER_O = 79
    Const LOWER_O = 111
    Const ZERO_ASCII = 48

    Select Case KeyAscii

        Case UPPER_O, LOWER_O
            KeyAscii = 0 'Cancel it out
            'KeyAscii = ZERO_ASCII 'OR Replace it with the number zero
        Case ASCII_LOWER_A To ASCII_LOWER_Z
            KeyAscii = KeyAscii + UPPER_MODIFIER  'The old familiar code that will capitalize all other letters
        Case Else
        'Whatever other validations you want to do on the textbox here.

    End Select

End Sub

Так как насчет вырезания и вставки недопустимых значений?Для этого и существует событие Form_BeforeUpdate.Вы можете проверить все значения перед сохранением и установить Cancel = True, если что-то не соответствует.

Это очень полезное событие, которое полностью применимо, если вы хотите использовать UCase буквы в реальном времени.

0 голосов
/ 09 июня 2011

Попробуйте

Private Sub textbox_BeforeUpdate(Cancel As Integer)
    Dim strBuffer As String
    strBuffer = Me.textbox
    Me.textbox.Focus
    Me.textbox = UCase(strBuffer)
End Sub
0 голосов
/ 09 июня 2011

Вы пробовали поместить его в TextBox1_Change Sub ???

...