Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Глючит II Добавлено: 22.07.05 23:01  

Автор вопроса:  dimailer
Помогите!!!
---
Вот код:
  Dim t2c As String
        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
Так же и с IsNumerik'ом можно одной строкой записать.

Кстати, для любителей писать "одной строкой" (я, честно говоря, сам такой же) могу дать совет: при такой проверке используйте вместо And и Or операторы AndAlso и OrElso - если часть условия заведомо ложна, то другая часть не анализируется.

Например.

Допустим, есть строковая переменная и условие должно сработать только в том случае, если строка длинее 50 символов.

Кажется, самое умное, что можно написать:

If Text.Length > 50 Then Trace.Warn(Text)


Кто найдет тут "брешь"? (сори, что так говорю, просто Защещенного кода сегодня начитался :) )

Правильно, если Text = Nothing, то получим исключение.

В этом случае можно написать так:
Так написать нельзя:

If Text IsNot Nothing And Text.Length > 50 Then Trace.Warn(Text)


Можно написать так:
If Text IsNot Nothing Then
    If Text.Length > 50 Then Trace.Warn(Text)
End If


Или так:

If Text IsNot Nothing AndAlso Text.Length > 50 Then Trace.Warn(Text)


Проверка условий выполняется по порядку.
Если Text - это Nothing, т.е. первое условие дает False, то очевидно, что при любом значении второго условия результат будет ложным, и второе условие не выполняется. Благодаря этому мы не получим исключения.

Также их можно применять, чтоб, например, разгрузить БД:

args.IsValid = args.Value = Batch.Code OrElse Not model.Batches.CodeExist(args.Value)

Очевидно, что если первое условие дает True, то в любом случае результат будет True, т.е. лишний вызов SQL-запроса не будет выполнен.

То же самое касается и твоего случая:

If IsNumeric (Text) AndAlso (CInt(t2c) < 0 OrElse CInt(t2c) > 255) Then


========

Кстати, по поводу этого кода:

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 IsNumeric(t2c) Then

            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

---
Кто принимал участие спасибо!!!

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам