О стоимости курса |
Отладка приложений, обработка ошибок
8.5. Immediate
08-01-Работа с Immediate.docm - пример к п. 8.5.
Окно Immediate (Немедленное выполнение) представляет собой нечто вроде "филиала" редактора кода. Чтобы отобразить его, можно воспользоваться командой View o Immediate Window (Вид o Окно непосредственных изменений). С помощью Immediate можно мгновенно выполнять различные команды, вызывать процедуры и функции - как пользовательские, так и встроенные. Так же в него можно организовать вывод различных данных в ходе выполнения программы. Давайте рассмотрим основные возможности этого окна.
Для отправки в окно Immediate информации из выполняющейся программы нужно воспользоваться такой конструкцией:
Debug.Print
Метод Print объекта Debug организует вывод в Immediate. После того, как выполнение программы завершится, вы сможете проанализировать выведенные данные.
Например, добавим в VBA-проект форму, назовем ее frm_Test, на форму добавим кнопку - cmd_Test. Добавим в код обработчика нажатия кнопки такой код (листинг 8.1.):
Dim TwoDim(4, 5) Dim OneDim(30) Dim num_Transfer For i = 0 To 4 For j = 0 To 5 TwoDim(i, j) = Int(Rnd * 100) Next j Next i For i = 0 To 4 Debug.Print ("i=" + Str(i)) For j = 0 To 5 num_Transfer = num_Transfer + 1 OneDim(num_Transfer) = TwoDim(i, j) Debug.Print ("j=" + Str(j)) Debug.Print ("OneDim" + Str(num_Transfer) + _ " =" + Str(OneDim(num_Transfer))) Debug.Print ("TwoDim" + Str(i) + Str(j) + _ " =" + Str(TwoDim(i, j))) Next j Next iЛистинг 8.1. Обработчик события Click кнопки cmd_Test
Здесь мы объявили два массива - один двумерный ( TwoDim ), второй одномерный ( OneDim ). Заполнили TwoDim случайными числами, после чего организовали перенос данных из него в OneDim. В циклическую конструкцию, которая осуществляет перенос данных, мы вставили несколько вызовов Debug.Print. Они позволили нам получить полную картину работы этого блока в окне Immediate (рис. 8.4.).
Подобный же метод может быть весьма полезен, например, при проверке алгоритма сортировки и любых других сложных алгоритмов.
На рис. 8.5. вы можете видеть окно Immediate, которое содержит несколько команд. Эти команды мы вводили в режиме останова программы из листинга 8.1.
Команда Print frm_Test.Caption вывела свойство Caption формы frm_Test в окно. Как видите, Immediate предлагает справку по объектам точно так же, как и обычный редактор. Далее, обратите внимание на то, что вместо команды Print можно использовать знак ?. Если вы программировали на обычном Basic'e, этот значок должен быть вам хорошо знаком.
Командой ? 25*14-4+11^7 мы вычисляем введенное выражение.
Командой ? TwoDim(1, 1) мы выводим число, хранящееся в TwoDim(1, 1). В нашем случае это 76. После этого мы записываем команду TwoDim(1, 1)=11, тем самым присваивая элементу массива новое значение, и выводим это значение снова.
Теперь рассмотрим возможности по запуску процедур и функций. Создадим в коде формы простую процедуру с именем hello, которая выводит окно сообщения с текстом "Привет". Чтобы вызывать эту процедуру, не выполняя программу, достаточно ввести в окно Immediate такой код: frm_Test.hello. Вот, как выглядит окно после ввода команды (рис. 8.6.).
После нажатия на кнопку Enter процедура будет выполнена и окно сообщения покажется на экране. Таким способом можно проверять работу процедур, отлаживать их до включения их в основной код программы.
Как видите, Immediate - это очень простое, но мощное средство отладки. Однако, его неудобно использовать для быстрого просмотра множества свойств элементов управления, значений многих переменных и т.д. В подобных случаях нам может помочь окно Locals.
8.6. Locals
Окно Locals (Локальные переменные) позволяет просматривать и изменять свойства всех объектов приложения и значения переменных. Посмотрите, как выглядит окно Locals при открытии его в режиме останова программы, с которой мы работали в п. 8.5. (рис. 8.7.)
Как видите, здесь есть объект Me, который представляет собой форму, массивы, объявленные в коде, переменные. Для посмотра или редактирования свойств объектов и содержимого массивов, достаточно развернуть их описания, нажав на знак + перед их наименованиями. Для редактирования значения нужно просто выделить его и ввести вместо старого новое. Учтите, что строковые значения нужно вводить в кавычках - так же, как и в программном коде.
8.7. Watches
Окно Watches (Контролируемые выражения) предназначено для контроля за отдельными выражениями, значениями переменных и т.д.
Чтобы добавить такое выражение, щелкните мышью по нему и выберите команду меню Add Watch (Контролировать). Появится окно Add Watch (рис. 8.8.).
Здесь, в поле Expression (Выражение) нужно ввести контролируемое выражение. В нашем случае это имя переменной.
В группе параметров Context (Контекст) следует выбрать область контроля. Чем эта область меньше (в нашем случае - это процедура cmd_Test_Click, которая хранится в модуле формы frm_Test ) - тем лучше.
В группе параметров Watch type (Тип наблюдения) нужно выбрать тип наблюдения за выражением.
Watch Expression (Наблюдать за выражением) - программа просто выводит в окно Watch значение наблюдаемого выражения, ничего не предпринимая. Если вы перейдете в режим отладки, то сможете просмотреть это выражение.
Break When Value Is True (Прервать работу программы если выражение выполняется) - при выполнении определенного в окне Add Watch условия программа остановится и перейдет в режим отладки. Например, если мы напишем в поле Expression выражение num_Transfer > 100 и активируем данный пункт, то работа программы будет остановлена лишь тогда, когда значение переменной num_Transfer превысит 100.
Break When Value Changes (Прервать работу программы при изменении значения) - прерывает выполнение программы если значение контролируемой переменной или выражения изменилось. Если мы сделаем эту опцию активной, при каждом изменении переменной программа будет переходить в режим отладки. Установим эту опцию и запустим программу. При первом же изменении переменной num_Transfer мы попадем в режим отладки (рис. 8.9.).
Как видите, в окне Watches отображены следующие данные:
- Expression - контролируемое выражение.
- Value - значение выражения.
- Type - тип данных.
- Context - контекст (область контроля).
При необходимости вы можете отредактировать контролируемое выражение - для этого щелкните правой кнопкой мыши по строке выражения в окне Watches и выберите пункт Edit Watch. Для удаления выражения выберите в том же меню пункт Delete Watch, для добавления нового - Add Watch.