• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы kaskad755
  • Дата начала
K

kaskad755

Начал год назад изучать 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
 
T

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 - это не цифры) ))))
 
K

kaskad755

нужно чуть подправить условие
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 - это не цифры) ))))
Если я Вас правильно понял, это не цыфры это символы......... или нет

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

Tanya

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

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

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

Код:
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
 
K

kaskad755

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

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

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

Код:
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


Большое спасибо: 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)но это отдельная тема, с вашей помощью разобравшись с этой, разберусь с той думаю уже сам...
 
K

kaskad755

Спасибо всем кто мне ответил, решение пришло само........


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
 
T

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 = ""

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

kaskad755

Большое спасибо: 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)но это отдельная тема, с вашей помощью разобравшись с этой, разберусь с той думаю уже сам...


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

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

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

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

Код:
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




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 = ""

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




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

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

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 = ""

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



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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!