Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Шпоры ВМиП - файл 1.docx


Шпоры ВМиП
скачать (2804.4 kb.)

Доступные файлы (1):

1.docx2805kb.30.11.2011 08:35скачать

содержание
Загрузка...

1.docx

  1   2   3   4   5   6   7   8   9
Реклама MarketGid:
Загрузка...
1)Структурные особенности Visual Basic. Подпрограммы. Пример.

Приложение VB(проект)- это совокупность экранных форм, исходных(отдельных) модулей, модулей классов и других элементов, с помощью которых решается некоторая задача. Если проект сравнительно прост, то его программный код можно полностью поместить в модуле формы. Но при увеличении сложности проекта код удобнее составлять не одним большим куском, а частями. Эти части называются модулями. Каждый модуль будет храниться в отдельном файле, что удобно при редактировании их кода. Количество программного кода которое может содержаться в модуле ограничено 65,5 тыс строками. Каждый исходный модуль можно добавить в проект командой Project\Add Module.все описания в исходном модуле должны быть с видимостью Public(то есть глобальными). Модуль можно использовать в нескольких формах или даже нескольких проектах. Представление программного кода приложения в виде отдельных компактных модулей–это одно из проявлений модульного принципа программирования (МПП). Другим проявлением МПП является разбиение программного кода уже внутри модуля на отдельные части–подпрограммы: процедуры-события и подпрограммы общего назначения (ПОН) –общие процедуры и функции, не связанные с конкретными событиями объектов и которые разработчик создает по своему усмотрению. Один модуль формы может содержать несколько процедур –событий и подпрограмм общего назначения. ПОН могут размещаться в любых модулях, при этом они выполняют самостоятельные действия и предназначены для многократного использования. Общая структура программного кода модуля формы VB может быть представлена следующей схемой.[<Раздел контейнерных (уровня модуля) описаний>] [<Начало n-й процедуры-события> <Раздел локальных описаний> <Раздел операторов > <Конец n-й процедуры - события>] [<Начало k-й ПОН><Раздел локальных описаний> <Раздел операторов><Конец k-й ПОН>],

В модуле формы общих процедур и функций может и не быть, а в исходном модуле, наоборот, процедур-событий не должно быть. Приведенная структура не является строго обязательной. Так, разделы описаний могут вообще отсутствовать или располагаться внутри блоков операторов, а процедуры-события и ПОН могут размещаться в программном коде в любом порядке. Процедура-событие вызывается в ответ на какое то событие объекта (щелчок мыши по кнопке или изменение значения поля, перемещение мыши, нажатие символа на клавиатуре). Она после запуска программы (загрузки формы) постоянно находится в состоянии ожидания события. Общими процедуры и функции называются потому, что могут быть вызваны явно из любой подпрограммы другого контейнера, если только они небыли объявлены как Private. После выполнения такой подпрограммы происходит автоматический возврат в то место программы, откуда подпрограмма была вызвана. Процедура и функция имеет имя и возможный список формальных параметров (СФормП). Синтаксис описания процедур и функций следующий

[Private |Public][Static] Sub<имя процедуры> [(<СФормП>)]

<Раздел локальных описаний><Раздел операторов>

End Sub

[Private|Public][Static] Function<имя функции>

[(<СФормП>)] [As<Тип>]

<Раздел локальных описаний><Раздел операторов>

End Function



Private или Public–это области видимости. Если область явно не указана, то по умолчанию подпрограмма будет отнесена к классу Public. Наличие в заголовке описания подпрограммы слова Static позволит сохранить значения всех локальных переменных между последовательными вызовами этой подпрограммы. При отсутствии этого слова все значения локальных переменных обнуляются перед обращением к подпрограмме. Процедуры и функции могут иметь формальные параметры, которые могут быть входными и выходными. Входной параметр–это переменная, значение которой должно быть установлено до начала работы подпрограммы и которая участвует в работе подпрограммы. Выходной параметр–это переменная, которая получает свое значение в результате работы подпрограммы. Входные и выходные параметры в списке формальных параметров записываются через запятую с обязательным указанием типа параметра. Разделение на входные и выходные формальные параметры происходит в заголовке подпрограмм с помощью ключевых слов byVal и byRef ( поумолчанию). В списке формальных параметров можно определить необязательный параметр, если сопроводить его ключевым словом Optional. Общая процедура вызывается как отдельный оператор со списком фактических параметров СФактП, а функция может вызываться либо из выражения (при этом она возвращает результат работы в имени функции), либо как отдельный оператор, то есть как общая процедура, тогда результат возвращается через выходные параметры. Список фактических параметров–это входные параметры для подпрограммы, которые могут быть переменными, константами, динамическими массивами и выражениями. В списке фактических параметров для необязательного параметра может отсутствовать значение.

Синтаксис оператора вызова подпрограммы:

CallИмя_подпрограммы[(<СФактП>)]

Или бесскобочная форма записи оператора вызова подпрограммы: Имя_подпрограммы[<СФактП>]

По умолчанию формальные параметры в подпрограмме являются одновременно входными и выходными, если не использовать перед ними ключевого слова byVal. Тогда процесс передачи фактических параметров на место формальных параметров при вызове подпрограммы будет выполняться по ссылке (т.е. будет передаваться адрес фактической переменной). Это значит, что подпрограмма получает доступ к области памяти, где хранится оригинальное значение переменной, и может его изменить в подпрограмме. Такой формальный параметр часто называется параметром-переменной.Возможна передача фактических параметров по значению. В этом случае переменная копируется, и подпрограмма получает только копию отзначения переменной, а не адрес. Но тогда перед такими формальными параметрами в заголовке подпрограммы следует указать ключевое словаbyVal. Это защитит передаваемую переменную (фактический параметр) от изменения. Такой формальный параметр часто называется параметром-значением.

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

Dim A As Double,B As Double,C As Double, As Double

Private Sub Ромб(ByVal R As Double,ByVal A As Double,Z As Double)

If sin(A)<=0 then

MsgBox "задайте другой угол"

Else

Z=2*R/sin(A)



End if

end Sub

Private Function Parall(ByVal A As Double,ByVal B As Double,ByVal Angle As Double,Z As Double)

If sin(Angle)<=0 then

MsgBox "задайте другой угол", vbCritical, "Ошибка"

Else

Z=A*B*sin(Angle)

End if

End Function

Private Function Triangle(ByVal A As Double,ByVal B As Double,ByVal C As Double)As Double

P#=(A+C+B)/2

P=P*(P-A)*(P-B)*(P-C)

IF P<0 then

MsgBox "неврно заданы параметры",_vbCritical, "Ошибка"

Else

Triangle=Sqr(P)

End if

end Function

Private Sub Form_Load()

A=10^ B=3.1415926/4^ C=7

call Ромб(A,B,Romb#)

MsgBox "сторона ромба=" & Romb,,_"подпрограммы"

Z=triangle(A,Round(B*10),C)

MsgBox "площадь треугольника=" & Z,,_"подпрограммы"

Parall A,C,B,Z

MsgBox "ПлощадьПарал-ма=" & Z,,_"подпрограммы"

End Sub




2. Диалоговые окна MsgBox и InputBox. Примеры.

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

^ Немодальное диалоговое окно — это окно, позволяющее перемещать фокус на другое окно или форму без закрытия текущего окна. Данный тип диалоговых окон используется редко. Примером немодального диалогового окна в Visual Basic является окно Find (Поиск), дающее возможность осуществлять поиск нужной информации.

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

  • Open (Открыть) — диалоговое окно для поиска в файловой структуре нужного файла;

  • Save As (Сохранить как) — для поиска места хранения файла и ввода его имени;

  • Font (Шрифт) — для выбора и установки шрифта;

  • Color (Цвет) — для выбора цветовой палитры;

  • Print (Печать) — для настройки режима печати;

  • Help (Справка) — для работы со справочной системой приложения. Рассмотрим эти диалоговые окна более подробно.


Окно сообщения (MsgBox)

Диалоговое окно сообщения (рис. 7.19) не требует проектирования и вызы вается из программы командой MsgBox или с помощью аналогичной функции MsgBox о, имеющей следующий синтаксис:

MsgBox (prompt[, buttons] [, title] [, helpfile, context])

где:

  • prompt — текст сообщения в диалоговом окне. Максимальная длина текста 1024 символа. В этот текст можно вставить в качестве разделителей строк перевод каретки Chr(13), перевод строки Chr(lO) или их комбинацию;

  • buttons — числовое выражение, которое задает параметры для кнопок управления и значков в диалоговом окне и составлено из констант, указанных в табл. 7.8 и 7.9. Если значение не указано, то по умолчанию присваивается значение 0;

  • title — текст заголовка диалогового окна;

  • helpfile — ссылка на файл справочной системы;

  • context — ссылка на содержание в файле справочной системы.

Необходимо иметь в виду, что для задания нескольких параметров кнопок и значков одновременно, следует просто сложить соответствующие константы.

Для примера введите в командном окне среды проектирования Immediate следующую команду и нажмите клавишу <Enter>:



MsgBox "Приветствуем Вас!", vbYesNo + vbExclamation,"Окно сообщений"

В ответ получите диалоговое окно

^ Таблица 7.8. Константы параметров для значков диалогового окна сообщения

Значок

Константа

Значение

Тип сообщения
vbExclamation

48

Предупреждение
vbQuestion

32

Запрос
vbInformation

64

Информация
vbCritical

16

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

^ Таблица 7.9. Константы параметров наличия кнопок в окне сообщения и установки фокуса на кнопку

Константа

Значение

Набор кнопок в диалоговом окне

vbOkOnly

0

OK

vbOkCancel

1

OK, Отмена

vbAbortRetryIgnore

2

Стоп, Повтор, Пропустить

vbYesNoCancel

3

Да, Нет, Отмена

vbYesNo

4

Да,Нет

vbRetryCancel

5

Повтор, Отмена

vbDefaultButton1

0

Устанавливает фокус на первой кнопке

vbDefaultButton2

256

Устанавливает фокус на второй кнопке

vbDefaultButton3

512

Устанавливает фокус на третьей кнопке

vbDefaultButton4

768

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

vbApplicationModal

0

Назначает модальность приложения. Диалоговое окно будет модальным, то есть требующим обязательного закрытия для перехода в другие окна

vbSystemModal

4096

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

vbMsgBoxHelpButton

16384

Добавляет в диалоговое окно кнопку Справка

VbMsgBoxSetForeground

65536

Объявляет диалоговое окно фоновым окном

vbMsgBoxRight

524288

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



vbMsgBoxRtIReading

1 048 576

Переворачивает текст для чтения справа налево
В зависимости от выбора кнопки диалоговое окно MsgBox возвращает одно из значений, заданных системными константами. Это необходимо для анализа нажатой кнопки и выполнения соответствующих действий в программе. В исходном коде для этого можно использовать константы, указанные в табл. 7.10.

^ Таблица 7.10. Значения констант, возвращаемые кнопками окна сообщения

Кнопка

Константа

Значение при нажатии на кнопку

ОК

vb0k

1

Отмена

vbCancel

2

Стоп

vbAbort

3

Повтор

vbRetry

4

Пропустить

vblgnore

5

^ Да

vbYes

6

Нет

vbNo

7

Диалоговое окно ввода информации (InputBox)

Достаточно часто в диалоговом окне необходимо не только нажать кнопки выбора действия, но и ввести определенную информацию, которая затем анализируется программой. Для выполнения такого рода действий в Visual Basic можно использовать диалоговое окно ввода информации InputBox (рис. 7.20). Функция InputBox имеет следующий синтаксис:

InputBox (prompt [, title] [, default] [, xpos] [, ypos] [, helpfile, context])

где:

  • prompt — текст сообщения в диалоговом окне. Максимальная длина текста 1024 символа. В этот текст можно вставить в качестве разделителей строк перевод каретки Chr(13), перевод строки Chr(lO) или их комбинацию;

  • title — текст заголовка диалогового окна;

  • default — значение текстового поля ввода по умолчанию. Если параметр отсутствует, строка остается пустой;

  • xpos — позиция по горизонтали левого верхнего угла диалогового окна относительно левого верхнего угла экрана. По умолчанию присваивается значение, соответствующее середине экрана;

  • ypos — позиция по вертикали левого верхнего угла диалогового окна относительно левого верхнего угла экрана. По умолчанию присваивается значение, соответствующее середине экрана;

  • helpfile — ссылка на файл справочной системы;

  • context — ссылка на содержание в файле справочной системы.

Для примера введите в командном окне среды проектирования Immediate следующую команду:

strUserTest = InputBox ("Введите пароль", "Запуск приложения", "****")

В результате получите диалоговое окно, показанное на рис. 7.20.

В отличие от диалогового окна MsgBox, в окне InputBox всегда имеются только две кнопки управления: ОК и Cancel. Кнопка ОК подтверждает ввод данных, кнопка Cancel — закрывает диалоговое окно без ввода данных.
3. Четыре принципа объектно-ориентированного программирования. Их реализация в Visual Basic.

VB и объектно-ориентированное программирование

Как уже упоминалось в первой главе, Visual Basic, в определен­ной степени, относится к объектно-ориентированным языкам прог­раммирования. ООП – это методология разработки программ, основанная на представлении ее в виде совокупности объектов, каждый из которых является реализацией определенного класса. В ООП объект представляет собой элемент приложения, например, лист, форму, меню. Программный код и данные структурируются так, чтобы имитировалось поведение фактически существующих объектов. Принадлежность языка программирования к ООП определяется использованием в нем четырех основных принципов: абстрагирования, инкапсуляции, наследования и полиморфизма.

· Абстрагирование – это простое описание сложных объектов окружающей среды. Причем описание должно быть очень точ­ным, чтобы не возникло ошибочного представления о другом объекте. Так, не надо создавать специальных программ для отображения графической информации, а достаточно просто использовать объект Image – это абстрактный объект, содержа­щий все необходимое для отображения изображений.

· Инкапсуляция – это возможность эффективно изолировать данные, методы и свойства от остальной части программы и от случайного разрушения извне.

· Наследование – это возможность создания новых классов на базе уже имеющихся, при этом вновь созданные классы как бы наследуют методы и свойства родительского класса. Наследова­ние позволяет создавать многократно используемый код.

· Полиморфизм – позволяет многократно определять одноимен­ные методы в иерархии классов. Полиморфизм реализуется технологией Automation через механизм позднего связывания, предоставляющего возможность использовать объекты других приложений в качестве компонентов собственных приложений


4. Классы. Интерфейс классов. Создание динамических библиотек на основе классов в Visual Basic. Регистрация библиотек.

Класс используется для задания структуры объекта. Это своего рода шаблон, на основе которого будут созданы объекты. Для ими

тации поведения реальных объектов в классах должны быть пред

ставлены принципы действия (методы) и данные объектов (свойства).

Чтобы создать модуль класса, следует воспользоваться командой ^ Project\Add Class Module. В отрывшемся диалоге Add Class Module на закладке New выбрать шаблон Class Module (для создания пустого окна модуля класса и заполнения его самостоятельно пользователем) или шаблон VB Class Builder (для запуска мастера классов, рис.85). Мастер классов может быть установлен в виде команды меню VB (Add-Ins\Class Builder Utility), если предварительно загрузить утили

ту VB6 Class Builder Utility в память, используя диалог ^ Add-In… Manager, открывающийся командой Add-Ins\Add-In…Manager. Для редактирования существующих классов используется любой из двух последних способов.

Находясь в диалоге ^ Class Builder с помощью команды File\New\ Class следует задать имя класса в поле Name, а в списке Base on – имя класса родителя (принцип наследования). После чего появится возможность создавать свойства (Property), методы (Method), события (Event) и структуры целочисленных кон

стант (Enum). Кроме классов мастер может создавать семейства (Collection).

При создании свойств VB использует процедуры свойств (Property), которые во многом похожи на общие процедуры (Sub) и функции (Function). Чтобы они были видимы в пределах контейнера, их сле

дует объявить как Public.

Вы уже знаете, что значе

ния свойств можно как счи

тывать, так и устанавливать, поэтому для одного свойства требуется две процедуры с одним и тем же именем: одна для чтения, другая для записи значения в свойство. Для этого в заголовке процедур Property используются ключевые слова Let (присвоить) и Get (получить). Разделение процедур свойств на процедуры присваивания и процеду

ры считывания позволяет создавать свойства, доступные только для чтения или только для изменения (принцип инкапсуляции). Мастер классов (Class Builder) позволяет добавлять свойства к существую

щему классу с помощью команды File\New\Property (рис.86) или кнопки . В этом окне следует задать имя, тип данных и доступ

ность свойств. Если будет установлена одна из опций ^ Public Property или Friend Property, то мастер, после выполнения команды File\ Update Project, добавит в модуль класса три процедуры Property (Let, Get и Set), а также внутреннюю переменную для хранения зна

чения свойства. Например, окно класса после создания свойства с именем CurX типа ^ Variant будет содержать следующий код.
Private mvarCurX As Variant 'local copy

Public Property Let CurX(ByVal vData As Variant)

'Syntax: X.CurX = 5

mvarCurX = vData 'Обновить значение временной переменной

^ End Property

Public Property Set CurX(ByVal vData As Variant)

'Syntax: Set x.CurX = Form1

Set mvarCurX = vData

End Property

Public Property Get CurX() As Variant



'Syntax: Debug.Print X.CurX

If IsObject(mvarCurX) Then

Set CurX = mvarCurX

Else

CurX = mvarCurX 'Обновить свойство CurX

End If

^ End Property
Здесь объявлена локальная переменная mvarCurX в стиле Венгерской нотации. Процедура Property Get по синтаксису является функцией, поскольку возвращает результат в имени, при этом она имеет тот же тип данных, что и параметр, в процедуре Property Let. Существует еще и процедура Property Set, аналогичная Property Let, только она передает не значение свойства, а ссылку на объект. Здесь перед оператором присваивания явно указывается ключевое слово Set (для ссылок на объект, находящихся как на форме, так и за ее пределами).

Если для какого-либо свойства Вы определили один из следующих типов данных: ^ Object, StdFont, StdPicture, то Мастер классов создаст две процедуры свойств Set и Get. Если же тип данных у свойства будет числовой, логический или дата, то – две процедуры свойств Let и Get. И лишь когда тип данных у свойства будет Variant, Мастер классов создаст все три процедуры.

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

Методы используются для расширения функциональных возмож

ностей объекта и имеют синтаксис процедур и функций. С помощью команды File\New\Method или кнопки Мастера классов можно добавить методы. Обычно они содержат больше программного кода, чем процедуры свойств, так как в них выполняется обработка данных. Сложные по структуре методы можно разделить и объявить каждую его часть как Private, то есть для внутреннего использования в классе и, тем самым, защитить весь код. Такое разделение отвечает принципу инкапсуляции методов ООП.




5. Способы объявления объектных переменных в Visual Basic.

Объектные классы дают возможность объявить специальный тип данных, который может поддерживать все традиционные элементы, с которыми уже знакомы программисты, работавшие в других объектно-ориентированных языках, то есть со свойствами, методами и событиями. С одной стороны, объектные классы Visual Basic напоминают модули кода. Допускается объявлять переменные уровня модуля и любое число общих процедур и функций. Можно даже объявить специальный тип процедур, называемый процедурой Property, который предлагает более мощный путь создания свойств класса. Главное различие между объектными классами и модулями кода лежит в способе их использования. Модуль кода просто позволяет комбинировать полезный код, константы и глобальные переменные в повторно используемых библиотеках. Когда вы добавляете модуль кода в проект Visual Basic, можно вызвать любую из его процедур и функций из любого другого модуля в проекте. При использовании объектного класса вы должны создать экземпляр этого класса. Затем установить или считать значения свойств, принадлежащих экземпляру класса, и использовать его процедуры и функции полностью независимо от всех остальных экземпляров этого же класса. Другими словами, объектный класс представляет собой некий суперпользовательский тип данных.

Объектные классы позволяют моделировать процессы реального мира или абстрактные процессы, объединяя их особенности и поведение в самодостаточный модуль.

Контейнер(модуль класса или формы), в котором используется объект, должен содержать процедуры-события.

Существует два способа объявления имени объекта на основе класса и обращения к его методам и свойствам из приложения.

Первый способ основан на использовании ключевого слова ^ New непосредственно при объявлении объектной переменной в строке Dim.

Например,

Dim mObject As New Class1'Class1 –имяклассапоумолчанию

Private Sub Command1_Click()'Процедура-событие

mObject.свойство=значение'Обращение к свойству

mObject.метод'Обращение к методу

…………

Set mObject=Nothing'Удалить ссылку на объект и

'освободить память, выделенную под объект

^ End Sub
Вторым способом объект создается с помощью строки Dim и оператора присваивания с ключевым словом Set.

В операторе присваивания указывается ключевое слово ^ New или функция CreateObject с именем класса.

Например,

Dim mObject As Class1

Set mObject= New Class1

'или Set mObject= CreateObject(''Class1'')

………………

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



Если в программе используются события объекта, а не только методы и свойства, как в представленном выше фрагменте кода, то объект следует создавать с использованием ключевого слова WithEvents

Его особенностью является то, что оно не может использоваться совместно с ключевым словом New. Однако именно последнее слово обеспечивает доступ к объекту и событиям объекта из окна кода. Поэтому следует писать:

Dim WithEvents mObject As Class1

^ Private Sub Command1_Click()

SetmObject= New Class1

'или Set mObject= CreateObject(''Class1'')

mObject.свойство=значение

mObject.Метод

…………

SetmObject=Nothing'Удаление ссылки на объект

End Sub

Private Sub mObject_ИмяСобытия()

<Код, реализующий событие объекта mObject>

End Sub


6. Раннее и позднее связывание с объектом. Примеры.

Скорость выполнения приложения во многом зависит от того, каким образом VB осуществляет связывание объектной переменной с объектом. Существует раннее и позднее связывание .

Раннее связывание осуществляется при объявлении объектной переменной с явным указыванием имени класса. Например,

 

Dim Obj1 As New Form1

Dim Obj2 As New Class1

Dim ObjWord As New Word.Application

Dim ObjExcel As New Excel.Application

Dim ObjAccess As New Access.Application

 

Раннее связывание происходит на этапе компиляции и выполня­ется быстрее. При раннем связывании перед написанием кода необхо­димо загрузить в память библиотеку с классом, используя команду Project\References, окно References и список Available References. После чего следует приступать к созданию объектной переменной (уже определенного класса) с ключевым словом New.

Если же при объявлении объектной переменной используется универсальный тип Object, Variant, Control, то VB осуществляет позднее связывание переменной с объектом. Например,

 Dim mObject As Object, Obj As Control

For Each Obj In Me.Controls

If TypeName(Obj) = "TextBox" Then Obj.BackColor = 0

Next

Set mObject=CreateObject(“Word.Application”) 'Установить связь

………………………………………………………

Set mObject=Nothing 'Разорвать связь объекта с приложением Word

Set mObject=CreateObject(“Excel.Application”) 'Установить связь

………………………………………………………

Set mObject=Nothing 'Разорвать связь объекта с приложением Excel

 

Позднее связывание оправдано тогда, когда невозможно заранее определить, какие типы объектов будут использоваться при выпол­нении программы, что требует дополнительных затрат времени на анализ допустимых объектов. При первом обращении к свойствам и методам объекта происходит событие Initialize – создание объекта, а в строке Set mObject=Nothing наступает событие Terminate – уничто­жение объекта и освобождение памяти.

К недостаткам раннего связывания можно отнести привязан­ность создаваемого Вами приложения к конкретной версии библио­теки объектов. Выход в свет новой версии продукта, объектную модель которого Вы используете посредством раннего связывания, приведет к необходимости обновления Вашего приложения. К досто­инству раннего связывания можно отнести способность отображать список свойств и методов объекта после ввода точки при написании кода. Обычно раннее связывание используется на стадии отладки приложения. Завершающая стадия разработки приложения осуществ­ляется обычно на основе позднего связывания, не зависящего от новых версий используемых в проекте объектных моделей.



7. Способы объявления событий классов. Примеры.

Каждый класс кроме свойств и методов имеет набор собственных событий. События – это реакция объекта на действие системы, поль­зователя и других приложений. События, определяемые пользовате­лем, могут объявляться как внутри модуля класса (в области GD окна Code класса) с помощью команды File\New\Event или кнопки  окна Class Builder, так и внутри модуля формы одним и тем же оператором Event. Параметры, передаваемые процедуре события, должны быть указаны в той же строке объявления события. Например,

 Public Event WWW()

Public Event XXX(ByVal A As Long, ByVal B As Long)

 Для генерации (выполнения) события предназначен оператор RaiseEvent, которому в качестве параметра передается имя события. Например,

 Public Sub Text1_Change()

RaiseEvent WWW 'Реализация события WWW

End Sub

Public Sub Command1_Click()

RaiseEvent XXX(500,300) 'Реализация события XXX

End Sub

 Контейнер (модуль класса или формы), в котором используется объект, должен содержать процедуры-события.

Пример 59. Объявить событие в модуле класса, а запрограммировать его в модуле формы.

  Пусть событие (назовем его MTS) имеет два параметра. Первый – числовой, второй – логический. Событие будет реализовываться в методе Long1. Выполните следующие действия.

· Создайте новый проект с шаблоном Standard EXE.

· С помощью команды Project\Add Class Module добавьте модуль класса с именем Class1 в проект, используя шаблон Class Module на закладке New.

· Поместите в него следующий код.

Public Event MTS(ByVal Percent As Single, ByRef Cancel As Boolean)

Public Sub Long1(ByVal f As Single, c As Boolean)

RaiseEvent MTS(f, c) 'Вызов события MTS с двумя параметрами

End Sub 

· Теперь добавьте в область GD окна Code модуля формы следующий код: 

Private WithEvents mW As Class1, nCancel As Boolean, r As Single

'Ключевое слово WithEvents означает, что объект mW содержит события

Private Sub Command1_Click()

nCancel = False

r = Rnd

Set mW = New Class1 'Создание нового объекта на основе класса

Call mW.Long1(r, nCancel) 'Обращение к методу Long1

Text2 = nCancel 'Выводим значение, возвращаемое из события

Set mW = Nothing

End Sub

Private Sub Form_Load()

Text1 = Format(r, "0 %")

Text2 = ""



End Sub

Private Sub mW_MTS(ByVal Percent As Single, _

Cancel As Boolean)

m% = CInt(100 * Percent)

Text1 = m & "%"

If m >= 50 Then Cancel = True

End Sub


8. Создание элемента управления ActiveX в Visual Basic. Отображаемые и пользовательские свойств и методы ActiveX-компонент. Передача события приложению–контейнеру. Регистрация компонент.

Конструирование элемента управления ActiveX

Возможность создания независимых ActiveX-компонент подобно элементам управления, представленным на панели General ToolBox, и последующее их использование в любых разрабатываемых приложениях привлекает всех без исключения разработчиков. С помощью VB можно легко создать элемент управления ActiveX. Кроме того, созданный нами ActiveX-компонент можно будет использовать на Web-страницах Internet – одной из самых быстрорастущих информационных систем.

Как известно, стандартное приложение содержит главную форму и несколько вспомогательных форм. Вспомогательные формы обычно поддерживают главную, получают данные, вводимые пользователем (например, InputBox), и обрабатываются кодом своей или главной формы. Поэтому по аналогии можно предположить, что элемент управления ActiveX является главной формой, а страницы его свойств – вспомогательными формами.

Конструирование элемента управления ActiveX похоже на конструирование формы и выполняется разработчиком (конструктором) элемента. При этом элемент располагается на объекте, называемом UserControl, являющемся для него формой. Объект UserControl имеет те же методы, что и стандартная форма, например, Print, Line и др.

Как известно, форма приложения является окном, которое находится на рабочем столе при выполнении приложения. Элемент управления ActiveX – это то же окно, но он может существовать только на форме.

Как известно, приложение взаимодействует с пользователем через свой интерфейс. Разработчик приложения (программист, который использует элемент) решает, как оно будет вести диалог с пользователем, и пользователю приложения приходится следовать этим правилам. Подобное же происходит и с элементом управления ActiveX. Он предоставляет строго определенный интерфейс из свойств, событий и методов. При этом разработчик приложения получает доступ к элементу только через его интерфейс и также как пользователь приложения не может модифицировать исходный код элемента ActiveX.

Код элемента управления ActiveX работает в режиме конструирования и выполнения. Когда разработчик приложения помещает элемент управления на форму, то запускается программный код элемента ActiveX. Когда изменяются его свойства с помощью окна свойств, то с ним также что-то происходит на форме. Когда же разработчик запускает приложение, то элемент (уже объект формы) также выполняет какие-то действия. Но при этом в зависимости от режима работы элемент определяет как он должен себя вести.

Например рассмотрим элемент TextBox. Если в режиме конструирования через окно свойств установить присваиванием ^ Scrollbar= Vertical, то к объекту на форме автоматически будет добавлена вертикальная полоса прокрутки. Причем она будет оставаться в поле в обоих режимах работы. Как Вы уже должны заметить, свойство Text имеет по умолчанию значение Text1. Запустив приложение и введя некоторый текст в поле объекта, Вы измените его значение. Однако если вновь вернуться в режим конструирования, то это свойство вновь примет значение Text1. То есть изменения, произведенные в окне свойств элемента, участвуют в обоих режимах.

При конструировании же элемента управления ActiveX разработчику приходится переключаться между функциями разработчика элемента и функциями разработчика 

приложения. При этом разработчик элемента определяет, какие свойства, события и методы должны быть доступны в каждом из этих режимов. Например, для разработчика элемента могут быть доступны свойства как для чтения, так и для изменения, а для разработчика приложения – только для чтения. Также разработчик элемента может быть определить дополнительные методы и события, недоступные для разработчика приложения.

Разработчик элемента управления ActiveX конструирует его видимый интерфейс (размещением каких-либо элементов) на объекте UserControl и может манипулировать им через свойства. Этот процесс похож на создание интерфейса у обычного приложения. Конструирование же невидимого интерфейса (свойств, методов и событий) во многом похоже на конструирование модуля класса.

Как известно, любой элемент ActiveX должен предоставлять определенные свойства, которые будут автоматически отображаться в окне свойств. Также разработчики приложений ожидают увидеть у элемента управления не только уникальные свойства, но и стандартные свойства, присущие всем стандартным элементам (такие как цвет фона, шрифт текста, видимость и т.д.). Разрабатываемые же методы должны обеспечивать все функциональные возможности элемента управления и быть доступными из кода приложения. И наконец, нужно предусмотреть события, необходимые для реакции на внешние воздействия.

И так, прежде чем начать кодировать элемент управления, Вы должны сформулировать для себя, что будет делать элемент и как он будет использоваться разработчиками приложений.

Теперь начнем наше конструирование элемента ActiveX. Создадим элемент управления FlexShape (улучшенный элемент управления Shape). Он будет реализовать некоторые возможности элемента управления Shape плюс отображение звезды и эллипса.

Надо сразу сказать, что большая часть функциональных возможностей для создаваемого (конструируемого) элемента управления уже разработана и нам лишь остается воспользоваться способом заимствования их из других элементов с помощью мастера VB, который будет генерировать код стандартных частей для создаваемого элемента управления, а разработчику только останется написать код для уникальных (дополнительных) свойств, методов и событий.

• Откройте новый проект с шаблоном ActiveX Control или воспользуйтесь командой ^ File\New Project\ActiveX Control. VB подготовит «сцену» для нового элемента управления ActiveX, создав новый проект под названием Project1 с объектом UserControl1. UserControl – это аналог формы, на которой конструируется элемент управления.

• Используя свойства Name, переименуйте проект и элемент управления. Эти два имени будут использованы для регистрации данного элемента в системе, поэтому они должны быть содержательными. Имя Project1 измените на FlexProject, а имя UserControl1 – на FlexShape (рис.123). Теперь запустим мастер, чтобы он сгенерировал за нас как можно больше стандартного кода для создаваемого элемента управления.

• С помощью команды ^ Add-Ins\Add-In Manager … загрузите мастер ActiveX Ctrl Interface Wisard (можно двойным щелчком) и выполните одноименную команду из меню Add-Ins. Проследуем за мастером по шагам весь путь по созданию кода.

• На первом шаге мастер пригласит Вас к началу процесса конструирования интерфейса. Его появление можно отключить флажком «Skip this screen in future». Однако сейчас нажмите кнопку Next.



• На втором шаге мастер предложит выбрать стандартные части элемента управления ActiveX. Слева – список стандартных свойств, методов и событий, которые можно включить в конструируемый элемент. Справа – список уже выбранных свойств, методов и событий интерфейса, которые создаваемый элемент управления будет поддерживать. Здесь можно любой из элементов списка убрать или добавить. Добавьте в список справа следующие свойства, события и методы, коротые характерны для большинства элементов управления: Click, Cls, DblClick, Enabled, ForeColor, BackColor, Hide, Hdc, Hwnd, MouseMove, MouseUp, MouseDown, OLEDrag, OLEDragOver, OLEDragDrop, OLEDropMode, OLEStartDrag, Paint, Picture, Resize, ScaleHeight, ScaleWidth, Show, Refresh.

• На третьем шаге происходит создание специальных частей интерфейса (рис.124), которые являются уникальными для данного элемента управления. Create Custom Interface Members (Создание пользовательских членов интерфейса) мастер предоставляет возможность программисту работать с пользовательскими событиями, методами и свойствами.

Для этого достаточно нажать кнопку ^ New, чтобы отобразить диалог Add Custom Member и ввести название свойства, метода или события. Добавьте следующие свойства: x, y, Rmax, Rmin, AngleTopBase, N, Shape, FigureStyle, AutoSize и методы Zvezda, Ellipse. Кнопками Edit и Delete можно отредактировать или убрать компонент интерфейса.

• На четвертом шаге происходит установка соответствия (отображения) между компонентами интерфейса создаваемого элемента и стандартными элементами VB (рис.)

Все те компоненты, которые Вы не желаете обрабатывать собственным кодом, следует сделать соответствующими компонентам объекта UserControl. Такими компонентами являются все, кроме x, y, Rmax, Rmin, AngleTopBase, N, Shape, FigureStyle, AutoSize, Zvezda, Ellipse. Так, например, для события Click нет необходимости определять реакцию на щелчок внутри создаваемого элемента, а нужно передать это событие главному приложению, чтобы оно обработалось им стандартно. (((Четвертый шаг Set Mapping (Установить соответствие) мастера ActiveX Control Interface Wizard (рис. 14.9) связывает члены элемента управления, выбранные на втором и третьем шагах, с событиями, свойствами и методами объектов элемента управления ActiveX. Диалоговое окно мастера содержит список всех свойств, методов и событий, которые определены как часть общего интерфейса элемента управления. Для связывания члена, выбранного из списка Public Name (Наименование), необходимо из раскрывающегося списка Control (Объект элемента управления) группы Maps to (Отобразить на) выбрать объект элемента управления и из списка Member (Член) этой же группы соответствующее событие, свойство или метод.)))

• Для отображения компонентов создаваемого интерфейса необходимо попеременно их выбирать из списка Public Name и связывать через список Control с элементом UserControl. Мастер сам подберет компонент интерфейса объекту UserControl с тем же именем в отображаемом ниже списке Member.

• ((((На пятом шаге^ Set Attributes (Назначить атрибуты) (рис. 14.10) мастер предлагает определить атрибуты тех членов нового элемента управления ActiveX, которые не были связаны с событиями, методами и свойствами на предыдущем шаге.))) На пятом шаге происходит установка типов свойств, значений по умолчанию и атрибутов для новых компонент (рис.126). По умолчанию мастер объявляет все новые свойства как Variant. Здесь же можно добавить описание (поле Description) к каждому компоненту интерфейса. Каждое описание отобразится внизу окна свойств, когда пользователь 

выберет свойство. Стандартные элементы уже имеют описания, а для пользовательских свойств их необходимо составить.

• Задайте для свойств x, y, Rmax, Rmin, AngleTopBase тип Integer, для свойств FigureStyle, N, Shape – тип Byte, для свойства AutoSize – тип Boolean, а для методов Zvezda, Ellipse – тип Variant. Как будет показано ниже, можно назначить некоторым свойствам пользовательский тип данных.

• В поле Default Value можно установить значение свойств по умолчанию. Установите для новых свойств следующие значения: x=1000, y=1000, Shape=0, Rmax=300, Rmin=100, AngleTopBase=90, FigureStyle=1, N=5, AutoSize=False. Таблица 35

Компонента

Описание

X и Y

X, Y – центр фигур

AngleTopBase

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

Rmax, Rmin

Наружный и внутренний радиусы звезды или максимальный и минимальный радиусы эллипса

N

Количество вершин звезды

Zvezda

Рисуем звезду

Ellipse

Рисуем эллипс

Shape

Выбор фигуры (0–звезда, 1–эллипс, 2–круг)

• В поле Arguments можно указать параметры для методов и событий. Наш проект не будет иметь собственных событий и аргументов у методов (как в предыдущем параграфе).

• Два списка Run Time и Design Time позволяют определить свойства для режима выполнения и режима конструирования.

• Последний шаг – это завершение (кнопка Finish), при этом оставьте отмеченным флажок ^ View Summary Report, чтобы мастер показал итоговый отчет по завершении своей работы. Элемент управления FlexShape создан, теперь можно приступить к его испытанию. Элемент управления имеет собственную страницу свойств и может быть помещен на форму, но пока на экране нет ничего, кроме объекта UserControl. Появился новый значок на панели элементов управления с именем FlexShape. Значок с изображением матрицы и ручки по умолчанию дается всем элементам управления ActiveX. Для того чтобы поменять значок, можно либо нарисовать новую картинку (Bitmap-растр) в редакторе картинок, например, Imagedit.exe, либо загрузить с диска готовую картинку, например, по маршруту C:\Install\Visual Basic 6.0\COMMON\GRAPHICS\ BITMAPS, и связать ее со свойством ToolBoxBitmap объекта UserControl.

Удостоверимся, что элемент управления работает. Значок элемента ActiveX заблокирован, поскольку сам элемент все еще конструируется.

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

• Выберите команду ^ Add Project из меню File, чтобы открыть новое окно проекта.

• Выберите шаблон проекта Standard EXE. Появится новая форма с именем Form1. Измените имя формы, например, на FlexForm, а имя нового проекта – на MyProject.

• Закройте окно конструирования UserControl и окно с кодом элемента управления, если они были открыты.



• При активной форме FlexForm значок на панели элементов управления General ToolBox становится также активным. С этого момента можно использовать элемент управления FlexShape, как любой другой элемент управления VB.

• Поместите объект FlexShape на форму FlexForm. Он автоматически получит имя FlexShape1.

• Нажмите на панели инструментов Standard кнопку ^ Save Project Group () и сохраните компоненты на диске в виде файлов FlexShape.ctl, FlexProject.vbp, FlexForm1.frm, MyProject.vbp.

Итак, VB сделал за нас довольно много работы. Он сгенерировал работающий элемент управления ActiveX, создав стандартный код интерфейса.

Перед добавлением собственного кода давайте посмотрим, что именно сделал мастер. Откройте окно кода объекта UserControl и просмотрите строки, сгенерированные мастером. Программа может показаться довольно длинной, но она не так сложна, как выглядит.

И наконец, еще раз вернемся к отображению различных событий на эквивалентные события объекта UserControl. Так, когда пользователь щелкает мышью на элементе управления ActiveX, Windows отправляет событие Click объекту UserControl. Разработчик элемента управления может обработать это событие в самом создаваемом элементе управления, но в этом случае приложение, которое использует элемент, не будет видеть событие Click. Но можно и передать событие (отобразить обратно) приложению-контейнеру (например, Form1). В этом случае разработчик приложения, использующий элемент управления, сможет сам запрограммировать это событие. Можно сделать и то, и другое, то есть сначала обработать событие в элементе управления, а затем передать его контейнеру, как это будет сделано в методе UserControl_Resize.
^ Private Sub UserControl_Resize()

m_x = UserControl.ScaleWidth \ 2

m_y = UserControl.ScaleHeight \ 2

If m_AutoSize Then

If UserControl.ScaleWidth <= UserControl.ScaleHeight Then

m_Rmax = UserControl.ScaleWidth \ 2 - 15 '15 твипов=1 пикселю

m_Rmin = UserControl.ScaleWidth \ 6 - 15

Else

m_Rmax = UserControl.ScaleHeight \ 2 - 15

m_Rmin = UserControl.ScaleHeight \ 6 - 15

End If

Else

m_Rmax = m_def_Rmax 'Возвращаем умалчиваемые значения

m_Rmin = m_def_Rmin

End If

UserControl.Refresh 'Обновить объект UserControl

RaiseEvent Resize 'Передаем событие контейнеру

End Sub
Передать событие приложению-контейнеру можно с помощью метода RaiseEvent. Так, событие Click объекта UserControl определено следующим образом.

^ Private Sub UserControl_Click()

RaiseEvent Click

End Sub

1. 'Default Property Values:

'Property Variables:

Это раздел объявлений. Здесь описываются константы, принятые по умолчанию, и закрытые переменные, характеризующие специальные свойства элемента управления. Элемент управления получает значение, введенное пользователем в окне свойств, и связывает их с закрытыми переменными. Имена констант и переменных основаны на именах свойств и их код можно легко редактировать.

1.1.Сделаем так, чтобы допустимые значения свойства отображались в раскрывающемся списке окна свойств, как в других элементах управления VB. Для этого следует добавить специальный код, который бы отображал только допустимые значения свойств Shape и FigureStyle и таким образом ограничивал выбор пользователя именно этими значениями. Если приложение использует переменную, которая может принимать только ограниченное число целочисленных значений, то можно использовать перечислимый тип, который объявляется с помощью структуры Enum … End Enum. Свойства Shape и FigureStyle как раз и будут являться такими переменными.

• Откройте окно кода проекта FlexProject и добавьте в секцию Declarations объявленные типы и описание переменных.

Это объявление сообщает Visual Basic, что переменная m_Shape типа Figure может принимать лишь значения от 0 до 2, а переменная m_FigureStyle типа FStyle – значения от 0 до 1 (перечислимые значения соответствуют числам, начинающимся с 0). Строки в объявлении типа являются синонимами соответствующих числовых значений, которые будут отображаться в окне свойств. Квадратные скобки в объявлении типа обязательны только для строк содержащих пробелы (или другие недопустимые символы).

• Теперь можно заменить тип у свойств ^ Shape и FigureStyle с Byte на Figure и FStyle.

Пользователь уже не сможет выбрать недопустимое значение для этого свойства в окне свойств. Попытка же присвоить перечислимой переменной недопустимое значение в режиме выполнения программы приведет к сообщению об ошибке.
^ 2. 'Event Declarations:

Это объявления событий. Эти события были определены в первых двух окнах мастера и отображены на объект UserControl. Если события не были отображены на объект UserControl, то только UserControl будет их видеть, и пользоваться ими смогут лишь разработчики элемента. В нашем элементе управления не требуется как-то по-особенному использовать события, поэтому предоставим эту возможность контейнеру-приложению (например, Form1), на котором будет использоваться созданный нами элемент управления ActiveX.
Чтобы ActiveX-компонент был виден проекту, его необходимо зарегистрировать в системе. Для этого следует создать осх-файл командой File\Make FlexProject.ocx, которая доступна только при активном окне UserControl.



Осх-файлы могут быть расположены в любом месте на диске, но система по умолчанию начинает искать их в папке ^ Windows\ System32. При создании осх-файла VB автоматически регистрирует его в системном реестре. Следовательно, если Вы создали осх-файл в другом месте, то его не следует в дальнейшем перемещать.

Чтобы иметь возможность использовать элемент ActiveX в других компьютерах, следует применить утилиту regsvr32.exe (сервер регистрации), передавая ей имя осх-файла в качестве параметра. Например, можно использовать следующую команду: REGSVR32 FlexProject.ocx

Если осх-файл был сохранен в иной папке, отличной от папки Windows\ System32, то следует сначала перейти в эту папку, а затем выполнить следующую команду: С:\WINDOWS\SYSTEM32\REGSVR32 FlexProject.ocx

Чтобы удалить элемент управления из реестра Windows, также следует использовать утилиту Regsvr32, но с ключом /U. Например, удалим элемент управления FlexShape из реестра: С:\WINDOWS\SYSTEM32\REGSVR32 FlexProject.ocx/U

Таким же образом можно устанавливать в системе или удалять из нее библиотеки динамической компоновки. Например, REGSVR32 StarP.dll.



9. Пример динамического способа формирования объектов на форме VB.

пример:Динамически сформ-ть объекты на форме VB/

Dim Text1 As TextBox,Text2 As TextBox,Text3 As TextBox

'объекты Text1 и Text2,Text3 не будут сод-ть события

Dim WithEvens Command1 As CommandButton

Private Sub Form_Load()

Me.ScaleMode=3 Режим-пиксели для объектов формы

End Sub

Private Sub Form_Unload(Cancel As Integer)

Set Command1=Nothing

Set Text1=Nothing

Set Text2=Nothing

Set Text3=Nothing

End Sub

Private Sub Form_Activate()

MsgBox "мы сформировали дин-кую форму в среде VB"

End Sub

Private Sub Form_Initialize()

Me.Width=4000 для формы размеры задаются в твипах

Me.Height=2600 при разрешении экрана 1280*1024 точек

Set Text1=Controls.Add("VB.TextBox","T1",Form1)

Set Text2=Controls.Add("VB.TextBox","T2",Form1)

Set Text3=Controls.Add("VB.TextBox","T3",Form1)

Set Command1=Controls.Add ("VB.CommandButton","Cmd1",Form1)

Text1.Visible=True

Text2.Visible=True

Text3.Visible=True

Command.Visible=True

Command1.FontBold=True

Text1.FontBold=True

Text2.FontBold=True

Text3.FontBold=True

Text1.Left=12 Размеры эл-ов на форме в пикселях

Text1.Top=6

Text1.Width=270

Text1.Height=18

Text2.Left=12

Text2.Top=36

Text2.Width=270

Text2.Height=18

Text3.Left=12

Text3.Top=66

Text3.Width=270

Text3.Height=18

Command1.Left=45 Command1.Top=100

Command1.Width=200

Command1.Height=40



Command1.Caption="Вычислить выражение"

End Sub

Private Sub Command1_Click()

Dim a As Double,b As Double,c As Double

On Error GoTo 100

a=Text1

b=Text2 c=a*b

Text3=c

Exit Sub

100

MsgBox "Вы уверены,что ввели значения в текстовые поля?",vbQuestion,_"Динамическая форма" End Sub



10)Пример работы с коллекцией объектов, свойствами и методами объектов.

Пример 59. Объявить событие в модуле класса, а запрограммировать его в модуле формы.

 

Пусть событие (назовем его MTS) имеет два параметра. Первый – числовой, второй – логический. Событие будет реализовываться в методе Long1. Выполните следующие действия.

  • Создайте новый проект с шаблоном Standard EXE.

  • С помощью команды Project\Add Class Module добавьте модуль класса с именем Class1 в проект, используя шаблон Class Module на закладке New.

  • Поместите в него следующий код.

Public Event MTS(ByVal Percent As Single, ByRef Cancel As Boolean)

^ Public Sub Long1(ByVal f As Single, c As Boolean)

RaiseEvent MTS(f, c) 'Вызов события MTS с двумя параметрами

End Sub

 

  • Теперь добавьте в область GD окна Code модуля формы следующий код:

 

Private WithEvents mW As Class1, nCancel As Boolean, r As Single

'Ключевое слово WithEvents означает, что объект mW содержит события

^ Private Sub Command1_Click()

nCancel = False

r = Rnd

Set mW = New Class1 'Создание нового объекта на основе класса

Call mW.Long1(r, nCancel) 'Обращение к методу Long1

Text2 = nCancel 'Выводим значение, возвращаемое из события

Set mW = Nothing

^ End Sub

Private Sub Form_Load()

Text1 = Format(r, "0 %")

Text2 = ""

End Sub

Private Sub mW_MTS(ByVal Percent As Single, _

Cancel As Boolean)

m% = CInt(100 * Percent)

Text1 = m & "%"

If m >= 50 Then Cancel = True

End Sub


11. Работа с отладчиком Visual Basic. Окна Watch, Immediate.

Редактор Visual Basic является средой разработки и редактирования программ на языке Visual Basic. Как и все современные средства разработки программного обеспечения, редактор Visual Basic содержит мощные средства для облегчения написания кода, а также средства для поиска и устранения ошибок. Начиная с версии 2000 года, редактор Visual Basic является отдельным приложением, которое имеет свою строку меню и панель инструментов. Кроме того, в его состав входят семь вспомогательных окон, облегчающих управление проектом, навигацию и поиск объектов, их свойств, методов, а также отладку и оптимизацию программных процедур.

Кроме вспомогательных окон, редактор Visual Basic может содержать любое количество открытых окон модулей (или окон кода) (Code Window), которые содержат непосредственно код программы на Visual Basic. При открытии редактора Visual Basic по умолчанию вместе с ним открываются два вспомогательных окна — окно проекта (Project Explorer Windows) и окно свойств (Properties Windows), а также как минимум одно окно модуля (Code Window). Остальные вспомогательные окна доступны через меню Вид (View), соответствующие кнопки панели инструментов и пункты контекстного меню.При отладке могут использоваться три вспомогательных окна — Непосредственной отладки (Immediate Window), Локальных переменных (Locals Window) и Контрольных выражений (Watch Window). Окно непосредственной отладки (Immediate Window), как и другие отладочные окна, используется для проверки значений переменных или выражений. Для этого можно воспользоваться командой Debug.Print <выражение>, вставляя ее в интересующих участках кода. По мере выполнения программы в окне будут отображаться значения заданных выражений (или переменных). Второй вариант — вводить команду Print <выражение> (или ? <выражение>) по мере необходимости непосредственно в окно, когда программа находится в режиме прерывания (Break Mode). После нажатия на клавишу <Enter>, в следующей строчке появится значение заданного выражения. Окно непосредственной отладки, кроме того, можно использовать для задания значения какой-либо переменной или свойства. Для этого используется синтаксис имя_переменной = <выражение>.

Естественно, все переменные, используемые в окне, должны быть доступны в момент вычисления. Например, если вы указываете имя элемента управления какой-нибудь формы, то эта форма должна быть, как минимум, открыта.

Следующее отладочное окно — окно локальных переменных (Locals Window) используется для отображения промежуточных значений всех локальных переменных и свойств, доступных в активном объекте Например, окно локальных переменных (Locals Window), открытое для формы Поставщики (Suppliers), в точке останова в теле обработчика события ПередОбновлением (BeforeUpdate). В центре окна локальных переменных расположена таблица, содержащая три столбца Выражение (Expression), Значение (Value) и Тип (Туре) Столбец Выражение (Expression) содержит наименования всех переменных и свойств объекта, расположенных в виде иерархического списка. Если речь идет о модуле класса (например, формы или отчета), то во главе этого иерархического списка стоит ключевое слово Me.Me — это системная переменная, используемая для ссылки на активный объект (например, форму или отчет).

Второй столбец таблицы (Значение (Value)) содержит значение расположенного слева элемента, а столбец Тип (Туре), как ни странно, содержит его тип ни одну из величин, приведенных в таблице, редактировать нельзя.



Окно локальных переменных (Locals Window) используется только в режиме останова программы (Break Mode) Исполняя программу в пошаговом режиме, можно наблюдать, как изменяются значения переменных и свойств объекта. Удобство использования этого отладочного окна заключается в том, что можно одновременно наблюдать за изменением большого количества свойств объекта по мере выполнения программы.

Третье отладочное окно — окно контрольных выражений (Watch Window) используется для проверки значений указанных в этом окне выражений. Это окно очень напоминает окно локальных переменных (Locals Window). В центре его расположена таблица, состоящая из четырех столбцов. Смысл и наименования первых трех столбцов соответствуют первым трем столбцам таблицы окна локальных переменных (Locals Window). Четвертый столбец называется Контекст (Context). В этом столбце указывается, на каком уровне описана переменная. Если переменная описана в процедуре, то здесь фигурирует наименование модуля и наименование процедуры; если переменная является общей для модуля (глобальной), столбец содержит наименование модуля.




12. Оператор On Error. Методы объектов Debug. Условная компиляция. Примеры

Как правило, отладка — это проверка работы и исправление ошибок программистом перед передачей проекта на тестирование.

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

В набор инструментария отладки Visual Basic 6 входят такие основные инструменты, как:

  • панель инструментов Debug (Отладка) с кнопками команд для выполнения отладки приложения;

  • окно Immediate (Непосредственное выполнение), предназначенное для непосредственного ввода команд, требующих немедленного выполнения;

  • окно Watches (Наблюдение), предназначенное для просмотра значений выражений, включенных в список просмотра;

  • окно Locals (Локальные), предназначенное для просмотра значений переменных;

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

  • окно Call Stack (Стек вызовов) для просмотра вызванных, но незавершенных процедур.

Панель инструментов^ Debug (рис. 10.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 (Отладка). При этом в сером вертикальном поле рядом с выбранной командой устанавливается жирная точка (рис. 10.5), остановка выполнения программы произойдет именно в этом месте кода.

При запуске программы в точке останова выполнение программы приостанавливается и для контроля работы приложения можно использовать весь отладочный инструментарий: просматривать значения переменных и выражений при позиционировании маркера на выбранной переменной или выражении (рис. 10.6).

Для более тщательного контроля работы приложения можно использовать окна просмотра: Immediate (Немедленное выполнение), Watches (Наблюдение), Locals (Локальные), Quick Watch (Быстрый просмотр). Call Stack (Стек вызовов).

Кроме прямого ввода и выполнения команд, окно Immediate служит для выяснения значения переменных и выражении. Для этого необходимо выполнить команду ? с указанием интересующего выражения, как это показано на рис. 10.7. Значение выражения выводится в следующей строке этого же окна.

При работе с окном Immediate удобно использовать объект Debug и его метод print. В режиме запуска метод Debug. Print выводит текстовое сообщение в окне Immediate. Синтаксис этого метода очень простой:

Debug.Print StringMessage где StringMessage — текст выводимого в окно Immediate сообщения.

В окне Locals можно просмотреть все переменные и их значения, используемые в данный момент приложением (рис. 10.8)

Основным окном для просмотра значений выражений является окно Watches (рис. 10.9). В этом окне можно проконтролировать любое выражение из списка введенных для проверки.

Список проверяемых выражений пополняется в диалоговом окне^ Add Watch (рис. 10.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 (Быстрый просмотр) для быстрого доступа к значению выражения (рис. 10.11). Для этого окна не требуется вводить список контролируемых выражений, а достаточно выделить интересующее выражение в тексте кода и вызвать окно Quick Watch одноименной кнопкой на панели инструментов Debug,

Для контроля выполняемых процедур используется окно^ Call Stack (Стек вызовов), в котором показаны все вызванные и активные в данный момент процедуры (рис. 10.12).

Из окна Call Stack можно перейти к коду программы (рис. 10.13), откуда был выполнен вызов выбранной в списке процедуры, с помощью кнопки Show (Показать). На рис. 10.13 показано место вызова процедуры, выбранной в окне Call Stack (рис. 10.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:

текст кода

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

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

Объявление константы условной компиляции в коде осуществляется при помощи директивы #Const, а блоки кода для условной компиляции обозначаются директивой #If...Then...#Else. Например, для создания версий одного и того же приложения на французском и немецком языках из одного исходного кода, необходимо внедрить зависимые от платформы сегменты кода в инструкции #If...Then с помощью определенных ранее констант FrenchVersion и GermanVersion. Как это сделать, показано в следующем примере:

Язык Visual Basic

#If FrenchVersion Then

' <code specific to the French language version>.

#ElseIf GermanVersion Then



' <code specific to the German language version>.

#Else

' <code specific to other versions>.

#End If
Если для константы задается FrenchVersion значение True во время компиляции, компилируется условный код для французской версии. Если установить для константы GermanVersion значение True, компилятор использует немецкую версию. Если ни одна константа не имеет значения True, выполняется код в последнем блоке Else.Примечание.

Автозавершение не работает при редактировании кода и использовании директив условной компиляции, если код не является частью текущей ветви.




13. Свойства и методы объектов Debug, Err. Примеры.

Свойства

Свойство Description

Свойство для чтения и записи. Возвращает или задает строку описания, соответствующую ошибке.

Свойство Erl

Только для чтения. Возвращает целое число, указывающее номер строки последнего выполненного оператора.

Свойство HelpContext

Свойство для чтения и записи. Возвращает или задает объект типа Integer, содержащий идентификатор контекста темы в файле справки.

Свойство HelpFile

Свойство для чтения и записи. Возвращает или задает выражение типа String, содержащее полный путь к файлу справки.

Свойство LastDLLError

Только для чтения. Возвращает код системной ошибки, возникшей при вызове библиотеки динамической компоновки (DLL).

Свойство Number

Свойство для чтения и записи. Возвращает или задает числовое значение, определяющее ошибку.

Свойство Source

Свойство для чтения и записи. Возвращает или задает выражение типа String, определяющее имя объекта или приложения, первоначально создавшего ошибку.

Методы

Метод Clear

Удаляет все параметры свойств объекта Err.

Метод Raise

Создает ошибку времени выполнения; может использоваться вместо оператора Error.



^

Объект Err (Visual Basic)

Содержит сведения об ошибках во время выполнения.

Заметки

Свойства объекта Err устанавливаются генератором ошибки — средой Visual Basic, объектом или программистом.

^

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

^

использовать для ее обработки или ее изучения. Для создания ошибки во время выполнения в коде используйте метод Raise.

Свойства объекта Err сбрасываются в нуль или строки нулевой длины ("") после инструкции Exit Sub, Exit Function, Exit Property или Resume Next внутри подпрограммы обработки ошибок. При использовании любой формы оператора Resume за пределами подпрограммы обработки ошибки свойства объекта Err не сбрасываются. Метод Clear может использоваться для явного сброса Err.

Используйте метод Raise вместо оператора Error для создания ошибок во время выполнения для системных ошибок и модулей класса. Решение о том, следует ли использовать метод Raise в другом коде зависит от полноты данных, которые требуется возвращать.

^

Объект Err является внутренним объектом с глобальной областью действия. Следовательно, создание в коде экземпляра этого объекта не требуется.Примечание.

Можно использовать Функция ErrorToString для поиска сообщения об ошибке, соответствующего номеру конкретной ошибки.

Пример

В этом примере показано использование свойств объекта Err при формировании диалогового окна с сообщением об ошибке. Следует отметить, что если сначала используется метод Clear, то при создании ошибки Visual Basic с помощью метода Raise свойствами объекта Err становятся значения Visual Basic по умолчанию. Свойство Description возвращает строку с описанием ошибки.

^

Язык Visual Basic

Dim Msg As String

' If an error occurs, construct an error message.

On Error Resume Next ' Defer error handling.

Err.Clear()

Err.Raise(6) ' Generate an "Overflow" error.

^

' Check for error, then show message.

If Err.Number <> 0 Then

Msg = "Error # " & Str(Err.Number) & " was generated by " _

& Err.Source & ControlChars.CrLf & Err.Description

MsgBox(Msg, MsgBoxStyle.Information, "Error")

^

End If 

14.Приемы оптимизации кода

Объявление переменных

Для уменьшения размеров требуемой памяти и ускорения выполнения операций над данными:

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

  • Объявляйте переменные в строгом соответствии с их возможным типом. Не используйте без крайней необходимости тип Variant. Работа с Variant требует больше памяти и дополнительных преобразований.

  • При задании типа, как правило, используйте тип с более узкой областью определения, достаточной для представления возможных значений. Здесь могут быть исключения, специфические для VBA. Так переменные типа Integer преобразуются к типу Long, так что разумнее задавать сразу тип Long вместо типа Integer.

  • Операции с плавающей точкой выполняются более долго, поскольку требуют обращения к сопроцессору. Поэтому тип Single и Double следует использовать только в случае действительной необходимости. Иногда, можно воспользоваться типом Currency для выполнения подобных действий. В этом случае потребуется больше памяти, но не будет обращений к сопроцессору с плавающей точкой.

  • При работе с объектами следует вводить переменные соответствующего объектного типа. Они хранят ссылки на объекты, а работа со ссылками выполняется значительно быстрее, чем с самими объектами.

  • При объявлении объектных переменных избегайте объявления Object, указывайте явный тип объекта. Типы Object и Variant весьма полезные типы, но применять их нужно только в случае действительной необходимости.

В одном из примеров, я приводил таблицу временных измерений выполнения арифметических операций над данными разных типов. Рекомендую провести подобные замеры в более полном объеме.
^
Математические операции

  • При работе с целыми используйте целочисленные операции, - деление нацело, взятие остатка и другие, не выводящие за пределы целых чисел.

  • В выражениях, где одновременно присутствуют целые числа и числа с плавающей точкой перед проведением операций всегда происходит преобразование к типам с плавающей точкой Single и Double. Для уменьшения подобных преобразований, записывайте выражения так, чтобы пересечение переменных целого и плавающего типа было , по возможности, минимальным.
^
Строковые операции

  • При работе со строками используйте введенные в Office 2000 функции Replace, функции разбора строки и другие. Ранее мы подробно рассказали об их достоинствах.

  • Избегайте, по возможности, использования конкатенации. Используйте Replace в большинстве случаев. В тех случаях, когда заменяется одна подстрока на другую такой же размерности, можно использовать функцию Mid, как в следующем примере:

Public Sub TestCode()

Dim Text As String



Text = "Компилятор кода"

Mid(Text, 1, 5) = "Транс"

Debug.Print Text

End Sub

  • Строковые константы VBA могут сократить время вычислений, позволяя избежать вызовов функций. Так, например, эффективнее использовать константу vbCrLf, чем комбинацию символов Chr(13), Chr(10), задающих возврат каретки и перевод строки.

  • Иногда медленные операции над строками можно изменить на операции работы с их кодами. Код

If Asc(Text) = 202

работает быстрее, чем код

If Left(Text,1) = "K"

Злоупотреблять такими оптимизациями не стоит, поскольку первый фрагмент менее понятен, чем второй. Он нуждается, по крайней мере, в комментариях.
Циклы

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

  • Все вычисления, которые могут быть сделаны вне цикла, должны быть вынесены из него.

  • Предусматривайте возможность досрочного завершения цикла, когда решение задачи уже получено.

  • Аккуратно работайте в цикле с элементами массивов. Старайтесь избегать лишнего вычисления индексных выражений и обращений к элементам массива. Часто введение дополнительных переменных позволяет существенно ускорить работу с элементами массивов.

  • При работе с коллекциями объектов Office 2000 используйте цикл For Each вместо обычного цикла For. В большинстве случаев это приводит к существенному выигрышу во времени исполнения цикла.

Завершая эту лекцию, хочу еще раз сказать, что главная оптимизация достигается на уровне проектных решений, выбора структуры данных и алгоритмов. К ниже перечисленным советам следует относиться с определенной осторожностью. Оптимизация не должна идти во вред ясности написания программ. Не всегда в ней есть необходимость. Но если такая необходимость возникает, то, в первую очередь, нужно выявить узкие места в программе и их, в основном, и оптимизировать.
  1   2   3   4   5   6   7   8   9



Скачать файл (2804.4 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru