Окно Watches. Вообразим, что окно Locals не заставило нас поумнеть. Нам все кажется, что цикл должен был прерваться уже при значении Ь=5. К тому же, мы устали жать на F8. Хорошо бы программа исполнялась в своем обычном сверхбыстром режиме [run], но в тот момент, когда Ь станет равным 5, перешла в режим прерывания и остановилась, чтобы мы успели посмотреть, что там к чему в этот момент. Итак, нам нужен совсем другой способ остановки — не на заданном операторе, а при выполнении заданного условия. Для этого мы используем окно Watches. Вызовем его так: Debug—>Add Watch. Возникнет диалоговое окно Add Watch, в которое вы вводите логическое выражение Ь=5, которое по нашим расчетам поначалу равно False, но затем в какой-то момент выполнения вроде бы станет равным True. Вот этот самый момент мы и хотим, чтобы Visual Basic поймал и остановил программу. Для этого из трех возможных положении переключателя Watch Туре выбираем среднее. Если бы мы хотели просто присматривать за выражением, то выбрали бы верхнее. Нижнее положение приказывает прерваться при любом изменении значения выражения.
Нажмите ОК. А теперь давайте еще присмотрим за выражением Ь > а. Добавим его в окно Watches аналогично.
Запустите проект на выполнение в обычном режиме. После нажатия на кнопку Command1 процедура будет выполняться до тех пор, пока Ь не станет равным 5, после чего Visual Basic перейдет в режим прерывания и остановится. Этот момент вы и видите на первом из трех рисунков этого раздела. Все описанные мной окна содержат информацию именно на этот момент.
Окно Quick Watch. Кроме этих окон вы видите на рисунке еще одно окно — Quick Watch. Оно понадобилось вот для чего. Иногда в процессе работы в режиме прерывания вам может захотеться узнать, чему равно в настоящий момент значение того или иного выражения из процедуры, например а — 2. Вы можете включить это выражение в окно Watches, но быстрее поступить так: Выделите нужное выражение в окне кода, как это сделано на рисунке, затем Debug->Quick Watch. Окно появляется.
Окно Call Stack. Когда в программе содержится много взаимодействующих процедур, вам при отладке может быть совершенно необходимо разобраться в последовательности их выполнения. В этом случае вам поможет окно Call Stack, которое и покажет вам эту последовательность. Вызывается оно так: View->Call Stack.
Окно Immediate может применяться для следующих полезных вещей, о которых я раньше не говорил. Вы можете в режиме прерывания ввести в это окно текст и наблюдать следующие результаты:
Текст ∙ Смысл
?а ∙ В окне печатается значение переменной а в данный момент
?backcolor ∙ В окне печатается численное значение цвета фона
?text1.Text ∙ В окне печатается содержимое текстового окна
a=44 ∙ Приказ изменить в данный момент по нашему желанию значение переменной а. Таким образом мы можем вмешиваться в ход выполнения программы, чего раньше не делали. Более того, в режиме прерывания вы можете в окне кода на ходу менять операторы программы, так что в начале своего выполнения программа может иметь один облик, а в конце — совсем другой.
form1.BackColor =255 ∙ Приказ изменить цвета фона. Результат вы сразу же обнаружите, посмотрев на форму.
Command1 Clic k ∙ Приказ выполнить процедуру
for i=1 to 10:?i: next ∙ Приказ выполнить оператор. В окне будут напечатаны числа от 1 до 10.
Каждому программисту известны такие слова, как счетчик, сумматор, вложенные циклы и другие подобные понятия, составляющие элементарную технику программирования. Без них не обходится ни одна реальная программа, и если мы хотим идти дальше, то нам без них не обойтись. В этой главе я не буду вводить новых операторов, а покажу, как программировать типичные задачи, в том числе и те, что используют упомянутые понятия.
Вычислительная циклическая программа
Задача: Во дворце 40 залов. Известны длина, ширина и высота каждого зала. Вычислить площадь пола и объем каждого зала.
Сначала напишем фрагмент для одного зала:
Dlina = InputBox ("Введите длину") 'Начало фрагмента
Shirina = InputBox ("Введите ширину")
Visota = InputBox ("Введите высоту")
S = Dlina * Shirina 'Площадь пола
V = S * Visota 'Объем
Debug.Print "Площадь пола="; S, "Объем зала="; V 'Конец фрагмента
Для решения задачи этот фрагмент нужно выполнить 40 раз, для чего вполне естественно вложить его в оператор For:
Private Sub Command1_Click()
For i = 1 To 40
Dlina = InputBox("Введите длину") 'Начало фрагмента