Ключевые слова Public и Private
Наверное, вы обратили внимание на ключевые слова Private или Public, которые встречались при работе с программными модулями в предыдущих уроках и примерах. Эти ключевые слова определяют область видимости процедуры. Ключевое слово Private делает процедуру доступной только на уровне модуля — это означает, что работать с ней могут лишь объекты, находящиеся в тех же форме или модуле. Процедуры и функции, объявленные с ключевым словом Public, доступны на уровне всего проекта, то есть имеют глобальную область видимости. Области видимости оказывают значительное влияние на строение и функциональные возможности ваших программ. Сейчас мы разберемся, почему и как это происходит.
Закрытые процедуры (Private)
Программные модули состоят из процедур, обеспечивающих работу форм и находящихся на них элементов. В процедурах событий для форм из предыдущих примеров часто встречалось ключевое слово Private, находящееся перед ключевым словом Sub. Необязательное ключевое слово Private описывает процедуру, доступную лишь для других процедур из тех формы или модуля, где она объявлена. Такие процедуры называются закрытыми, потому что их нельзя вызвать вне этой формы.
Если открыть проект примера из каталога \MSN\98vs\1033\Samples\VB98\Controls, в окне проекта вы увидите семь форм (рис. 4.9). Каждый файл формы описывает форму и элементы, находящиеся на ней.
Рис. 4.9. Семь форм в окне проекта
Файлы форм также содержат тексты процедур событий, связанных с формой; они называются кодом формы (code behind form — СВF). Код формы называется модулем формы. Модуль представляет собой самостоятельный набор процедур, которые могут вызываться из процедур событий данной формы или из любой другой процедуры того же модуля.
Все процедуры событий начинаются с ключевого слова Private. Оно означает, что процедура не может быть вызвана за пределами модуля формы. Ее область видимости ограничивается модулем, и вне формы она недоступна — другими словами,
она является локальной, или закрытой, процедурой. По умолчанию все процедуры событий объявляются с ключевым словом Private. Тем не менее вы можете включить в форму собственные процедуры и сделать их доступными на уровне приложения (то есть открытыми, или глобальными), воспользовавшись ключевым словом Public. Такие процедуры можно вызывать из любой другой формы (или стандартного модуля) проекта. Если ключевое слово Private или Public не указано, по умолчанию процедура считается открытой.
Открытые процедуры (Public)
В некоторых ситуациях процедура должна быть доступна за пределами формы - допустим, вы хотите добавить кнопки на форму панели инструментов вашего собственного приложения. Один из возможных вариантов — поместить процедуру в программный модуль, в котором любые форма, элемент или процедура смогут получить к ней доступ. Другой вариант — оставить процедуру в том модуле, которому она принадлежит, и указать ключевое слово Public перед ее объявлением. В этом случае процедура также будет доступна для других компонентов вашего приложения.
Вы можете выполнить любую открытую (или закрытую) процедуру формы, включив ее имя в другую процедуру той же формы. Например, если у вас есть процедура с именем Test, она выполняется следующей строкой:
Test
Строго говоря, сказанное относится только к процедурам Sub; функции вызываются несколько иначе. Кроме того, существуют процедуры третьего типа — процедуры свойств. О них речь пойдет в разделе «Работа с модулями классов» этого урока.
ПРИМЕЧАНИЕЧтобы вызвать открытую процедуру, находящуюся в модуле формы, за пределами формы, следует указать имя формы в виде префикса. Например, чтобы вызвать открытую процедуру типа Sub с именем test, принадлежащую форме frmForm1, следует ввести строку frmForm1.test.
Работа с модулями классов
Другой тип модулей, заслуживающий нашего внимания, — модули классов, или просто классы. Классы представляют собой фундаментальные «строительные блоки» в так называемом объектно-ориентированном программировании (ООП). Одни и те же объекты используются на всех стадиях разработки проекта. Более подробная информация об ООП приведена в уроке 15.
Классы позволяют выделить часть функциональных возможностей программы в один объект, что облегчает проектирование и разработку программ. При оптимизации отдельных объектов снижается вероятность нежелательного влияния на другие фрагменты программы. В ООП объекты в первую очередь служат для моделирования реальных ситуаций.
Visual Basic позволяет вставлять классы в проект или компилировать их, превращая в элементы ActiveX — библиотеки динамической компоновки (DLL) или нестандартные элементы, которые раньше назывались OCX. Элемент ActiveX можно использовать в программе или внедрить в документ World Wide Web (обычно называемые документами HTML). Пример из урока 10, «Диалоговые окна», показывает, как создать класс нестандартного диалогового окна и откомпилировать его в ActiveX DLL. В уроке 17, «Использование ActiveX», приведена более конкретная информация по ActiveX. Как вы убедитесь, классы лежат в основе многих новых возможностей Visual Basic. А пока мы рассмотрим модули классов и их роль в ваших проектах, не вдаваясь в теоретические тонкости ООП.
Класс содержит свойства и методы, которые выполняют некоторые взаимосвязанные операции. Класс представляет собой самостоятельный фрагмент программы. Это означает, что класс можно перенести из одного проекта в другой, и он будет правильно работать без всяких модификаций. Объекты Visual Basic создаются на основе классов. Например, объект-кнопка на самом деле создается на основе специального класса. Кнопка будет работать в любом приложении, при этом ее не приходится изменять. Проектируемые вами классы должны вести себя так же.
Классы, как и стандартные модули, хранятся в отдельных файлах, однако они обязательно включают две процедуры — Class_Initialize() и Class_Terminate():
Процедура Class_Initialize() задает значения свойств по умолчанию или выполняет другие подготовительные действия. Например, созданный вами класс в начале работы может выводить диалоговое окно с сообщением или просматривать системный реестр в поисках некоторого параметра.
Процедура Class_Terminate() содержит код для выполнения завершающих действий. Возможно, ваш класс создает временные файлы на жестком диске -в конце работы их следует удалить. Для подобных действий и предназначена процедура Class_Terminate.
Методы
Методы классов выполняют почти те же задачи, что и процедуры модулей. Имя метода может иметь модификатор Private или Public в зависимости от его области видимости. Открытые (Public) методы образуют программный интерфейс класса, и программы могут работать с ними без всяких ограничений. Закрытые (Private) методы используются классами для выполнения внутренних операций, недоступных за пределами класса.
Примером закрытого метода может послужить метод для извлечения информации из базы данных персонала. Доступ к таким данным должен быть ограничен, поэтому они извлекаются закрытым методом. Затем вы можете написать открытый метод, внутри которого будет вызываться закрытый. Следующий пример — класс, имитирующий работу банкомата:
Private Function GetBalance(AccountNo As String) As Double
GetBalance = 10000000
End Function
Public Function DisplayAccountInfo(AccountNo As String, PIN As _
String) As Double
If AccountNo = "123456" And PIN = "5551289" Then
DisplayAccountlnfo = GetBalance(AccointNo)
End If
End Sub
Функция GetBalance объявлена закрытой, так как посторонним совершенно незачем знать о состоянии чужих счетов. Только представьте себе, как много друзей у вас появится, когда все узнают о вашем счете в 10 миллионов долларов! Чтобы ограничить доступ к информации, пользователь должен пройти через процедуру DisplayAccountlnfo. В этой процедуре перед получением информации о состоянии счета проверяются номер счета и личный идентификатор (PIN).
Свойства
Как вы узнали из урока 3, свойства — это переменные, предназначенные для получения и возвращения данных классов. Свойства, как и методы, бывают закрытыми и открытыми. Открытые свойства могут использоваться процедурами, находящимися вне области видимости данного класса. Открытые свойства образуют часть интерфейса класса. Закрытые свойства используются для хранения информации, не входящей в интерфейс. Они предотвращают намеренное или случайное изменение данных, обеспечивающих нормальную работу класса. Эти данные можно получить только с помощью специальных функций открытого интерфейса. Работа со свойствами классов осуществляется при помощи операторов Property Get, Property Let и Property Set. Оператор Property Get образует открытый интерфейс для получения значений переменных класса, к которым программа не может обратиться напрямую. Оператор Property Let выполняет противоположную задачу — он позволяет задавать значения переменных класса. Оператор Property Set позволяет передать объект по ссылке. Такая возможность может пригодиться, если модуль класса должен напрямую работать с внешним элементом (в следующем примере будет показано, как это делается). Свойства также можно создавать, объявляя их открытыми в данном классе. Операторы Property Get и Property Let позволяют создать простейшую модель безопасности для свойств класса. Вернемся к нашему примеру с банкоматом. Там есть два хороших претендента на роль свойств — переменные AccountNo и PIN. Давайте переработаем наш класс так, чтобы вы могли задать нужные значения свойств и затем вызвать методы без всяких параметров. Например:
Public AccountNo As String
Public PINNo As String
Private Function GetBalanceO As Double
GetBalance = 10000000
End Function
Public Function DisplayAccountlnfo() As Double
If AccountNo = "123456" And PINNo = "5551289" Then
DisplayAccountlnfo = GetBalance()
End If
End Function
А вот как выглядит тот же фрагмент с использованием операторов Property Let и Property Get:
Private AcctNo As String
Private PINNo As String
Private Property Let AccountNo(x As String)
AcctNo = x
End Property
Public Property Let PIN(x As String)
PINNo = x
End Property
Private Function GetBalance() As Double
GetBalance = 10000000
End Function
Public Function DisplayAccountlnfo() As Double
If AccountNo = "123456" And PIN = "5551289" Then
DisplayAccountlnfo = GetBalance()
End If
End Function
ПОДСКАЗКАПользуйтесь ключевым словом Private, чтобы изолировать свойства и методы внутри классов. Тем самым вы защитите класс от некорректного обращения со стороны внешней программы. Делать открытыми (Public) следует лишь те свойства и методы, которые абсолютно необходимы для работы внешних программ.
События
События образуют самую интересную часть модели класса. Они позволяют классу обмениваться информацией с приложением при соблюдении определенных условий. Говорят, что программа управляется событиями — это означает, что ее работа определяется возникающими событиями и не зависит от того, в какой мо-
мент выполняется то или иное условие. Приложение само сообщит вам об этом, инициируя событие.
Все стандартные процедуры, отображаемые в окне программы, относятся к событиям. Например, процедура Form_Load является событием.
Для определения событий в классе используются ключевые слова Public Event в секции (General)(Declarations) модуля. Синтаксис выглядит следующим образом:
Public Event EventName(napaметры)
Обратите внимание: в этой строке содержится лишь объявление события, а не его конкретная процедура. Для создания события в форме используется синтаксис следующего вида:
Private WithEvents x As ClassName
Например, строка
Private WithEvents p As Person
объявляет закрытый объект р, созданный на основе класса Person (человек). Если бы наш «человек» мог говорить, класс мог бы содержать событие Speak. При объявлении события главную роль играет ключевое слово WithEvents. Без него вы могли бы обращаться к открытым свойствам и методам класса, но не к его событиям.
Почему же событиям уделяется так много внимания? Потому что они избавляют ваше приложение от необходимости активного опроса данных. Активным опросом называется многократная проверка некоторой величины до тех пор, пока не будет выполнено определенное условие. Цикл активного опроса поглощает ресурсы процессора и замедляет работу программы. Благодаря событиям ваша программа может заняться решением других задач до того момента, пока не будет инициировано соответствующее событие.
Наше знакомство с основными концепциями классов подходит к концу. Формы, программные модули и элементы являются основными строительными блоками в приложениях, написанных на Visual Basic. Теперь давайте заглянем поглубже и посмотрим, как из этих блоков построить что-нибудь полезное.
ПРИМЕЧАНИЕИнтерфейс класса представляет собой сочетание открытых свойств, методов и событий. Они образуют ту часть класса, которая может взаимодействовать с оставшейся частью приложения. Можно провести аналогию с визуальным интерфейсом (например, интерфейсом окна) — визуальный интерфейс тоже является единственным средством, с помощью которого вы можете общаться с приложением.
Создание класса SmartForm
Следующий пример поможет вам лучше понять, как проектируются классы. Я использую класс SmartForm для хранения и получения информации о положении и размере форм на экране. Такие формы «запоминают» свое положение и состояние между запусками приложения. Когда все будет готово, вы можете включить этот класс в свою программную библиотеку и использовать его в будущих проектах!
1. Создайте новый проект командой File > New Project или сочетанием клавиш Ctrl+N.
2. В открывшемся диалоговом окне New Project выберите значок Standard EXE.
3. Включите в проект новый модуль класса — для этого щелкните правой кнопкой мыши в окне проекта и выберите команду Add > Class Module из контекстного меню.
4. В диалоговом окне Add Class Module выберите значок Class Module и нажмите кнопку Open.
5. В окне свойств задайте свойству Name созданного класса значение Smart Form.
6. Дважды щелкните на форме Smart Form в окне проекта, чтобы открыть для нее окно программы.
7. Вставьте следующий фрагмент в секцию (General) (Declarations) модуля класса:
Option Explicit
‘Закрытые переменные
Private mForm As Object
Private mLeft As Long
Private mTop As Long
Private mWidth As Long
Private mHeight As Long
Private mWS As Integer
Public Event ErrorMessage(Message As String)
Эти закрытые переменные относятся только к данному классу и недоступны за его пределами. Работать с ними можно только через интерфейс класса. Событие
ErrorMessage объявлено открытым (Public).
8. Добавьте в класс новое свойство командой Tools > Add Procedure.
9. Когда на экране появится диалоговое окно Add Procedure, введите в поле Name строку Form.
10. Установите переключатель Property и оставьте переключатель Scope в положении Public.
11. Завершите создание свойства кнопкой ОК. В программный модуль будут добавлены две процедуры событий: Public Property Get Form()и Public Property Let Form(ByVal vNewValue As Variant).
12. В строке
Property Let Form(ByVal vNewValue As Variant)
замените ключевое слово Let на Set. Строка примет следующий вид:
Property SetForm(ByVal vNewValue As Variant)
13. Вставьте следующую строку в процедуру Property Get Form():
Form = mForm
14. Вставьте следующую строку в процедуру Property Set Form...:
Set mForm = vNewValue
Поскольку в наших процедурах параметры имеют тип Variant, мы воспользуемся средствами поиска и замены IDE и заменим его типом Object.
15. Нажмите Ctrl+H, чтобы вызвать диалоговое окно поиска и замены текста.
16. Введите в поле Find What слово Variant.
17. Введите в поле Replace With слово Object.
18. Если бы поиск и замену требовалось выполнить во всем приложении, мы бы установили переключатель Current Project. Так как нас интересует только текущий модуль класса, установите переключатель Current Module.
19. Нажмите кнопку Replace All, чтобы заменить в данном модуле все типы Variant типами Object. В результате будут совершены две замены.
20. Закройте диалоговое окно кнопкой Cancel.
ПОДСКАЗКАСредства поиска и замены Visual Basic IDE играют чрезвычайно важную роль (впрочем, как и в любом текстовом редакторе), поэтому вам следует освоить их. Эти средства оказываются особенно полезными при изменении имен элементов в большом проекте.
21. Добавьте следующий метод в секцию (General)(Declarations):
Private Sub SaveSettings()
Dim mAppName As String
' Присвоить переменной имя ЕХЕ-файла
mAppName = App.EXEName
‘Информацию можно сохранить лишь при известном
' имени приложения и имени формы...
With mForm
If .Name <> "” Then
SaveSetting mAppName, .Name, _
"WindowState", Str$(.WindowState)
If .WindowState = vbNormal Then
SaveSetting mAppName, .Name, _
"Left", Str$(.Left)
SaveSetting mAppName, .Name, _
"Top", Str$(.Top)
SaveSetting mAppName, .Name, _
"Width", Str$(.Width)
SaveSetting mAppName, .Name, _
"Height", Str$(.Height)
End If
Else
' Инициировать событие ErrorMessage
RaiseEvent ErrorMessage("Необходимо задать " _
"объект формы!")
End If
End With
End Sub
Основная часть работы выполняется с помощью команды SaveSetting. Эта встроенная команда Visual Basic позволяет сохранить значения в системном реестре, не обращаясь к Windows API.
22. Добавьте следующий метод в секцию (General)(Declarations) класса:
Private Sub GetSettings()
Dim mAppName As String
‘Присвоить переменной имя ЕХЕ-файла
mAppName = App.EXEName
With mForm
If .Name <> "" Then
mLeft = Val(GetSetting(mAppName, _
.Name, "Left", .Left))
mTop = Val(GetSetting(mAppName, _
.Name, "Top", .Left))
mWidth = Val(GetSetting(mAppName, _
.Name, "Width", .Left))
mHeight = Val(GetSetting(mAppName, _
.Name, "Height", .Left))
‘Изменить размер формы
.WindowState = mWS
.Move mLeft, mTop, mWidth, mHeight
Else
‘Инициировать событие ErrorMessage
RaiseEvent ErrorMessage("Необходимо задать "
"объект формы!")
End If
End With
End Sub
Чтобы наш класс позволял изменять размеры форм, в секцию (General) (Declarations) модуля класса следует включить метод Resize:
Public Sub ResizeO
' Все, что от нас требуется -
' сохранить координаты формы
SaveSettings
End Sub
23. Вставьте следующий фрагменте секцию (General) (Form [Property Set]):
Public Property Set Form(ByVal vNewValue As Object)
‘Создать ссылку на реальный объект формы
Set mForm = vNewValue
‘Получить сохраненные координаты
GetSettings
‘Выполнить первое изменение размера
Resize
End Property
24. Остается лишь научить класс сохранять значения параметров и уничтожать ссылку при выгрузке объекта формы. Для этого в процедуру события Class_ Terminate() вставляется следующий фрагмент:
Private Sub Class_Terminate()
'Сохранить параметры формы
SaveSettings
'Уничтожить локальную ссылку на объект
Set mForm = Nothing
End Sub
25. Мы ввели довольно большой объем кода — настало время сохранить файл. Нажмите Ctrl+S, и когда на экране появится диалоговое окно Save As, укажите в поле Save In имя каталога своей программной библиотеки (если вы создали ее).
26. Нажмите кнопку Save, чтобы сохранить класс.
Поздравляю! Вы только что создали универсальный модуль класса. Этот модуль можно использовать в любых проектах, содержащих формы, а его подключение к формам требует минимального объема кода. Давайте посмотрим, как это делается:
1. Дважды щелкните на форме Form! в окне проекта, чтобы открыть окно программы для формы.
2. Вставьте следующую строку в секцию (General)(Declarations) формы:
Option Explicit
Private WithEvents sf As SmartForm
Как говорилось ранее, ключевое слово WithEvents сообщает Visual Basic о необходимости вывода событий класса в окне программы. В результате вы сможете выбрать sf из раскрывающегося списка Object в левом верхнем углу окна программы.
3. Перейдите к процедуре события ЕггоrMessage и вставьте в нее следующую строку:
Private Sub sf_ErrorMessage(Message As String)
MsgBox Message
End Sub
По команде MsgBox Visual Basic создает диалоговое окно сообщения для вывода информации. Переменная Message передается этой функции в качестве параметра.
4 Чтобы воспользоваться объектом класса SmartForm (sf), необходимо его создать. Иначе говоря, объект должен быть создан на базе шаблона, описанного в модуле класса. Для этого в процедуру события Form_Load() формы Form1 добавляется следующий фрагмент:
Private Sub Form_Load()
Set sf = New SmartForm
Set sf.Form = Me
End Sub
5. При изменении размеров формы нужно приказать объекту SmartForm запомнить размер и положение формы. Вставьте следующий фрагмент в процедуру события Form_Resize:
Private Sub Form_Resize()
sf.Resize
End Sub
6. Наконец, при закрытии формы следует уничтожить объект sf. Вставьте следующую строку в процедуру Form_Unload():
Private Sub Form_Unload(Cancel As Integer)
Set sf = Nothing
End Sub
7. Щелкните на строке Projectl в окне проекта и задайте свойству Name значение Проверка.
ВНИМАНИЕКаждый проект, в котором используется класс SmartForm, должен обладать уникальным именем. Дело в том, что формы идентифицируются по имени проекта. Если в нескольких одноименных проектах появятся одноименные формы, результат будет непредсказуемым.
Сохраните и запустите проект. На первый взгляд, наше приложение не производит особого впечатления. Попробуйте изменить размеры формы и сместить ее в угол экрана, после чего нажмите кнопку [х] и вернитесь в IDE. Запустите приложение заново. Если все было сделано верно, форма будет находиться в том же месте и иметь те же размеры, которые она имела на момент закрытия. Повторяя шаги 1—5, вы сможете пользоваться «интеллектуальными формами» в своих приложениях.
А теперь я расскажу об одном инструменте, который упрощает процесс визуального проектирования и создания классов.
Использование Class Builder
Когда я впервые трудился над созданием класса, меня преследовала мысль: «Должен существовать более простой путь!» К счастью для вас и для меня, он действительно существует. В комплект Visual Basic входит Class Builder — утилита для визуального проектирования классов. Class Builder (рис. 4.10) позволяет разработать структуру класса в графическом режиме и вставить основу кода в проект. Утилита Class Builder оформлена в виде надстройки (add-in). Это означает, что утилита не входит в стандартную конфигурацию IDE, а подключается как внешнее дополнение. Как видно из рис. 4.10, окно Class Builder напоминает окно проекта -слева находится иерархическое дерево, в основании которого находится текущее имя проекта. Строка меню, как и расположенная под ней панель инструментов, выглядит вполне стандартно. Мы рассмотрим работу с Class Builder на практическом примере:
1. Выполните команду Add-Ins > Ad-In Manager.
2. В открывшемся диалоговом окне Add-In Manager (рис. 4.11) дважды щелкните в строке VB Class Builder Utility, чтобы загрузить утилиту в IDE.
3. Закройте диалоговое окно кнопкой ОК.
Рис. 4.10. Утилита Class Builder
Рис. 4.11. Окно Add-In Manager
ПРИМЕЧАНИЕДополнительная информация о надстройках приведена в уроке 16, «Расширение IDE с помощью надстроек».
После того как утилита Class Builder будет добавлена в IDE, ею можно пользоваться для создания классов. В следующем примере Class Builder используется для создания простого класса Person. Несмотря на относительную простоту, этот класс наглядно показывает, как работать с этой полезной утилитой.
1. Создайте новый проект командой File > New Project. В диалоговом окне New Project выберите тип проекта Standard EXE и нажмите кнопку ОК.
2. Запустите Class Builder командой Add-Ins > Class Builder Utility.
3. Создайте новый класс командой File > New > Class из меню Class Builder. На экране появляется диалоговое окно Class Module Builder.
4. Введите имя класса Person в поле Name. В списке Based On оставьте выбранное по умолчанию значение (New Class). Нажмите кнопку ОК, чтобы создать класс.
5. Нажмите кнопку Add New Property to Current Class на панели инструментов. На экране появляется диалоговое окно Property Builder (рис. 4.12).
6. Введите в поле Name строку PersonName. В этом примере данное свойство будет использовано для идентификации объектов класса.
7. Выберите строку String в списке Data Type.
8. Оставьте установленным переключатель Public Property (Let Get Set). Чтобы свойство входило в интерфейс класса, оно должно быть открытым (Public).
9. Нажмите кнопку ОК, чтобы завершить создание свойства.
Рис. 4.12. Диалоговое окно Property Builder
10. Создайте новое событие в классе Person — для этого нажмите кнопку Add New Event to Current Class на панели инструментов (кнопка с изображением желтой молнии). На экране появляется диалоговое окно Event Builder (рис. 4.13).
Рис. 4.13. Диалоговое окно Event Builder
11. Введите строку Say в поле Name. Наш «человек» (Person) действительно «заговорит»!
12. Для события нужно создать параметр, чтобы «человек» знал, что он должен сказать. Нажмите кнопку Add a New Argument (кнопка со знаком «плюс»).
13. На экране появляется очередное диалоговое окно. В нем вам предлагается ввести имя параметра. Введите строку Sentence в поле Name.
14. Выберите в списке Data Type строку String и закройте диалоговое окно кнопкой ОК.
15. Закройте диалоговое окно Event Builder кнопкой ОК. В классе Person появляется событие Say.
16. Добавьте в класс Person метод WhoAreYou. Он не имеет параметров.
17. Нажмите кнопку ОК, чтобы включить метод в класс. Окно Class Builder должно выглядеть так, как показано на рис. 4.14.
Рис. 4.14. Класс Person со свойствами, событиями и методами
18. Базовая структура класса Person готова. Включите ее в проект Visual Basic командой File > Update Project или клавишами Ctrl+S.
19. Закройте окно Class Builder командой File > Exit.
После небольшой паузы в проекте появляется новый класс. Остается лишь добавить код в базовую структуру, чтобы сделать его функциональным. Если заглянуть в код свойства PersonName (процедуры Property Let и Property Get), выясняется, что Class Builder сгенерировал шаблон свойства за нас. Остается лишь написать код, который будет выполнять конкретную задачу — идентифицировать нашего «человека».
Вставьте следующий фрагмент в процедуру WhoAreYou():
Public Sub WhoAreYou()
RaiseEvent Say ("Moe имя" & mVarPersonName)
End Sub
Обратите внимание: вся процедура состоит из одной строки. Чтобы инициировать событие, необходимо вызвать в классе команду RaiseEvent. В нашем случае инициируется событие Say. Для передачи информации можно было также воспользоваться функцией, но я хочу приучить вас к работе с событиями. Они пригодятся вам позднее, при разработке приложений, управляемых событиями. А сейчас мы дополним форму Form1 кодом для тестирования класса Person:
1. Дважды щелкните на строке Form1 в окне проекта, чтобы активизировать форму. Затем дважды щелкните на форме, чтобы открыть окно программы.
2. Вставьте следующий фрагмент в секцию (General)(Declarations) формы:
Option Explicit
Private WithEvents p As Person
3. Для вывода информации мы воспользуемся окном сообщения. Вставьте в процедуру события р_Sау() следующий фрагмент:
Private Sub p_Say(Sentence As String)
MsgBox Sentence
End Sub
4. Остается лишь написать код, в котором будет создаваться наш объект:
Private Sub Form_Load()
Set p = New Person
p.PersonName = "Джон Доу"
p.WhoAreYou
Set p = Nothing
End
End Sub
Конечно, переменной р. PersonName можно присвоить произвольное имя.
5. Запустите программу клавишей F5.
Конечно, утилита Class Builder обладает и другими возможностями, однако большинство из них не требуют объяснений, а самые важные мы рассмотрели. Не жалейте времени и поэкспериментируйте с вашими собственными классами — как простыми, так и сложными. Практика — верный путь к совершенству. На страницах этой книги мы еще неоднократно встретимся с классами. Ваших познаний в области модулей и классов вполне хватит для самостоятельной работы. Вы должны непременно освоить эти концепции, поскольку программные модули «склеивают» разные части вашего приложения и объединяют формы и элементы для решения полезных задач. Но даже если вы чувствуете себя несколько неуверенно, не волнуйтесь. Классы и объекты подробно рассматриваются в уроке 15, «Объектно-ориентированное программирование (ООП)».
Что нового мы узнали?
В этом уроке мы научились:
Пользоваться модулями для создания кода форм и элементов.
Создавать собственные процедуры и функции.
Передавать параметры процедурам и функциям.
Проектировать простейшие классы.
Открывать свойства и методы при помощи ключевого слова Public.
Изолировать свойства и методы при помощи ключевого слова Private.
Создавать модули классов.
Создавать классы с помощью утилиты Class Builder.
УРОК 5
Создание
И использование
Меню и панелей
Инструментов
Для чего нужны меню и панели инструментов
Создание и использование меню
Работа с редактором меню
Проектирование структуры меню
Создание панелей инструментов
Использование нестандартных элементов в панелях инструментов
Изображения и списки изображений
Усовершенствованные панели
В большинстве Windows-программ пользователи могут выполнять необходимые действия с помощью меню и панелей инструментов. Поскольку эти компоненты являются неотъемлемой частью многих приложений, в этой главе подробно рассматривается процесс их создания и использования.