Страница: 1 |
Страница: 1 |
Вопрос: Глючит II
Добавлено: 22.07.05 23:01
Автор вопроса: dimailer
Помогите!!!
---
Вот код:
t2c = TextBox4.Text
If IsNumeric(t2c) Then
If 0 > CInt(t2c) > 255 Then
Button2.Enabled = False
Else
Button2.Enabled = True
End If
Else
Button2.Enabled = False
End If
---
Глюк в том, что в коде сказано если текст будет больше 255 или меньше 0, то кнопка "прозрачна", а у меня, что 288, что -56, кнопка становиться "нажимаемой"!!!
---
Помогите плиз!!!
---
Спасибо
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #1
Добавлено: 22.07.05 23:34
Ещё бы не глючил:
If 0 > CInt(t2c) > 255 Then
Так условия не пишут.
If CInt(t2c) < 0 Or CInt(t2c) > 255 Then
Номер ответа: 2
Автор ответа:
mynog
Вопросов: 3
Ответов: 42
Профиль | | #2
Добавлено: 23.07.05 19:03
Все верно, только можно еще проще
Button2.Enabled = (CInt(t2c) < 0 Or CInt(t2c) > 255)
Парень уже замучился
Номер ответа: 3
Автор ответа:
mynog
Вопросов: 3
Ответов: 42
Профиль | | #3
Добавлено: 23.07.05 19:04
Так же и с IsNumerik'ом можно одной строкой записать.
Номер ответа: 4
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #4
Добавлено: 23.07.05 21:43
Кстати, для любителей писать "одной строкой" (я, честно говоря, сам такой же) могу дать совет: при такой проверке используйте вместо And и Or операторы AndAlso и OrElso - если часть условия заведомо ложна, то другая часть не анализируется.
Например.
Допустим, есть строковая переменная и условие должно сработать только в том случае, если строка длинее 50 символов.
Кажется, самое умное, что можно написать:
Кто найдет тут "брешь"? (сори, что так говорю, просто Защещенного кода сегодня начитался )
Правильно, если Text = Nothing, то получим исключение.
В этом случае можно написать так:
Так написать нельзя:
Можно написать так:
If Text.Length > 50 Then Trace.Warn(Text)
End If
Или так:
Проверка условий выполняется по порядку.
Если Text - это Nothing, т.е. первое условие дает False, то очевидно, что при любом значении второго условия результат будет ложным, и второе условие не выполняется. Благодаря этому мы не получим исключения.
Также их можно применять, чтоб, например, разгрузить БД:
Очевидно, что если первое условие дает True, то в любом случае результат будет True, т.е. лишний вызов SQL-запроса не будет выполнен.
То же самое касается и твоего случая:
========
Кстати, по поводу этого кода:
0 > CInt(t2c) > 255
Можно предположить, что выполняется проверка таким образом:
0 > CInt(t2c)
вернет True или False.
После этого выполняется сравнение этого результата с 255.
Сначала выполняется конвертирование (заметь, неявное) логического типа в целочисленный. Получаем:
Для True - (-1)
Для False - 0
И при выполнении второго сравнение вполне очевидно, что получаем True, тк и 0, и (-1) меньше 255.
То есть, в твоем условие при любом результате ты получаешь True.
ОЧЕНЬ советую включить в настройках VS .NET и в настрйоках проекта флажок Option Strict ON.
Он запрещает выполнение всех неявных преобразований, благодаря чему приложение с такой, так сказать, логической ошибкой даже не скомпилировалось бы.
Номер ответа: 5
Автор ответа:
dimailer
Вопросов: 9
Ответов: 27
Профиль | | #5
Добавлено: 25.07.05 22:13
Ребята я с сибботы не заходил в интернет!!!
И меня осинила идея в сибботу!!! Теперь у меня прога гоова!!!
---
Код я сделал так:
If 0 > CInt(t2c) Then
Button2.Enabled = False
TextBox4.Text = "ошибка #i.a.nc"
ElseIf 255 < CInt(t2c) Then
Button2.Enabled = False
TextBox4.Text = "ошибка #i.a.nc"
Else
Button2.Enabled = True
End If
Else
Button2.Enabled = False
If TextBox4.Text = "" Then
TextBox4.Text = ""
ElseIf TextBox4.Text = "ошибка #i.a.nc" Then
TextBox4.Text = "ошибка #i.a.nc"
Else
TextBox4.Text = "ошибка #i.a.nt"
End If
End If
---
Кто принимал участие спасибо!!!