Страница 1 из 1

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

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

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

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

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

поищи в инете - примеров тьма тьмущая

Добавлено: 06 июл 2004, 12:08
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: Не особо сложно-ли, может что по-проще есть?
А ловить "кей", думаю будет тоже самое.

Добавлено: 06 июл 2004, 15:37
папа Карло
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 надо ловить и чар его обрабатывать....

Добавлено: 06 июл 2004, 22:26
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: Не особо сложно-ли, может что по-проще есть?
А ловить "кей", думаю будет тоже самое.
Вот смотри: ты сначала позволил юзеру ввести все что он хочет. Он радостный такой, особливо на фоне того что есть подпись вводить токма шешнадцатиричные символы, а он такой моодца смог ввести что захотел.. потом он кликает.. читает твой мессаджбокс, нажимает на нем пидаль ок, опять идет вводить/править текст

а нуно ИМХО делать так что он НЕ может ввести ничего что выпадает из ряда. шагов по вводу будет сильно меньше -> меньше глюков -> проще дальнейший апдейт

Добавлено: 08 июл 2004, 07:39
Seaman
Моя проблема в том только, на данный момент, что я не знаю как избавиться в таком случае от следующего бага:
Чтобы исключить всякие инсинуации со стороны "умного" юзера, который пожелает ввести строку не заглавными, а строчными буквами, я дожидаюсь окончания ввода строки и на lostfocus перекидываю все буквы в upper case. Если я делаю это на keyup, то после перевода буквы в upper case, курсор возвращается в начало строки, чего нам не надо :evil:
Можно, конечно, добавить эти 6 буковок нижнего регистра в аррэй разрешенных значков и переводить их в верхний регистр после того как, но правильное ли это решение вопроса? :?:

Добавлено: 08 июл 2004, 08:09
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:

Добавлено: 08 июл 2004, 08:39
Seaman
О.К. додумался:

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

Text1.SelStart = Len(Text1.Text)
:D Какой я вумный! Ну прям як вутка!

Добавлено: 18 июл 2004, 09:05
tasko
Seaman писал(а):О.К. додумался:

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

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

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

Кстати, это ты в Аксессе пишешь? Ежели что, спрашивай, чем можем, поможем.

Добавлено: 18 июл 2004, 09:50
Seaman
Нет, это чисто VB6, генератор кода для регистрации продукта.
Однако спасибо за предложение.