Файл: Освой самостоятельно программирование для MS Access 2002 за 24 часа [П.Киммел].pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 21.10.2020
Просмотров: 7877
Скачиваний: 25

ние требуемого типа, а
Let имеет структуру процедуры, которой пере-
даются аргументы.) Строка 22 демонстрирует, как данные, которые предполагается при-
своить переменной FEmailAddress, подвергаются незаметной для пользователя провер-
ке. Следующая строка иллюстрирует возможную операцию присваивания:
=
В этот момент выполняется код строки 22, вызывающей процедуру ValidateE-
которой передается значение параметра
(Обратите внимание, что процедура ValidateEmailAddress объявлена выше, в стро-
ках
как скрытый (Private) член класса.) Если результат проверки успешен, в
строке 23 значение присваивается внутренней переменной FEmailAddress.
Методы Property, будучи простыми в использовании, предоставляют широкие
возможности управления данными. Вы можете построить только те конструкции про-
верки, которые отвечают природе конкретного элемента данных, и сосредоточить их
компактно, внутри соответствующего метода Property.
Еще одно преимущество механизма обращения к свойствам класса посредством
методов Property состоит в том, что они позволяют ограничить круг возможных опе-
раций, выполняемых со свойством. Например, чтобы обеспечить доступ к переменной
только по чтению, достаточно просто "забыть" об определении соответствующего ме-
тода Let. Если же необходимо, чтобы пользователь, наоборот, мог только присваивать
значения, но не считывать их, следует отказаться от построения метода Get. Создавая
класс, объявляйте все свойства с помощью
Private, а для доступа к
ним предлагайте пары соответствующих методов Get и Let. Концепция методов
Property весьма эффективна, и именно благодаря ей получили развитие средства ви-
зуального программирования и быстрой разработки приложений.
Использование свойств объектов
Среди свойств классов могут быть как переменные простых типов, так и объекты
других классов. Конструкция объявления метода Property, используемого для чтения
содержимого переменной простого типа или объекта, снабжается служебным словом
Get. При создании Property-методов, предназначенных для присваивания значений
свойствам простых типов, используется служебное слово Let. Но его нельзя употреб-
лять, если речь идет о свойстве, представляющем собой объект класса. В этом случае
применяется служебное слово Set.
Таким образом, Set заменяет Let в тех случаях, когда в качестве свойства исполь-
зуется объект класса. Например, чтобы построить несколько Property-методов для
доступа к свойству, представляющему собой объект класса Collection, следует упот-
ребить служебные слова Get и Set.
Статические свойства
Создавая класс, вы определяете пользовательский тип. Построив экземпляр класса,
вы получаете объект этого типа. Каждый объект обладает собственным набором всех
элементов данных (свойств) и методов класса. Поэтому для двух объектов класса Con-
tact — скажем, MyContact и
— выражения
и YourCon-
tact
будут ссылаться, как правило, на два совершенно разных элемента данных.
Разница между классами и объектами примерно такая же, как между и
клонами. ДНК — это набор генов, а каждый отдельный набор генов —
это клон. Класс — это ДНК, а объект — клон.
390 Часть VIII. Объектно-ориентированное программирование в Access

Статические члены класса отличаются от остальных и периодом "жизни". Обыч-
ные свойства и методы доступны только после создания объектов класса и исключи-
тельно в контексте последних. Но к статическим членам класса разрешается обра-
щаться и в отсутствие объектов. Листинг 21.6 демонстрирует пример использования
статического члена класса.
Листинг 21.6. Пример объявления и использования статического члена класса
1: Static Property Get
) As Integer
2: Dim ID As Integer
ID
= ID + 1
4:
= ID
5 : End Property
При каждом выполнении программы, содержащей данный код, значение
переменной ID увеличивается на 1. Это значение хранится в период
между обращениями к
Статические атрибуты класса допускают самое разнообразное применение и ока-
зываются довольно необходимыми, например, для хранения уникальных идентифика-
торов
базы данных или экземпляров класса.
Используйте
Static на уровне свойства, когда требуется, чтобы все
переменные свойства были статическими.
Обработчики событий создания
и удаления объекта
В каждом классе содержатся две предопределенные процедуры, которые можно ис-
пользовать для задания последовательности действий, выполняемых в ответ на события
инициализации и удаления объекта. Процедура инициализации обрабатывает событие
создания объекта, а код обработчика события удаления объекта вызывается, когда пере-
менной-объекту присваивается значение Nothing. Эти процедуры срабатывают только в
том
если в них содержится какой-либо код. Явно вызывать их не следует.
Подпрограммы обработки событий создания и удаления объекта носят стандарт-
ные названия
и
Чтобы получить возможность
создания кода любой из них, выполните следующие действия.
1. Откройте окно редактора Microsoft Visual Basic.
2. Выберите существующий или создайте новый модуль класса.
3. Откройте список Object, расположенный в левой верхней части окна (в нем изна-
чально отображается слово
и выберите элемент Class (рис. 21.1).
4. Откройте список Procedure, находящийся в правой верхней части окна
(см. рис. 21.1), и выберите один из элементов — Initialize или Terminate — в зависи-
мости от того, обработкой какого события, создания объекта либо его удаления вы
намерены заниматься.
В результате выполнения указанной инструкции вы получите пустой шаблон обработ-
чика. Остается самая малость — наполнить его. Процедура
— как раз
то место, где удобно расположить фрагмент кода, который должен выполняться в момент
создания объекта, срабатывать раньше других блоков кода и/или действовать только один
раз. Код процедуры
выполняется в последнюю очередь, непосредствен-
но перед удалением объекта из памяти. Естественно, он также срабатывает один раз.
час. Основы программирования классов
391

•
a Mi
3
I
fts
а
If
> 0} Then
- I
Sab
Sab
String)
1000,
End Sab
Окно редактора
Basic позволяет быстро составить шаблоны
системных событий создания и удаления объектов класса
Названия рассмотренных именованных блоков кода достаточно
— про-
цедура
удобна для выполнения некоторых операций инициализа-
ции, например открытие баз данных или иных файлов; а обработчик
class_Terminate — как раз то место, где имеет смысл располагать директивы закры-
тия баз данных, файлов и т.п. Пример использования процедуры
содержится в листинге 21.7, приведенном в
разделе.
Создание нового класса
Натоящий раздел посвящен рассмотрению примера построения реального и — с
моей точки зрения — полезного. Класс, которому дано название FileStream, реали-
зует механизм файлового потокового ввода-вывода. Методы класса обеспечивают ин-
терфейс, удобный для выполнения операций открытия и закрытия файлов, чтения и
записи текстовых данных, перемещения к заданной позиции внутри файла. Лис-
тинг 21.7 содержит полное определение класса FileStream.
Листинг 21.7. Класс, реализующий операции файлового потокового
Option Compare Database
'
-- Defines a
streaming class
' Copyright © 1999. All Rights Reserved.
' By Software Conceptions, Inc.
Written by Paul
Okemos, MI USA 800-471-5890
Option Explicit
392
Часть VIII. Объектно-ориентированное программирование в Access

7: Private FFileName As String
Private FHandle As Double
9: Private Type Buffer
10: S As String
Type
Property Get
) As Long
Count = FileLen( FileName )
Property
Property Get
) As String
16: FileName = FFileName
Property
Property Let
Value As String )
19: FFileName = Value
Property
Property Get
) As Double
22: Handle = FHandle
Property
Property Get
) As Long
25: Position =
FHandle )
Property
Property Let
ByVal Value As Long )
Call
Value )
Property
Private Sub
ByVal FileName As String )
31: If (FileExists( FileName ) = False) Then
32:
1, Me, "Invalid filename
& FileName
33: End If
Sub
Sub
)
FHandle = 0
Sub
Sub
)
39: Close
40: FHandle = 0
Sub
Function
FileName As
As Boolean
43: FileExists =
FileName ) ) > 0
Function
Sub OpenStream( ByVal FileName As String )
46: FFileName = FileName
FHandle = FreeFile
48: Open FileName For Random As
Len = 1
End Sub
Sub
Str As String, ByVal Length As Long)
51: Dim I As Integer
52: Dim Buf As Buffer
For I = 1 To Length
54: Get
, Buf
55: Str = Str +
56: Next I
Sub
Sub
ByVal Length As Long )
59: On Error GoTo EXCEPT
60: Seek
Length
61: Exit Sub
63: If (Length = 0) Then Resume Next
час. Основы программирования классов 393

64:
Sub
Sub
Str As String )
Dim I As Long
68: Dim Buf As B u f f e r
69: For I = 1 To Len( Str )
70:
=
Str, I, 1 )
71: Put
, Buf
72: Next I
Sub
Класс
содержит определения всех методов, необходимых для
выполнения операций чтения и записи файловых данных. Класс содержит
четыре свойства: Count,
Handle и Position. Handle и Count —
это переменные, которые позволяют только чтение, а также предназначены
для хранения номера открытого файла и счетчика символов соответственно.
FileName — имя файла, a Position — текущее значение позиции внутри
файла, относительно которой будет выполняться очередная операция чтения
или записи данных. Property-метод Position позволяет свободно переме-
щаться внутри файла при считывании/записи информации.
В составе класса определено восемь методов: CheckFile, Class_Initialize,
FileExists, OpenStream,
и
Check-
File — это внутренняя процедура, в отсутствие файла открывающая окно сообщения об
ошибке. Обработчик
выполняет инициализацию переменной FHan-
предназначенной для хранения номера открытого файла. Метод CloseStream за-
крывает файл, заданный номером FHandle. FileExists обеспечивает непосредственное
выполнение проверки существования файла. Процедура OpenStream, получающая имя
файла, сохраняет его во внутренней переменной и открывает файл в режиме Random.
Метод ReadStream используется для чтения указанного числа символов, начиная с те-
кущей позиции в файле. Процедура SeekStream дает возможность переместить указа-
тель позиции в файле на заданное число символов относительно текущего положения.
Метод WriteStream осуществляет вывод данных в файловый поток.
Применяемые в совокупности, перечисленные выше методы позволяют комплекс-
но решать задачи управления файловым вводом-выводом. Листинг 21.8 демонстрирует
пример практического использования класса FileStream.
Листинг 21.8. Пример использования класса FileStream
Sub
)
2: Dim Stream As New FileStream
3: Call
)
4: Call
"Это тестовый пример" )
5: Call
Set Stream
Nothing
7 : End Sub
[ Строка 2 листинга 21.8 содержит конструкцию объявления и создания объ-
I
Stream класса FileStream; при этом срабатывает процедура
Class_Initialize. При выполнении строки 3 открывается файл с име-
нем
Команда строки 4 осуществляет запись данных в файл, а в
строке 5 файл закрывается. Строка 6 содержит директиву удаления объекта
394
Часть VIII. Объектно-ориентированное программирование в Access