Простой вопрос по VB6

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
Seaman
Пользователь
Сообщения: 197
Зарегистрирован: 21 фев 2003, 13:26
Откуда: Ессентуки-Нврск-СПб-Торонто

Простой вопрос по VB6

Сообщение Seaman »

Нужно ограничить вводимые через TextBox значки в VB6 аппликации шестнадцатиричными значениями (0 ... F). Как можно организовать проверку на "вшивость" в данном случае, чтобы выдать пользователю ошибку в MsgBox в случае, если он ввел что-то не дозволенное?
Кто подскажет, есть-ли что нибудь такое в VB6? Должно быть, по идее, но не могу найти или не то ищу (не знаю, что искать). Подскажите, братцы. :pray:
Аватара пользователя
Vitaliy-2000
Пользователь
Сообщения: 72
Зарегистрирован: 29 авг 2003, 03:27
Откуда: Москва-Торонто
Контактная информация:

Re: Простой вопрос по VB6

Сообщение Vitaliy-2000 »

Seaman писал(а):Нужно ограничить вводимые через TextBox значки в VB6 аппликации шестнадцатиричными значениями (0 ... F). Как можно организовать проверку на "вшивость" в данном случае, чтобы выдать пользователю ошибку в MsgBox в случае, если он ввел что-то не дозволенное?
Кто подскажет, есть-ли что нибудь такое в VB6? Должно быть, по идее, но не могу найти или не то ищу (не знаю, что искать). Подскажите, братцы. :pray:
точно есть :)

такое уже писано переписано. общая идея такая что надо ловить "киипресы" и смотреть введеный код

поищи в инете - примеров тьма тьмущая
Аватара пользователя
Seaman
Пользователь
Сообщения: 197
Зарегистрирован: 21 фев 2003, 13:26
Откуда: Ессентуки-Нврск-СПб-Торонто

Сообщение Seaman »

Пока не нашел, сделал так:

Код: Выделить всё

Dim strHexa(15) As String

Private Sub Command1_Click()
    Dim strText As String
    Dim intChar As Integer
    Dim intHex As Integer
    Dim intError As Integer
    
    strText = Text1.Text & Text2.Text
    
    For intChar = 1 To 8 Step 1
        For intHex = 0 To 15 Step 1
            If Mid(strText, intChar, 1) = strHexa(intHex) Then
                Exit For
            End If
        Next intHex
        If intHex = 16 Then
            intError = 1
            GoTo FormError
        End If
    Next intChar
    
    ...
    
FormError:
    If intError = 1 Then
        MsgBox "Only Hexadecimals are allowed here!", vbOKOnly + vbExclamation, "Error"
        Text1.Text = ""
        Text2.Text = ""
        strText = ""
        Text1.SetFocus
    End If
End Sub
:idea: Не особо сложно-ли, может что по-проще есть?
А ловить "кей", думаю будет тоже самое.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

Seaman писал(а):Пока не нашел, сделал так:

Код: Выделить всё

Dim strHexa(15) As String

Private Sub Command1_Click()
    Dim strText As String
    Dim intChar As Integer
    Dim intHex As Integer
    Dim intError As Integer
    
    strText = Text1.Text & Text2.Text
    
    For intChar = 1 To 8 Step 1
        For intHex = 0 To 15 Step 1
            If Mid(strText, intChar, 1) = strHexa(intHex) Then
                Exit For
            End If
        Next intHex
        If intHex = 16 Then
            intError = 1
            GoTo FormError
        End If
    Next intChar
    
    ...
    
FormError:
    If intError = 1 Then
        MsgBox "Only Hexadecimals are allowed here!", vbOKOnly + vbExclamation, "Error"
        Text1.Text = ""
        Text2.Text = ""
        strText = ""
        Text1.SetFocus
    End If
End Sub
:idea: Не особо сложно-ли, может что по-проще есть?
А ловить "кей", думаю будет тоже самое.
KeyUp event надо ловить и чар его обрабатывать....
Аватара пользователя
Vitaliy-2000
Пользователь
Сообщения: 72
Зарегистрирован: 29 авг 2003, 03:27
Откуда: Москва-Торонто
Контактная информация:

Сообщение Vitaliy-2000 »

Seaman писал(а):Пока не нашел, сделал так:

Код: Выделить всё

Dim strHexa(15) As String

Private Sub Command1_Click()
    Dim strText As String
    Dim intChar As Integer
    Dim intHex As Integer
    Dim intError As Integer
    
    strText = Text1.Text & Text2.Text
    
    For intChar = 1 To 8 Step 1
        For intHex = 0 To 15 Step 1
            If Mid(strText, intChar, 1) = strHexa(intHex) Then
                Exit For
            End If
        Next intHex
        If intHex = 16 Then
            intError = 1
            GoTo FormError
        End If
    Next intChar
    
    ...
    
:idea: Не особо сложно-ли, может что по-проще есть?
А ловить "кей", думаю будет тоже самое.
Вот смотри: ты сначала позволил юзеру ввести все что он хочет. Он радостный такой, особливо на фоне того что есть подпись вводить токма шешнадцатиричные символы, а он такой моодца смог ввести что захотел.. потом он кликает.. читает твой мессаджбокс, нажимает на нем пидаль ок, опять идет вводить/править текст

а нуно ИМХО делать так что он НЕ может ввести ничего что выпадает из ряда. шагов по вводу будет сильно меньше -> меньше глюков -> проще дальнейший апдейт
Аватара пользователя
Seaman
Пользователь
Сообщения: 197
Зарегистрирован: 21 фев 2003, 13:26
Откуда: Ессентуки-Нврск-СПб-Торонто

Сообщение Seaman »

Моя проблема в том только, на данный момент, что я не знаю как избавиться в таком случае от следующего бага:
Чтобы исключить всякие инсинуации со стороны "умного" юзера, который пожелает ввести строку не заглавными, а строчными буквами, я дожидаюсь окончания ввода строки и на lostfocus перекидываю все буквы в upper case. Если я делаю это на keyup, то после перевода буквы в upper case, курсор возвращается в начало строки, чего нам не надо :evil:
Можно, конечно, добавить эти 6 буковок нижнего регистра в аррэй разрешенных значков и переводить их в верхний регистр после того как, но правильное ли это решение вопроса? :?:
Аватара пользователя
Seaman
Пользователь
Сообщения: 197
Зарегистрирован: 21 фев 2003, 13:26
Откуда: Ессентуки-Нврск-СПб-Торонто

Сообщение Seaman »

Вот сделал так:

Код: Выделить всё

Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
    Dim intHex As Integer
    Dim intError As Integer
    
    For intHex = 0 To 21 Step 1
        If Mid(Text1.Text, Len(Text1.Text), 1) = strHexa(intHex) Then
            Exit For
        End If
    Next intHex
    If intHex = 22 Then
        intError = 1
        GoTo FormError
    End If
    
    If Len(Text1.Text) = 4 Then
        Text2.SetFocus
    End If
    
FormError:
    If intError = 1 Then
        MsgBox "Only Hexadecimals are allowed here!", vbOKOnly + vbExclamation, "Error"
        Text1.Text = Replace(Text1.Text, Mid(Text1.Text, Len(Text1.Text), 1), "")
    End If
End Sub
, но опять же проблема в фокусе.
Как сделать так, чтобы после удаления неправильной буквы курсор оставался в конце строки, а не скакал в ее начало?:dunno:
Аватара пользователя
Seaman
Пользователь
Сообщения: 197
Зарегистрирован: 21 фев 2003, 13:26
Откуда: Ессентуки-Нврск-СПб-Торонто

Сообщение Seaman »

О.К. додумался:

Код: Выделить всё

Text1.SelStart = Len(Text1.Text)
:D Какой я вумный! Ну прям як вутка!
tasko
Графоман
Сообщения: 18705
Зарегистрирован: 20 июл 2003, 09:16
Откуда: Торонто

Сообщение tasko »

Seaman писал(а):О.К. додумался:

Код: Выделить всё

Text1.SelStart = Len(Text1.Text)
:D Какой я вумный! Ну прям як вутка!
Ну вот видишь? Если долго мучится, что-нибудь получится.

Однако я бы не ловил событие KeyUP. Лучшим решением является событие KeyPress. Дело в том, что если клавиша соответствует коду символа, то к этим двум событиям в очереди сообщений добавляется событие KeyPress. Обрабатывая событие KeyUP, ты можешь затирать те нажатия, которые тебе и не предназначались. Кроме того, если человек нажал клавишу и не отпускает, событие KeyUP не генерируется, зато символов одинаковых генерируется хоть отбавляй.

Кстати, это ты в Аксессе пишешь? Ежели что, спрашивай, чем можем, поможем.
Аватара пользователя
Seaman
Пользователь
Сообщения: 197
Зарегистрирован: 21 фев 2003, 13:26
Откуда: Ессентуки-Нврск-СПб-Торонто

Сообщение Seaman »

Нет, это чисто VB6, генератор кода для регистрации продукта.
Однако спасибо за предложение.
Ответить