проверка длинны

Тема в разделе "Visual Basic", создана пользователем kaskad755, 8 мар 2009.

  1. kaskad755

    kaskad755 Active Member

    Регистрация:
    13 фев 2009
    Сообщения:
    34
    Симпатии:
    0
    Начал год назад изучать vb6.0, каждый день узнаю что то новое, есть проблемка:
    5 текстовых полей в которые вводятся цыфры от 1 до 12, но есть поля в которые ничего не вводится (т. е. они пустые). Незнаю как добавить проверку перед запретом, если подскажете спасибо (или подскажите, где это можно прочитать, чтоб понять).

    Private Sub Text1_GotFocus()
    Me.Text1.Tag = Me.Text1.Text
    End Sub
    Private Sub Text1_LostFocus()
    Dim s As String
    With Me.Text1
    s = .Text
    +++++++++++++++++++++Что вставить просто не знаю+++++++++++++
    If Not (s Like "[1-9]" Or s Like "1[1-2]") Then
    .SelStart = 0
    .SelLength = Len(s)
    MsgBox "ВОЗМОЖНЫ ТОЛЬКО ЦЫФРЫ ОТ 1 ДО 12", vbCritical, "Error"
    .SetFocus
    End If
    End With
    End Sub
     
  2. Tanya

    Tanya Гость

    нужно чуть подправить условие
    If Not (s Like "[1-9]" Or s Like "1[1-2]") Then

    на

    If Len(s) > 0 And Not (s Like "[1-9]" Or s Like "1[0-2]") Then

    в прошлый раз я не совсем верно написала его в части s Like "1[1-2]" - исключила число 10 ))) сорри

    и при получении фокуса содержимое текстбокса запоминалось в его Tag. а потом не использовалось,
    что не оч хорошо (к чему неиспользованный код ))), а вообще мысль была такая: запоминать предыдущее значение,
    если его необходимо будет вернуть))) Поскольку возврат старого значения не используется, то
    обработчик получения фокуса можно удалить )))

    ну, и все же, я бы написала Цифры, а не Цыфры, а еще лучше Числа (т.к. 10, 11 и 12 - это не цифры) ))))
     
  3. kaskad755

    kaskad755 Active Member

    Регистрация:
    13 фев 2009
    Сообщения:
    34
    Симпатии:
    0
    Если я Вас правильно понял, это не цыфры это символы......... или нет

    Понимаете. я решил в одной программе совместить SUDOKU: 9х9, 12х12, 16х16 и т. д.( Говоря порусски-решил перепрыгнуть через голову). 9х9 там всё просто-задача решена, так же как и 9х9 (диогональ),это не вопрос (хоть что то понял), но 12х12 или 16х16 это для меня загадка (подскажите что почитать, я вам буду благодарен).
     
  4. Tanya

    Tanya Гость

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

    я не очень понимаю о чем идет речь. Если решена задача для 9х9, то для всех остальных размеров решаться должна аналогично.
    размеры должны быть или в константах или переменных.

    Если значение может изменяться, то проще всего запретить вводить в ячейки (текстбоксы) нецифоровые символы.
    Чтобы это сделать можно воспользоваться API-функциями GetWindowLong и SetWindowLong

    Код (Text):
    Option Explicit

    'объявляем API-функции
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
    (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
    (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

    'константа определяющая максимальный размер
    Private Const INT_SIZE As Integer = 12

    Private Sub Form_Load()
    'изменяем стиль двух текстбоксов, после этого в них можно будет вводить только цифровые символы 0..9
    With Me
    SetNumericEdit Me.txt1.hWnd

    SetNumericEdit Me.txt2.hWnd

    End With
    End Sub


    Private Sub SetNumericEdit(ByVal hWnd As Long)
    'hWnd - хендл изменяемого текстбокса

    Const GWL_STYLE As Long = (-16) ' константа, указывающая, что нас интересует стиль окна )))
    Const ES_NUMBER As Long = &H2000 'стиль, который мы будем устанавливать - ввод только цифр

    Dim lngStyle As Long

    lngStyle = GetWindowLong(hWnd, GWL_STYLE) 'получаем текущий стиль текстбокса

    SetWindowLong hWnd, GWL_STYLE, (lngStyle Or ES_NUMBER)  ' и добавляем к нему ES_NUMBER
    'все дальше нам нужно заботиться тольк о том, чтобы значения лежали в нужном диапазоне!!!!

    End Sub

    Private Sub txt1_LostFocus()
    Dim intVal As Integer

    'здесь 0 разрешено вводить (или пустое значение, что тоже значит 0)

    If Len(Me.txt1.Text) > 0 Then
    intVal = CInt(Me.txt1.Text)
    End If

    If intVal > INT_SIZE Then
    MsgErr Me.txt1
    End If
    End Sub

    Private Sub txt2_LostFocus()
    Dim intVal As Integer

    ' а здесь 0 вводить нельзя, но можно оставлять пустое поле
    If Len(Me.txt2.Text) > 0 Then
    intVal = CInt(Me.txt2.Text)

    If (intVal > INT_SIZE) Or (intVal = 0) Then
    MsgErr Me.txt2
    End If

    Else
    'обработка ввода пустого значения
    End If
    End Sub

    Private Sub MsgErr(ByVal txt As TextBox)
    'возвращаем в текстбокс, если значение некорректное и выдаем сообщение
    With txt
    .SelStart = 0
    .SelLength = Len(.Text)

    MsgBox "Error!!!", vbCritical

    .SetFocus
    End With
    End Sub
     
  5. kaskad755

    kaskad755 Active Member

    Регистрация:
    13 фев 2009
    Сообщения:
    34
    Симпатии:
    0

    Большое спасибо: 0(ноль)в данный момент запрещен, чтобы было понятно, это игра-головоломка судоку(есть вариант игры 12х12, по решению он отличается от 9х9 (9х9 проще всего один символ в каждом поле от 1 до 9)

    Private Sub Text82_KeyPress(KeyAscii As Integer)
    Select Case KeyAscii
    Case 49 To 57
    Case 8
    Case Else
    KeyAscii = 0
    End Select
    End Sub
    и проблема решена...
    здесь мы имеем 2(два) символа, причем нельзя превышать лимит (от 1 до 12), есть ещё вариант судоку (16х16)но это отдельная тема, с вашей помощью разобравшись с этой, разберусь с той думаю уже сам...
     
  6. kaskad755

    kaskad755 Active Member

    Регистрация:
    13 фев 2009
    Сообщения:
    34
    Симпатии:
    0
    Спасибо всем кто мне ответил, решение пришло само........


    Private Sub Text1_GotFocus()
    Me.Text1.Tag = Me.Text1.Text
    End Sub
    Private Sub Text1_LostFocus()
    Dim s As String
    With Me.Text1
    s = .Text
    If Not (s Like "[1-9]" Or s Like "1[0-2]") Then
    .SelStart = 0
    .SelLength = Len(s)
    Text1.Text = ""
    End If
    End With
    End Sub
     
  7. Tanya

    Tanya Гость

    Особенно приятно в таких случаях читать, что решение пришло само ... )))
    Только, почему-то само решение не подсказало тебе, что в выражении

    If Not (s Like "[1-9]" Or s Like "1[0-2]") Then
    .SelStart = 0
    .SelLength = Len(s)
    Text1.Text = ""
    End If

    строки
    .SelStart = 0
    .SelLength = Len(s)

    не имееют никакого смысла, т.к. затем все равно текстбокс очищается
    Text1.Text = ""

    но это право решения: какое хочет, такое и приходит ;) :)
     
  8. kaskad755

    kaskad755 Active Member

    Регистрация:
    13 фев 2009
    Сообщения:
    34
    Симпатии:
    0

    (SetNumericEdit Me.txt1.hWnd)
    строка понятна, не понял что это hWnd (объясните пожалуйста)




    Tanya Вам нравятся головоломки (например судоку)?




    Tanya он не очищается (есть такие боксы, где вообще ничего нет, в Вашем случае сразу генерируется ошибка, а если их "чистых" штук 10, то и ошибка генерируется 10 раз подряд-СПАСИБО, что уделили мне время)



    Конечно ВЫ мне очень помогли ОГРОМНОЕ ВАМ СПАСИБО!!!!(я не объяснил конечный результат, по этому ВЫ не знали что надо.....).
    Простите за назойливость, ВЫ не могли бы мне помочь понять (массивы) начал их изучать и понял, что я "ДУБ как дерево". Или подскажите что почитать............
     
Загрузка...

Поделиться этой страницей