В моём Visual Studio творится что-то неладное - он выполняет, то, что сам считает нужным!

компьютеры программирование Visual studio В рот мне ноги!

Пишу вот такой нехитрый код:

Module main
Dim WithEvents t As Timer
Dim a As Integer

Sub main()
t = New Timer
t.Interval = 40
t.Enabled = True

Do
Application.DoEvents()
Loop

End Sub

Sub Tick() Handles t.Tick
MsgBox(a)
a = 4
End Sub

End Module

И вот магия! Значение переменной a всегда равно 0! А если поменять местами msgbox и присвоение значения, то всё получается! (значение 4)
Это у Visual Studio глюки или у меня? плиз хелпъ!

Примечание:
Видимо SKYDOS не знаком - там переменные структурного типа автоматом на дефолт инициалятся. Но я не о том - после выполнения функции msgbox программа перескакивает присвоение, а если сначала присвоить, то всё нормально

Примечание:
пардон, не знаком с VS*

Примечание:
Для умных перефразирую: почему выполнение выскакивает ваще из саба после выполнения msgbox?

Примечание:
а - не локальная переменная, она модульного уровня!

Примечание:
Без переменной: прога не хочет выполнять второй msgbox! И вообще ничего не хочет делать после msgbox. В хелпах ничо про ето нет!

Module main
Dim WithEvents t As Timer

Sub main()
t = New Timer
t.Interval = 100
t.Enabled = True

Do
Application.DoEvents()
Loop

End Sub

Sub Tick() Handles t.Tick
MsgBox("Раз")
MsgBox("Два")
End Sub

End Module

Окошко с сообщением два ваще не вылазит

Примечание:
Wisehorn, умница!
Ответы:
не знаю, у меня Visual Studio 2005 работает нормально, а версию 2008 я даже рассматривать не хочу: пусть с ней бета-тестеры энтузиасты трахаются !!!
а — локальная переменная, поэтому при выходе из процедуры ее значение естественным образом теряется.
чтобы значение не "исчезало" нужно объявить а, как глобальную переменную
если нужно, чтобы она была глобальной только для данного модуля, то просто перетащи объявление в самый верх (где таймер)
а если нужно, чтобы ей могли пользоватьс и другие модули, то объяви её, как public
4 не помещается в а до тех пор, пока не будет осуществлен выход из процедуры MsgBox(a) (нажатие кнопки ок)
Соотв. таймер каждый раз вызывает эту функцию (событие Tick()), но если не нажать ок в мессейджбоксе, то а всегда будет равна 0.


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.