Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: InputBox шалит... или, что за фокусы? Добавлено: 07.01.10 11:28  

Автор вопроса:  DimDoc
вчера решил протестировать на работе (на компе - windows XP) готовую программу, сделанную дома (Windows 7).
прога установилась и работает как надо, за исключением одного места...
кнопка cancel окна intutbox изменяет значение параметра defaultValue не смотря на то, что никакого кода в этом блоке НЕТ!
вот мой код:

defaultValue = (исходное_значение).ToString
newValue = InputBox(sms, title, defaultValue)
        If newValue Is "" Then
MessageBox.Show("значение параметра осталось прежним: " & defaultValue)
        Else
'сохраняю требуемые изменения
        End if

да...
переменная defaultValue после клика на Cancel становится равной "" (пустой строке)!

думал - в коде напортачил... Но, что можно не так написать, если ничего не писать?

и ещё...
на работе инсталировал прогу на 2 компа.
на 1 - net framework 3.5 уже стоял
на 2 - framework'a не было и при инсталяции проги сначала установились:
windows installer 3.1
net framework 3.5
 так вот на 1-м компе ошибка проявилась с первого старта проги.
 а на втором... вообще фокусы...
 при первом старте проги - ошибки НЕ БЫЛО!
 при следующих стартах - эта ошибка проявилась...

может проблемы связаны с версией net framework???

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #1
Добавлено: 07.01.10 11:47
1. По-моему не
  1. newValue Is ""
, а
  1. newValue = ""


Is этош для объектов вроде. newValue Is String

Ответить

Номер ответа: 2
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #2 Добавлено: 07.01.10 16:16
да, переменная так и объявлена...
  1.  
  2.         Dim newValue As Object


дело было так...
вначале я написал, как Вы предлагаете:
  1.  
  2. newValue = ""


потом включил опцию Option strict On
и появилась ошибка компиляции с предложением поменять
  1. newValue = ""

на
  1. newValue Is ""

я так и сделал...

можно, конечно переписать так:
  1.  
  2. Dim newValue As String
  3. newValue = ""



но, мне всётаки не ясно - почему на моём компе этот код работает правильно, а на windows XP НЕПРАВИЛЬНО.
на сколько я понимаю, за это должна отвечать net framework, а она одинаковая на всех машинах...

Ответить

Номер ответа: 3
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #3 Добавлено: 07.01.10 16:33
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim defaultValue As String = (исходное_значение).ToString
        Dim newValue As String = InputBox(sms, title, defaultValue)
        If newValue.Equals(defaultValue) Then
            MessageBox.Show("значение параметра осталось прежним: " & defaultValue)
        Else
            'сохраняю требуемые изменения
        End If
    End Sub

Ответить

Номер ответа: 4
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #4 Добавлено: 09.01.10 00:10
Уважаемый BG(Алексей)!
На первый взгляд - оригинально и интересно. Но...
При клике по кнопке Cancel - должна (и, так и есть) возвращаться пустая строка.
Поэтому, думаю, в Вашем коде произойдёт ошибка.
Подробнее:
  1.  
  2. defaultValue = 100
  3. newValue = "" 'так как нажата кнопка Cancel
  4. 'соответственно, выражение:
  5. newValue.Equals(defaultValue)


вернёт false, а это приведёт к выполнению блока Else, что здесь не нужно...
поэтому, должен сработать стандартный вариант кода:
  1.  
  2. Dim newValue As String
  3. defaultValue = (исходное_значение).ToString
  4. newValue = InputBox(sms, title, defaultValue)
  5.         If newValue = "" Then
  6. MessageBox.Show("значение параметра осталось прежним: " & defaultValue)
  7.         Else
  8. 'сохраняю требуемые изменения
  9.         End if


завтра проверю на рабочем компе.

и всётаки...
мне всётаки не ясно - почему на моём компе этот код работает правильно, а на windows XP НЕПРАВИЛЬНО.

Вопрос далеко не праздный...
Если никто не может быть уверен в результате работы программы на конечном компьютере пользователя, то к каждой программе надо прилагать программиста, который после инсталляции программы проверит - всё ли работает так, как в среде разработки.
В противном случае: грош - цена всей работе!
Что делать, если в следующий раз, например Messagebox.Show покажет язык вместо ожидаемого сообщения?

кстати...
MsgBox ("";), который был в VB6 - заменен на MessageBox.Show ("";)
Может и InputBox - тоже заменен?

Ответить

Номер ответа: 5
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #5 Добавлено: 09.01.10 00:13
Ну вот... рожици приклеились... Надо меньше пить...
С новым годом!

Ответить

Номер ответа: 6
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #6 Добавлено: 09.01.10 05:31
С наступающим старым новым годом :-D.
Фреймворк почемуто не гарантирует 100% единообразие, значит по прежнему многое зависит от системы.

Ответить

Номер ответа: 7
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #7 Добавлено: 09.01.10 11:00
Фреймворк почемуто не гарантирует 100% единообразие, значит по прежнему многое зависит от системы.

Я бы уточнил.. от региональных настроек системы и прямоты рук программиста. В остальных случаях FW 100% гарантирует правильность исполнения кода.
В данном случае ф-я InputBox возвращает строку, а переменная для нее объявлена как Object - с какой радости? Даже если и так то, где приведение возвращаемого значения к типу Object? А я тебе скажу где.. это все косяки VB когда он сам решает что и к какому типу приводить! Программисту на сях никогда бы в голову не пришло писать такую ересь, а поскольку компилятор VB позволяет подобные выходки то вот вам и результат.. наслаждайтесь!
По теме:
Переменная для возвращаемого значения должна быть типа string, и проверку на пустоту можете выполнить через статическую ф-ю String.IsNullOrEmpty
public static bool IsNullOrEmpty(string value)
    Member of System.String

Summary:
Indicates whether the specified System.String object is null or an System.String.Empty string.

Parameters:
value: A System.String reference.

Returns:
true if the value parameter is null or an empty string ("";); otherwise, false


А вот этот шедевр
newValue Is ""


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

Ответить

Номер ответа: 8
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #8 Добавлено: 09.01.10 11:18
Самое забавное, что констукция newValue Is "", по все видимости, была взята ТС из примера в MSDN! Из чего можно сделать вывод что примеры там пишут такие же "специалисты".
С другой стороны в документации заявлено что InputBox вызывает диалоговое окно! Хотя ВСЕ диалоговые окна в NET имеют возвращаемое значение DialogBoxResult, по которому можно однозначно судить какую из кнопок нажал юзер. Но в данном случае этого нет, из чего следует что InputBox - это хрень, которую оставили для облегчения перехода с VB6 и она не соответствует стандарту NET и значит пользоваться ей противопоказано.. Автору следует создать собственную форму ввода данных - имхо, это лучший вариант.

Ответить

Номер ответа: 9
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #9 Добавлено: 09.01.10 13:42
Понятно.
Тоже самое и в вб6, нормальные диалоги возвращали нормальные результаты, а инпутбокс вечный апендицит.

Ответить

Номер ответа: 10
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #10 Добавлено: 10.01.10 05:02
Уважаемый BG(Алексей)!
На первый взгляд - оригинально и интересно. Но...
При клике по кнопке Cancel - должна (и, так и есть) возвращаться пустая строка.
Поэтому, думаю, в Вашем коде произойдёт ошибка.

Возможно, но...
Я не до конца понял задачу. Это EROS телепат. Я начинающий(телепат). :)
Но, могу сказать с увереностью, что если бы я знал задачу, то ошибки бы не было. :)

Ответить

Номер ответа: 11
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #11 Добавлено: 10.01.10 19:30
Спасибо Всем!
можно подвести некоторые итоги.
InputBox достался в наследство от VB6, и лучше его не использовать.
примеры в MSDN - оставляют желать лучшего.
........
после исправления кода проблема на WXP исчезла.
........
Самое забавное, что констукция newValue Is "", по все видимости, была взята ТС из примера в MSDN!

EROS почти угадал.
Из MSDN взято:
  1. Dim newValue As Object

а конструкция
  1. newValue Is ""
появилась после включения Option Strict в VS.
что, впрочем сути не меняет (в смысле качества кода в примерах MSDN)
Автору следует создать собственную форму ввода данных - имхо, это лучший вариант.

видимо для этого вполне подойдет форма Dialog, которая имеет обрабатываемые кнопки Ok и Cancel.
пример
  1.  
  2. Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
  3.         Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
  4.         Me.Close()
  5. End Sub


Ответить

Страница: 1 |

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



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