Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 060

Раздел: Basic
/ вопрос открыт /

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

1.Условие для TextBox2 ввод в ручную только числовых значений от 0 до 40 и от 0 -40 Основной цвет значений красный, если заносится значение с отрицательным знаком то цвет становится синим.
2.Условие для TextBox3 ввод только числовых значений не более пятизначных.
3.Условие для TextBox4 ввод только числовых значений, но числовое значение не должно быть равно или превышать значение TextBox3.

resseg Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: resseg (статус: Посетитель)
Вопрос отправлен: 2 августа 2009, 15:35
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Егор

Здравствуйте, resseg!
хм... в с++ и дельфи удобнее - там есть функции преобразования... ладно, будем работать с тем, что есть.

первое - работаем не с TextBox непосредственно, а с его свойством text - TextBox1.Text

второе - придётся разбирать строку самому :( - сначала удалим пробелы в начале и конце введённого текста функцией trim(), затем проверим первый символ (цифра или знак минус), а затем в цикле проверим остальные символы (цифра ли это)

третье - преобразуем строку в число функцией Val()

четвёртое - проверим полученное число на принадлежность диапазону -40...40

ну и, думаю, можно проверять введённое значение не в процессе ввода (хотя и так можно), а уже после ввода - при нажатии на какую-либо кнопку. ну, тут уже вам решать :)

с остальными TextBox'ами, думаю, разберётесь? :)

кстати, для третьего TextBox'а дополнительно можно установить максимальную длину - это свойство MaxLength

код в приложении

Приложение:
  1. Private Sub CommandButton1_Click()
  2.  
  3. s = Trim(TextBox2.Text)
  4.  
  5.  
  6. If Mid(s, 1, 1) = "-" Then s = Right(s, Len(s) - 1)
  7.  
  8.  
  9. correct = True
  10.  
  11.  
  12. For i = 1 To Len(s)
  13. If Mid(s, i, 1) < 0 Or Mid(s, i, 1) > 9 Then correct = False
  14. Next i
  15.  
  16.  
  17. If correct = False Then
  18.  
  19. Exit Sub
  20. End If
  21.  
  22.  
  23. X = Val(TextBox2.Text)
  24.  
  25.  
  26. If X < -40 Or X > 40 Then
  27. TextBox2 = ""
  28.  
  29. Exit Sub
  30. End If
  31.  
  32.  
  33. If X > 0 Then TextBox2.ForeColor = &HFF&
  34. If X < 0 Then TextBox2.ForeColor = &HFF0000
  35.  
  36. End Sub


Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 5 августа 2009, 21:57
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 27; последнее сообщение — 7 августа 2009, 18:52; участников в обсуждении: 2.

Страницы: [« Предыдущая] [1] [2]

resseg

resseg (статус: Посетитель), 7 августа 2009, 18:11 [#21]:

Егор а если пользователь не кликнет по второму TextBox. Одним TextBox нельзя обойтись?
Егор

Егор (статус: 10-ый класс), 7 августа 2009, 18:15 [#22]:

ну, пользователь же должен после ввода числа выйти из TextBox'a? кнопку ОК нажать, например? тогда тоже число изменится автоматом.
или я чего-то недопонимаю?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 7 августа 2009, 18:22 [#23]:

можно, конечно :)
но получается некрасиво:


Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'фильтр на ввод цифр и знака "минус":
If (KeyAscii < 48 Or KeyAscii > 57) And KeyAscii <> 45 Then
KeyAscii = 0
End If
End Sub

Private Sub TextBox2_Change()
'ввод разрешим не более 15 цифр:
TextBox2.MaxLength = 15
'пустую строчку просто игнорируем
If TextBox2.Text = "" Then Exit Sub
'установим нужный цвет сразу же - проверим первый символ - он "минус" или нет:
If Left(TextBox2.Text, 1) = "-" Then
TextBox2.ForeColor = &HFF&
Else
TextBox2.ForeColor = &HFF0000
End If
'так как в данном случае возникают не очень хорошие последствия, если работать непосредственно
'с TextBox2.Text, то заведём отдельную строчку и все операции проделаем с ней, а потом уже её
'перепишем в TextBox2.Text
s = ""
'проверим все символы по порядку на принадлежность их цифрам и вставим в строку цифры и минус (если он первый):
For i = 1 To Len(TextBox2.Text)
If s = "" And Mid(TextBox2.Text, i, 1) = "-" Then s = "-"
If Mid(TextBox2.Text, i, 1) >= "0" And Mid(TextBox2.Text, i, 1) <= "9" Then
s = s + Mid(TextBox2.Text, i, 1)
End If
Next i
'получившуюся строку записываем в TextBox2.Text
If TextBox2.Text <> s Then TextBox2.Text = s
x = Val(TextBox2.Text)
If x < -40 Then TextBox2.Text = "-40"
If x > 40 Then TextBox2.Text = "40"
TextBox2.Text = Str(Val(TextBox2.Text))
End Sub


Минус можно ставить только, если уже есть число (и это не ноль) - перед этим числом. Если при вводе допускаете ошибку (например, вместо 34 ввели случайно 344), то автоматически текст заменяется на 40 и т.д. Ввод превращается в пытку.
Некрасиво.
Потому я и ратую за тот вариант, чтобы дать пользователю некоторую свободу при вводе. А потом, при выходе из поля ввода заменить число на корректное. Обычно так и делается.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
resseg

resseg (статус: Посетитель), 7 августа 2009, 18:24 [#24]:

Нажимает кнопку и необходимая температура 12 (но по ошибке он ввел 123) превращается в 40 и вычисления дают не правильные параметры, потому что изначально (не буду углубляться) по условию необходимо было вводить 12.
resseg

resseg (статус: Посетитель), 7 августа 2009, 18:31 [#25]:

Лучше вместо 40 очистить, тогда по условию ввести данные кнопкой не возможно, пользователь видит очищенную ячейку и вводит поновому.
Егор

Егор (статус: 10-ый класс), 7 августа 2009, 18:33 [#26]:

ага, вот оно как...
ну тогда так:



Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'фильтр на ввод цифр и знака "минус":
If (KeyAscii < 48 Or KeyAscii > 57) And KeyAscii <> 45 Then
KeyAscii = 0
End If
End Sub

Private Sub TextBox2_Change()
'ввод разрешим не более 15 цифр:
TextBox2.MaxLength = 15
'пустую строчку просто игнорируем
If TextBox2.Text = "" Then Exit Sub
'установим нужный цвет сразу же - проверим первый символ - он "минус" или нет:
If Left(TextBox2.Text, 1) = "-" Then
TextBox2.ForeColor = &HFF&
Else
TextBox2.ForeColor = &HFF0000
End If
'так как в данном случае возникают не очень хорошие последствия, если работать непосредственно
'с TextBox2.Text, то заведём отдельную строчку и все операции проделаем с ней, а потом уже её
'перепишем в TextBox2.Text
s = ""
'проверим все символы по порядку на принадлежность их цифрам и вставим в строку цифры и минус (если он первый):
For i = 1 To Len(TextBox2.Text)
If s = "" And Mid(TextBox2.Text, i, 1) = "-" Then s = "-"
If Mid(TextBox2.Text, i, 1) >= "0" And Mid(TextBox2.Text, i, 1) <= "9" Then
s = s + Mid(TextBox2.Text, i, 1)
End If
Next i
'получившуюся строку записываем в TextBox2.Text
If TextBox2.Text <> s Then TextBox2.Text = s
End Sub

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'преобразуем текст из TextBox2 в число:
X = Val(TextBox2.Text)
'проверим принадлежность заданному диапазону:
If X < -40 Or X > 40 Then
MsgBox "Допустимые значения температуры топлива от -40 гр.С до 40 гр.С", vbInformation, "Запрет ввода"
'Cancel = True означает, что выйти из textbox нельзя:
Cancel = True
Else
Cancel = False
End If
End Sub



в этом случае, если введено число большее 40 или меньшее -40, то будет выдано сообщение об ошибке и кнопка нажиматься не будет - вообще из textbox'a выйти нельзя будет, пока не исправит.

но вот если надо было вводить "1", а пользователь ввёл "12" - то тут я не знаю, как эту ошибку отлавливать - разве только мысли юзера читать и проверять, что он вводит :))))))

но тут VB уже не катит... :)))
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
resseg

resseg (статус: Посетитель), 7 августа 2009, 18:52 [#27]:

С клавиатуры нельзя объяснить человеку то, что хочешь, но код родился.
Что я должен и где поставить вам еще для борьбы с вашими конкурентами?

И еще один вопрос. Проект, созданный не профессионалом, по любому сырой проект.
Если такие структуры, которые проникают в проект, понимают его смысл, прогоняют проект как машину на хорошей СТО .
Подчищают, исправляют, дополняют ну итак, далее. Вы меня понимаете.
Заранее благодарен.

Страницы: [« Предыдущая] [1] [2]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 апреля 2026, 22:35
Выполнено за 0.02 сек.