Страница: 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???
Ответить
|
Номер ответа: 2 Автор ответа: DimDoc
Вопросов: 21 Ответов: 104
|
Профиль | | #2
|
Добавлено: 07.01.10 16:16
|
да, переменная так и объявлена...
дело было так...
вначале я написал, как Вы предлагаете:
потом включил опцию Option strict On
и появилась ошибка компиляции с предложением поменять
на
я так и сделал...
можно, конечно переписать так:
-
- Dim newValue As String
- newValue = ""
но, мне всётаки не ясно - почему на моём компе этот код работает правильно, а на windows XP НЕПРАВИЛЬНО.
на сколько я понимаю, за это должна отвечать net framework, а она одинаковая на всех машинах...
Ответить
|
Номер ответа: 4 Автор ответа: DimDoc
Вопросов: 21 Ответов: 104
|
Профиль | | #4
|
Добавлено: 09.01.10 00:10
|
Уважаемый BG(Алексей)!
На первый взгляд - оригинально и интересно. Но...
При клике по кнопке Cancel - должна (и, так и есть) возвращаться пустая строка.
Поэтому, думаю, в Вашем коде произойдёт ошибка.
Подробнее:
-
- defaultValue = 100
- newValue = ""
- newValue.Equals(defaultValue)
вернёт false, а это приведёт к выполнению блока Else, что здесь не нужно...
поэтому, должен сработать стандартный вариант кода:
-
- Dim newValue As String
- defaultValue = (исходное_значение).ToString
- newValue = InputBox(sms, title, defaultValue)
- If newValue = "" Then
- MessageBox.Show("значение параметра осталось прежним: " & defaultValue)
- Else
- End if
завтра проверю на рабочем компе.
и всётаки...
мне всётаки не ясно - почему на моём компе этот код работает правильно, а на windows XP НЕПРАВИЛЬНО.
Вопрос далеко не праздный...
Если никто не может быть уверен в результате работы программы на конечном компьютере пользователя, то к каждой программе надо прилагать программиста, который после инсталляции программы проверит - всё ли работает так, как в среде разработки.
В противном случае: грош - цена всей работе!
Что делать, если в следующий раз, например Messagebox.Show покажет язык вместо ожидаемого сообщения?
кстати...
MsgBox ("", который был в VB6 - заменен на MessageBox.Show (""
Может и InputBox - тоже заменен?
Ответить
|
Номер ответа: 5 Автор ответа: DimDoc
Вопросов: 21 Ответов: 104
|
Профиль | | #5
|
Добавлено: 09.01.10 00:13
|
Ну вот... рожици приклеились... Надо меньше пить...
С новым годом!
Ответить
|
Номер ответа: 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 ""
имхо, вообще тут работать не должен, поскольку он проверяет не значение переменных а ссылки на них.
Ответить
|
Номер ответа: 11 Автор ответа: DimDoc
Вопросов: 21 Ответов: 104
|
Профиль | | #11
|
Добавлено: 10.01.10 19:30
|
Спасибо Всем!
можно подвести некоторые итоги.
InputBox достался в наследство от VB6, и лучше его не использовать.
примеры в MSDN - оставляют желать лучшего.
........
после исправления кода проблема на WXP исчезла.
........
Самое забавное, что констукция newValue Is "", по все видимости, была взята ТС из примера в MSDN!
EROS почти угадал.
Из MSDN взято:
а конструкция появилась после включения Option Strict в VS.
что, впрочем сути не меняет (в смысле качества кода в примерах MSDN)
Автору следует создать собственную форму ввода данных - имхо, это лучший вариант.
видимо для этого вполне подойдет форма Dialog, которая имеет обрабатываемые кнопки Ok и Cancel.
пример
-
- Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
- Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
- Me.Close()
- End Sub
Ответить
|
Страница: 1 |
Поиск по форуму