Отладка программ, обработка ошибок и оптимизация приложений.

Ошибки при работе над проектом, особенно сложным и большим, неизбежны. Поэтому при создании проекта важным этапом является отладка приложения. Отладка — непременный этап работы над любым проектом. Как правило, это проверка функционирования проекта и исправление ошибок перед передачей его на тестирование. Для выполнения отладки в Visual Basic 6 существует набор специальных инструментов, который рассматривается в этой главе.
Редактор кода
Редактор кода программы Visual Basic 6 — это достаточно мощный текстовый редактор с большим количеством возможностей и являющийся основным инструментом программиста для создания и отладки приложения.
В окне редактора ( 1) представлены следующие элементы управления:

  • раскрывающийся список Object (Объект) — обеспечивает выбор объектов приложения. Этот список находится в левом верхнем углу окна редактора. При выборе объекта в этом списке синхронно изменяется содержимое списка Procedure;
  • раскрывающийся список Procedure (Процедура) — дает возможность выбора членов объекта (событий) и автоматического вывода процедуры или шаблона для выбранного члена в окне редактора. Этот список находится справа от списка Object;
  • кнопка Procedure View (Просмотр процедур) — включает режим просмотра процедур для каждого объекта по отдельности. Располагается в левом, нижнем углу окна редактора;
  • кнопка Full Module View (Полный просмотр модулей) — включает режим работы полного просмотра процедур, при котором в окне редактора показаны все процедуры, разделенные горизонтальной линией (если установлен соответствующий флаг настройки). Располагается в левом нижнем углу окна редактора;
  • горизонтальная и вертикальная полосы прокрутки — позволяют просмотреть текст, который не помещается в текущем окне редактора. Как можно понять из списка элементов управления, редактор кода работает в двух режимах: в режиме просмотра всего текста приложения (полный просмотр процедур) ( 1) и в режиме просмотра процедур по отдельности (просмотр отдельных процедур) ( 2).

Редактор кода вызывается автоматически при двойном щелчке мыши на форме проекта или командой Code (Код) меню View (Вид). Для каждого элемента проекта (формы или программного модуля) открывается отдельное окно редактора кода. Соответственно это окно появляется в списке окон меню Window (Окно). В большом проекте удобнее всего работать из Проводника проекта. В этом случае редактор кода вызывается кнопкой View Code (Просмотр кода) панели инструментов окна Проводника.
Для работы в окне редактора можно использовать контекстное меню ( 3). Оно содержит команды, приведенные в табл. 10.1.
Таблица 10.1. Команды контекстного меню редактора кода


Команда

Назначение

Cut (Вырезать)

Вырезает выделенный текст и вставляет его в буфер обмена

Copy (Копировать)

Копирует выделенный текст в буфер обмена

Paste (Вставить)

Вставляет текст из буфера обмена

List Properties/Methods (Список свойств/методов)

Показывает список свойств и методов для указанного объекта

List Constants

Показывает список констант

(Список констант)

Quick Info (Быстрая информация)

Выводит синтаксис вводимого оператора

Parameter Info (Информация о параметрах)

Выводит список параметров отдельной функции или оператора

Complete Word (Полное слово)

Вызывает список свойств и методов. При этом позиционирование курсора в списке осуществляется по начальным буквам введенного текста кода. Например, если вами введена буква "V", то курсор в списке будет установлен на свойстве Value. Выбранное свойство или метод можно вставить из этого списка в текст кода двойным щелчком мыши

Toggle (Установка)

Вызывает меню для установки точек останова, прерываний работы приложения по ошибкам, установки закладок в исходном тексте

Object Browser (Просмотр объектов)

Открывает окно Object Browser (Просмотр объектов)

Add Watch (Добавить наблюдение)

Открывает диалоговое окно Add Watch (Добавить наблюдение)

Definition (Описание)

Приводит описание указанного объекта (вызывая окно Object Browser) переменной или константы

Last Position (Последняя позиция)

Позиционирует курсор на команде в редакторе кода, которая была отредактирована (просмотрена) последней

Hide (Подавить)

Закрывает текущее окно



 
В свою очередь, Toggle (Установка) открывает меню, содержащее команды, описанные в табл. 10.2.
Таблица 10.2. Команды меню Toggle


Команда

Назначение

Breakpoint (Точка останова)

Устанавливает точку останова в текущей строке

Break on All Errors (Прерывать на всех ошибках)

Устанавливает автоматический переход в режим прерывания программы с возможностью продолжения работы с места прерывания при возникновении любой ошибки

Break in Class Module (Прервать в модуле класса)

Назначает прерывание работы программы при возникновении ошибок в модулях классов

Break on Unhandled Errors (Прервать по неуправляемым ошибкам)

Назначает прерывание работы программы по неуправляемым ошибкам

Bookmark (Закладка)

Устанавливает специальные метки (закладки) в левом вертикальном поле редактора



 
Замечание
Настройка редактора была описана в главе 1 при рассмотрении общих настроек среды проектирования. Напомним, что настройка параметров редактора осуществляется на вкладках Editor (Редактор) и Editor Format (Форматы редактора) диалогового окна Options, открываемого командой Options (Параметры) меню Tools (Сервис).
Отладка программ
Как правило, отладка — это проверка работы и исправление ошибок программистом перед передачей проекта на тестирование.
Инструментарии отладки позволяет проконтролировать избранные участки кода приложения для локализации ошибки, выполняя приложение по шагам, останавливаясь в точках останова, дает возможность проверить значения переменных, свойств объектов и другую интересующую информацию и выяснить, таким образом, источник ошибки.
В набор инструментария отладки Visual Basic 6 входят такие основные инструменты, как:

  • панель инструментов Debug (Отладка) с кнопками команд для выполнения отладки приложения;
  • окно Immediate (Непосредственное выполнение), предназначенное для непосредственного ввода команд, требующих немедленного выполнения;
  • окно Watches (Наблюдение), предназначенное для просмотра значений выражений, включенных в список просмотра;
  • окно Locals (Локальные), предназначенное для просмотра значений переменных;
  • редактор кода со встроенными возможностями просмотра переменных, констант, свойств, выражений при отладке приложения в точках останова и пошаговом выполнении приложения;
  • окно Call Stack (Стек вызовов) для просмотра вызванных, но незавершенных процедур.

Панель инструментов Debug ( 4) активизируется при выборе из меню View (Вид) команды Toolbars (Панели инструментов), а затем значения Debug (Отладка).
На панели инструментов Debug находятся кнопки, обеспечивающие работу по отладке приложения. Назначение этих кнопок описано в табл. 10.3.
Таблица 10.3. Кнопки панели инструментов Debug


Кнопка

Название

Назначение

Start/Continue
(Продолжить)

Запускает программу или продолжает ее выполнение после прерывания

Break (Остановка)

Вызывает прерывание программы в необходимом месте (без использования точек останова)

End(Завершение)

Завершает выполнение программы

Toggle Breakpoint
(Установить точку останова)

Устанавливает точку останова на текущей строке кода

Step Into (Шаг с заходом в процедуры)

Осуществляет пошаговое выполнение процедуры, включая также вызываемые ею процедуры

Step Over (Шаг без захода в процедуры)

Осуществляет пошаговое выполнение процедуры без трассировки вызываемых ею процедур

Step Out (Шаг с выходом из процедуры)

Выполняет пошаговое выполнение текущей процедуры до выхода из нее

Locals Window (Окно Locals)

Открывает диалоговое окно Locals для контроля значений переменных

Immediate Window (Окно Immediate)

Открывает окно Immediate для ввода и выполнения команд

Watch Window (Окно Watch)

Открывает диалоговое окно Watches для просмотра выражений, включенных в список наблюдения

Quick Watch
(Быстрый просмотр)

Открывает окно Quick Watch для просмотра выражения и значения, которое оно возвращает в данный момент в точке останова программы или на определенном шаге при пошаговом запуске программы

Call Stack
(Стек вызовов)

Открывает окно Call Stack, в котором представлен список выполняемых процедур



 
С остальными инструментами вы сможете познакомиться при рассмотрении процесса отладки. Откройте любое из ранее разработанных приложений, например приложение для изучения записи/чтения данных из файла. Установите точку останова в процедуре записи данных. Для этого щелкните кнопкой мыши, установив указатель в сером вертикальном поле редактора кода напротив интересующей строки, или выполните команду Toggle Break-point (Установить точку останова) меню Debug (Отладка). При этом в сером вертикальном поле рядом с выбранной командой устанавливается жирная точка ( 5), остановка выполнения программы произойдет именно в этом месте кода.
При запуске программы в точке останова выполнение программы приостанавливается и для контроля работы приложения можно использовать весь отладочный инструментарий: просматривать значения переменных и выражений при позиционировании маркера на выбранной переменной или выражении ( 6).
Для более тщательного контроля работы приложения можно использовать окна просмотра: Immediate (Немедленное выполнение), Watches (Наблюдение), Locals (Локальные), Quick Watch (Быстрый просмотр). Call Stack (Стек вызовов).
Кроме прямого ввода и выполнения команд, окно Immediate служит для выяснения значения переменных и выражении. Для этого необходимо выполнить команду ? с указанием интересующего выражения, как это показано на  7. Значение выражения выводится в следующей строке этого же окна.
При работе с окном Immediate удобно использовать объект Debug и его метод print. В режиме запуска метод Debug. Print выводит текстовое сообщение в окне Immediate. Синтаксис этого метода очень простой:
Debug.Print StringMessage где StringMessage — текст выводимого в окно Immediate сообщения.
В окне Locals можно просмотреть все переменные и их значения, используемые в данный момент приложением ( 8)
Основным окном для просмотра значений выражений является окно Watches ( 9). В этом окне можно проконтролировать любое выражение из списка введенных для проверки.
Список проверяемых выражений пополняется в диалоговом окне Add Watch ( 10), открываемом командой Add Watch (Добавить наблюдение) контекстного меню редактора кода или одноименной кнопкой на панели инструментов Debug (Отладка). Для добавления выражения в список контролируемых необходимо ввести его в текстовое поле Expression (Выражение) этого окна.
Замечание
Если в тексте кода выделить выражение, то при вызове окна Add Watch это выражение по умолчанию вставляется в поле Expression.
Область Context диалогового окна Add Watch позволяет установить область видимости переменных, наблюдаемых в выражении. Раскрывающийся список Procedure (Процедура) задает видимость внутри процедур, а список Module (Модуль) — внутри программных модулей.
Переключатель Watch Type (Тип просмотра) определяет, как Visual Basic реагирует на наблюдаемое выражение. При установке опции Watch Expression (Выражение наблюдения) значение выражения отображается в диалоговом окне Watches в режиме прерывания. Опция Break When Value Is True (Приостановить при равенстве выражения значению Истина) автоматически задает режим прерываний и обращение к контролю выражений при условии равенства выражения значению True или ненулевому значению для числовых выражений. Опция Break When Value Changes (Приостановить при из менении значения выражения) аналогична опции Break When Value Is True, но приложение входит в режим прерывания при изменении значения выражения.
В дополнение к окну Watches, для просмотра выражений можно использовать окно Quick Watch (Быстрый просмотр) для быстрого доступа к значению выражения ( 11). Для этого окна не требуется вводить список контролируемых выражений, а достаточно выделить интересующее выражение в тексте кода и вызвать окно Quick Watch одноименной кнопкой на панели инструментов Debug,
Для контроля выполняемых процедур используется окно Call Stack (Стек вызовов), в котором показаны все вызванные и активные в данный момент процедуры ( 12).
Из окна Call Stack можно перейти к коду программы ( 13), откуда был выполнен вызов выбранной в списке процедуры, с помощью кнопки Show (Показать). На  13 показано место вызова процедуры, выбранной в окне Call Stack ( 12).
Обработка ошибок
Обработка ошибок и неправильных действий пользователя — обязательная составляющая любого проекта. Для работы с ошибками в Visual Basic 6 есть специальный оператор on Error.
Существует несколько вариантов синтаксиса этого оператора. Первый вариант имеет вид:
On Error Go To StringLabel
где StringLabel — метка оператора. Она должна быть уникальной в пределах процедуры.
Метка оператора — это любое текстовое значение, начинающееся с буквы и завершающееся двоеточием. В этом варианте синтаксиса при возникновении ошибки программа будет переходить к оператору, следующему непосредственно за меткой StringLabel. Например, приведенный ниже код выполняет обработку ошибки:
On Error Go To ErrorLabel
текст кода процедуры ErrorLabel:
Call ErrorProcedure ()
End
В данном случае при возникновении ошибки будет выполняться оператор call ErrorProcedure о, вызывающий процедуру обработки ошибки.
Для игнорирования ошибки необходимо использовать следующий вариант оператора on Error:
On Error Resume Next
Для того чтобы отключить обработку ошибок в какой-либо процедуре, оператор on Error записывается в виде:
On Error Go To 0
При обработке ошибок хорошо бы выдать сообщение о том, что это за ошибка. Для этого предназначены перечисленные ниже встроенные возможности Visual Basic 6:

  • служебная переменная Err, которая содержит код ошибки;
  • служебная переменная Error, которая содержит текст системного сообщения об ошибке;
  • объект Err, который содержит одновременно код и сообщение об ошибке.

Для выполнения действии программы после обнаружения ошибки служит оператор Resume, который имеет различные варианты использования. Например:

  • Resume Next

При этом выполняется оператор, следующий за оператором с ошибкой.

  • On Resume NextLabel

где NextLabel — метка оператора, который будет выполняться после обработки ошибки.
Приведенный ниже код обрабатывает ошибки:
On Error Go To ErrorLabel
текст кода процедуры
ErrorLabel:
Call ErrorProcedure ()
Resume NextStatement
текст кода процедуры
NextStatement:
текст кода
При использовании этого варианта обработки ошибки выполнение программы не остановится, как в случае с предыдущим кодом, а будут выполняться операторы кода, расположенного после метки продолжения работы.
Оптимизация приложений
Целью любой разработки является создание максимально эффективного приложения. Однако часто некоторые параметры приложений могут быть противоречивыми (например, размер приложения и скорость его работы), и требуется подобрать оптимальное решение для их реализации в проекте. Поиск реализации эффективно работающего приложения в условиях противоречий и ограничений и есть оптимизация.
Как правило, целью оптимизации является создание приложения, выполняющего все поставленные перед ним функциональные задачи максимально быстро и при этом с использованием минимального количества ресурсов системы, в частности места на диске и памяти компьютера при загрузке приложения. Перед проведением оптимизации необходимо ясно представлять, какие параметры являются более важными: скорость или ресурсы. Оптимизация приложения, таким образом, это целая стратегия создания эффективного приложения.
Рассмотрим оптимизацию приложения, включающую в себя следующие основные разделы:

  • оптимизацию скорости выполнения приложением вычислений и других действии, измеряемых временем;
  • оптимизацию размера приложения;
  • оптимизацию размера графики приложения.

Конечно, это далеко не полный список, но главные направления оптимизации он отражает.
Перед тем как строить стратегию оптимизации, рекомендуется ответить на следующие три вопроса:

  • Что оптимизировать?
  • Где оптимизировать?
  • Когда завершить оптимизацию?

Отвечая на первый вопрос, необходимо выделить цели оптимизации. Например, приложение для расчета заработной платы должно работать максимально быстро, при этом можно пожертвовать его размером. Наоборот, создавая приложение для Internet, необходимо помнить, что проект большого размера не будет работать в сети Internet, т. к. исполняемый файл приложения размером 1 Мбайт и более практически неработоспособен в сети.
Второй вопрос определяет место оптимизации для достижения максимального эффекта за определенное время. Оптимизировать приложение можно до бесконечности. Однако, как правило, на эту процедуру отводится определенное время, которое можно использовать на решение других вопросов или на разработку других приложений. Поэтому надо стремиться добиваться максимальной оптимизации минимальными усилиями. Например, если оптимизируется скорость приложения, первым делом нужно обратить внимание на циклы и на работу приложения внутри циклов, т. е. уменьшить количество шагов цикла до необходимого. И наоборот, на процедуры, вызываемые редко, следует видимо обратить внимание в последнюю очередь или вообще не оптимизировать их.
Третий вопрос подразумевает, что оптимизацию не следует проводить до бесконечности, если существуют ограничения, не связанные с работой кода приложения. Некоторые параметры приложения могут прямо зависеть от параметров системы: скорости работы диска или сети. Поэтому следует вовремя остановиться в оптимизации параметров приложения, когда ее результат уже в малой степени зависит от приложения. Например, при работе с диском таким ограничением будет скорость выполнения операций записи/чтения данных с диска.
Оптимизация скорости работы приложения
Основной способ оптимизации скорости работы — это оптимизация кода приложения. При этом желательно прислушаться к рекомендациям разработчиков Visual Basic 6.

  • Избегайте переменных типа variant и присваивайте соответствующие их применению типы. При использовании в выражениях переменных типа Variant теряется время на их приведение к конкретному типу в соответствии с типом выражения. Причем, необходимо иметь в виду, что при множественном описании ключевые слова As Type относятся только к одной переменной, то есть Dim А, в, с As String означает, что А и В— переменные типа variant (по умолчанию) и только с — строковая. В этом случае лучше написать Dim A As string, в As String, с As string.
  • Используйте для арифметических вычислений переменные типа Long или Integer, поскольку они, в отличие от currency, single или Double, более всего соответствуют машинному коду. В табл. 10.4 приведено ранжирование по относительной скорости типов переменных при арифметических вычислениях.

Таблица 10.4. Относительная скорость вычисления для типов переменных


Тип переменной

Относительная скорость

Long

Самая высокая скорость

Integer

Ниже чем у Long

Byte

Ниже чем у Integer

Single

Ниже чем у Byte

Double

Ниже чем у Single

Currency

Самая низкая скорость



 

  • Назначайте часто используемое свойство объекта в переменные, так как назначение и чтение переменных работает быстрее (от 10 до 20 раз). Для сравнения приведены два примера с двумя вариантами текста кода, при этом второй вариант кода более быстрый, чем первый, и в том и в другом примере.

1. Первый пример.
Первый вариант кода:
For nCounter = 1 То 20
Object(nCounter).Property = ObjectDef.Property
Next nCounter
Второй вариант кода:
valProperty = ObjectDef.Property For nCounter = 1 To 20
Object(nCounter).Property = valProperty
Next nCounter
2. Второй пример.
Первый вариант кода:
For nCounter = 1 То 20
Object.Property = Object.Property & sValue
Next nCounter
Второй вариант кода:
For nCounter = 1 To 20
sValueAll = sValueAll & sValue
Next nCounter
Object.Property = sValueAll

  • Для хранения одинаковых значений в процедурах вместо переменных типа Static используйте переменные уровня модуля, поскольку они работают быстрее. При этом, правда, текст кода приложения увеличивается за счет дублирования и становится менее читабельным и понятным.
  • Для критичных по времени вычисления случаев используйте код процедур непосредственно в месте их выполнения взамен вызова этих процедур, который занимает определенное время. Правда при этом необходимо помнить, что размер кода увеличивается за счет дублирования кода процедур.
  • Вместо переменных, насколько это возможно, используйте константы, поскольку значения констант включаются при компиляции в код приложения, а переменные каждый раз должны быть найдены в памяти и считаны, что, конечно, занимает определенное время.

Замечание
Оптимизация кода приложения, конечно, связана и с оптимизацией его размера. Как видно из некоторых способов оптимизации кода, размер кода либо увеличивается, либо уменьшается при оптимизации скорости приложения.
Оптимизация размера приложения
При оптимизации размера приложения под размером будем понимать как размер исполняемого файла, так и размер загруженного в память приложения. Особенно критичным размер является для приложений, работающих в сети Internet. Поэтому такие приложения следует делать как можно меньшего размера. Если это не получается, можно разделить большое приложение на несколько небольших, которые будут выполнять законченные функции и загружаться по мере необходимости.
Частичную оптимизацию размера кода выполняет сам Visual Basic 6. При компиляции приложения в исполняемый файл пустые строки и строки комментариев пропускаются, поэтому на них можно не экономить. В том числе можно не экономить на длине имен идентификаторов, которые также оптимизируются компилятором.
Для оптимизации размера кода подойдут такие основные рекомендации:

  • уменьшайте количество загруженных форм. Для форм, которые закрываются, применяйте оператор: set Form = Nothing;
  • уменьшайте в формах, насколько это возможно, количество элементов управления. При этом лучше пользоваться массивами элементов управления;
  • для вывода тестовых значений максимально используйте объекты Label
  • вместо TextBox;
  • для хранения данных используйте файл ресурсов и загружайте данные только при необходимости;
  • избегайте переменных типа variant, требующих 16 байт для хранения. Для сравнения переменные типа integer требуют 2 байта, переменные типа Double — 8 байт;
  • избегайте "мертвого" кода — то есть процедур и переменных, которые когда-то требовались, но в настоящее время не используются. Их надо удалить или закомментировать.

Оптимизация размера графики приложения
Графика занимает существенный размер приложения, поэтому важно использовать ее оптимально. Для этого подходят такие рекомендации:

  • для вывода изображений используйте элемент управления типа image, а не Picture, поскольку последний имеет атрибуты окна и, соответственно требует больше ресурсов;
  • загружайте изображения только при необходимости, а не храните их в элементах управления;
  • если необходимость присутствия изображения не требуется, назначайте свойству Picture объектов значение Nothing: Set Object. Picture = Nothing.

Замечание
Приведенный здесь список не содержит всевозможные рекомендации и приемы оптимизации приложений. В этом вопросе помощь вам может оказать только большая практика работы с Visual Basic 6, поскольку создание оптимальных приложений сродни мастерству, оттачиваемому разработкой приложений для Visual Basic 6.

 

 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г. Яндекс.Метрика