Просмотр значений в окне непосредственных вычислений
Во время работы над программами неизбежно приходится тратить время на поиск ошибок, которые на программистском жаргоне именуются багами. В процес-" се отладки (то есть исправления ошибок кода) приходится довольно часто проверять значения различных переменных. Вывести значение интересующих вас переменных можно несколькими способами: разместить в стратегически важных точках программы операторы MsgBox, положиться на метод проб и ошибок (надо признать, далеко не лучший способ убить время) или вывести их в окне непосредственных вычислений.
Неудобный, но теоретически возможный способ — выводить в программе окно сообщения после изменения переменной. В окне должно содержаться интересующее вас значение.
Хотя этот способ работает, пользоваться им не рекомендуется, потому что вам приходится постоянно добавлять в программу операторы MsgBox, заново запускать приложение, прерывать его, отлаживать код и удалять ненужные MsgBox. Все это крайне неудобно и к тому же требует немало времени.
Следующий способ — метод проб и ошибок. Вы экспериментируете с переменными и их значениями до тех пор, пока программа не заработает. Возможно, при этом вы поймете, где именно кроется ошибка, и исправите ее, однако данные приложения нередко изменяются задолго до того, как пользователь их увидит, поэтому такой способ оказывается самым сложным.
Вывод информации в окне непосредственных вычислений осуществляется с помощью объекта Debug. Вы просто вызываете для этого объекта метод Print, как это сделано в следующем примере:
X = X + 1
Debug.Print x
При этом в окне непосредственных вычислений выводится текущее значение переменной x. Работать с объектом Debug несложно, однако он обладает большими возможностями.
Просмотр ошибок в окне непосредственных вычислений
Чтобы лучше понять, как пользоваться этой возможностью, мы специально создадим небольшую программу с ошибкой, а затем найдем ее с помощью окна непосредственных вычислений:
1. Создайте новый проект с формой (File > New Project). Выберите в диалоговом окне значок Standard EXE и нажмите кнопку ОК.
2. Дважды щелкните на форме Form1, чтобы открыть окно программы.
3. Введите следующий фрагмент в процедуре события Click формы Form1:
Private Sub Form_Click() Dim x As Integer
Задать обработчик ошибок
On Error GoTo looperr
' Цикл до x = 100000
Do While x < 100000
x = x + 1
Loop
'Обойти обработчик ошибок
Exit Sub
looperr:
Debug.Print "Ошибка!"
Debug.Print "x = " & Trim$(Str$(x))
End Sub
При запуске этой программы возникает ошибка. Удастся ли вам найти ее причину?
4. Запустите программу, щелкните на форме и посмотрите, что произойдет. Результат показан на рис. 9.1:
Рис. 9.1. Окно непосредственных вычислений с информацией об ошибке
Если вы не читали урок 7 или не помните, чем различаются типы переменных, скорее всего, причина ошибки покажется вам довольно загадочной. Все дело в том, что мы попытались присвоить целой переменной значение, выходящее за пределы допустимого интервала. В целых переменных могут храниться числа от -32 768 до 32 767. Поскольку мы пытаемся увеличить значение x до 100 000, ошибка возникает в тот момент, когда оно достигает 32 768. В подобных ситуациях следует объявлять переменную x с типом Long.
Исправление ошибки
После того как ошибка будет найдена, ее необходимо исправить. В нашем примере это делается так:
1. Завершите работу программы, если вы не сделали этого ранее.
2. В окне программы замените оператор
Dim x As Integer
в процедуре события Click на следующий:
Dim x As Long
3. Снова запустите программу (Run > Start).
На этот раз программа работает нормально, потому что длинное целое может хранить гораздо большие числа, чем простое целое. Обратите внимание на правильность синтаксиса. Visual Basic опознает все команды во время редактирования и не позволяет запускать программы с синтаксическими ошибками. Такие ошибки исправляются проще всего. К сожалению, многие ошибки вызваны неправильным выбором типа или неверными вычислениями. Значения подозрительных переменных можно проследить в окне непосредственных вычислений.
ПРИМЕЧАНИЕОб отладочных средствах и процессе отладки рассказано в уроке 12, «Отладка приложений».
Вы должны уметь отлаживать свои программы, а метод Print — удобное средство для проверки переменных во время выполнения приложения. Он применяется не только при отладке, но и в других случаях, например при создании простейших отчетов. Перед тем как переходить к выводу данных, мы рассмотрим еще одну возможность — печать текущей формы методом PrintForm.
Метод PrintForm
Метод PrintForm выводит текущую форму (если не была явно задана другая форма) на принтер, установленный по умолчанию. При этом печатается копия текущей формы с точностью до пикселя. Данный метод хорошо подходит для создания простейших экранных копий.
Если добавить оператор Me. PrintForm в процедуру Form_Click предыдущего примера, изображение формы будет напечатано на принтере перед тем, как в окне непосредственных вычислений появится сообщение об ошибке. Чтобы напечатать другую форму вместо текущей, воспользуйтесь оператором следующего вида:
frmReport.PrintForm
В данном примере Visual Basic напечатает содержимое формы frmReport. Вместо нее можно указать frmSplash, frmMain, frmAbout или любую другую форму вашего проекта.
Коллекция Printers
Среди множества других полезных коллекций в Visual Basic существует коллекция Printers. B ней содержится список объектов-принтеров, зарегистрированных в вашей системе. Обратившись к коллекции с соответствующим запросом, можно сменить принтер, выбранный для приложения по умолчанию, вывести что-нибудь на печать и снова вернуться к стандартному принтеру.
Из следующего примера видно, как работать с коллекцией и узнать, какие принтеры установлены в вашей системе:
1. Создайте новый проект сочетанием клавиш Ctrl+N.
2. Выберите значок стандартного ЕХЕ-файла (Standard EXE) в диалоговом окне New Project.
3. Укажите имя проекта — PrintersCollection.
4. Задайте свойству Name формы Form1 значение frmMain, a свойству Caption -значение Список принтеров.
5. Щелкните правой кнопкой мыши на панели элементов и выберите в контекстном меню команду Components.
6. В диалоговом окне Components установите флажок рядом со строкой Microsoft Windows Common Controls 6.0. Закройте диалоговое окно кнопкой ОК.
7. Создайте на frmMain табличный список. Задайте его свойству Name значение lvwPrinters.
8. Дважды щелкните на форме frmMain, чтобы открыть окно программы.
9. Вставьте в процедуру события Resize следующий фрагмент:
Private Sub Form_Resize()
'Растянуть табличный список
lvwPrinters.Move 0, 0, ScaleWidth, ScaleHeight
End Sub
10. Вставьте в процедуру события Load следующий фрагмент:
Private Sub Form_Load()
Dim p As Printer
Dim x As ListItem
'Переключить табличный список в режим таблицы
With lvwPrinters
.View = lvwReport
.ColumnHeaders.Add , , "Принтер"
.ColumnHeaders.Add 2, , "Драйвер"
.ColumnHeaders.Add 3, , "Порт"
End With
' Вывести список принтеров в системе
For Each p In Printers
With p
Set x = lvwPrinters.ListItems.Add(, , .DeviceName)
x.SubItems(1) = .DriverName
x.SubItems(2) = .Port
End With
Next
End Sub
11. Сохраните и запустите проект.
Если в вашей системе установлены какие-либо принтеры, в окне появляется список (рис. 9.2).
Рис. 9.2. Вывод содержимого коллекции Printers