Файл: Е.А. Бессонов Access. Пользовательские объекты.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 31.05.2024

Просмотров: 31

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

10

If Ubound(varText) > Lbound(varText) Then strTag = varText(Lbound(varText)) strValue = varText(Ubound(varText)) Call Add(strTag, strValue)

End If Next i

End Property

Процедура устанавливает (записывает) свойство Text объекта Теги. Параметр Value –строка, содержащая теги с разделителями mstrSeparator. Встроенная функция Split преобразует строку в массив varItems, в котором каждый элемент массива содержит один тег.

Цикл For перебирает все элементы массива с индексами от нижнего Lbound до верхнего Ubound. В теле цикла очередной элемент массива разделяется на левую часть (уникальный идентификатор Tag) и правую (относительно знака mstrSeparator) – свойство Value (значение).

Если хотя бы один разделитель mstrSeparator в аргументе есть,

выполняется условие Ubound(varText) > Lbound(varText). В этом случае формируется очередной тег. Сначала в переменные strTag и strValue записываются соответственно левая и правая части тега. Затем вызывается функция Add, которая добавляет сформированный тег в коллекцию mcolItems.

Public Property Get Text() As String Dim t As Тег

Dim strOut As String For Each t in mcolItems

If Len(t.Tag) > 0 Then

strOut = strOut & mstrSeparator & t.Tag & “=” & t.Value

End If Next t

If Len(strOut) > Len(mstrSeparator) Then

strOut = Mid$(strOut, Len(mstrSeparator) + 1) End If

Text = strOut End Property

Процедура читает свойство Text объекта Теги. Вначале инструкция Dim объявляет переменную t как объект типа Тег со свойствами Tag и Value, но не имеющий методов. Следующая инструкция объ-

11

являет строковую переменную strOut, в которой формируется результат.

Цикл For Each обрабатывает каждый тег. Если очередной тег непуст (Len(t.Tag) > 0), то к результату добавляется разделитель, свойство Tag, знак “=” и свойство Value.

После выхода из цикла свойство Text сформировано, но первый символ–разделитель - лишний, и он из результата удаляется. Последняя инструкция присваивает сформированную строку результату процедуры.

Методы

Public Function Item(Tag As String) As String If Exists(Tag) Then

Item = mcolItems.Item(Tag).Value End If

End Function

Если тег с именем Tag существует, выполняется присваивание значения результату. В правой части инструкции присваивания используется метод Item объекта Collection. Получив имя тега, метод возвращает его значение Value или пустую строку, если имя тега не найдено.

Public Sub Remove(Tag As String) If Exists(Tag) Then

mcolItems.Remove Tag End If

End Sub

Процедура использует встроенный метод Remove объекта Collection. Чтобы предотвратить ошибку, предварительно проверяется, существует ли тег с именем Tag.

Public Function Add(Tag As String, Value As String) As Тег Dim t As Тег

Call Remove(Tag)

Set t = New Tag t.Tag = Tag t.Value = Value

mcolItems.Add t,Tag Set Add = t

End Function

Функции Add передаются параметры Tag (имя тега) и Value (зна-


12

чение тега). Вначале вызывается процедура из этого же модуля Remove для тега именем Tag, если он существует. Это сделано для того, чтобы имена тегов в свойстве Text были уникальны. Инструкция Set создает новый (New) объект типа Тег и присваивает ссылку на него объектной переменной t. Затем свойствам нового объекта Tag и Value присваиваются значения одноименных параметров функции.

Метод Add объекта Collection добавляет к переменной mcolItems тег (переменная t) с уникальным идентификатором Tag.

Объекты

Завершено создание двух объектов. Объект Тег имеет свойство Tag (имя) и Value (значение) строкового типа. Методов у объекта нет.

Объект Теги имеет свойства и методы.

Свойства

Count. Тип Long. Возвращает количество тегов в свойстве Text. Exists. Тип Boolean. Получив имя тега, возвращает True, если в свойстве Text имеется хотя бы один тег вида имя=значение. В противном случае возвращается False.

Separator. Тип String. Устанавливает или возвращает символ, разделяющий теги (по умолчанию “;”).

Text. Тип String. Устанавливает или возвращает набор тегов.

Методы

Add. Получив имя объектной переменной и уникальный идентификатор, включает объект в семейство.

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

Remove. Удаляет из свойства Text тег с именем, заданным в качестве параметра.

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

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

1.Visual Basic for Applications

2.Microsoft Access 9.0 Object Library

3.Microsoft DAO 3.6 Object Library

13

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

Откройте редактор VBA. Это можно сделать клавишами Alt+F11 или кнопкой Программы на панели инструментов. Выполните команду Tools|References (Сервис|Ссылки). В открывшемся диалоговом окне References (ссылки) будет представлен список библиотек. Найдите нужную библиотеку и установите ее флажок.

Тест

Для проверки работоспособности созданных объектов их следует тестировать. Сначала нужно разработать тест-программу и записать ее в стандартном модуле. Для тестирования объекта Теги применим процедуру Тест.

Public Sub Тест() Dim t As New Теги

t.Add “Город”, “Кемерово” T.Add “Область”, “Кемеровская” t.Add “Телефон”, “131313”

Debug.Print “Число тегов= ”, t.Count Debug.Print t.Text

Debug.Print t.Item(“Телефон”) Debug.Print t.Exists(“Город”) t.Remove “Область”

t.Text = “a=b;c=de” t.Separator = “!” Debug.Print t.Text Set t = Nothing End Sub

Процедура сначала создает новый экземпляр объекта Теги и устанавливает на него переменную t. Методом Add в свойство Text записываются три тега. Затем метод Print объекта Debug выводит в окно отладки число тегов Count и свойство Text. Метод Item по имени тега Телефон выводит номер телефона. Методом Exists отыскивается тег с именем Город, и в окно отладки посылается сообщение об успехе поиска. Тег Область удаляется из свойства Text и добавляются два новых тега. Разделитель заменяется на восклицательный знак. Обновленное значение свойства Text выводится в окно отладки, после чего экземпляр t уничтожается.


Форма frmПеренос

14

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

Тест

 

Число тегов=

3

Город=Кемерово;Область=Кемеровская;Телефон=131313 131313

True

Город=Кемерово!Телефон=131313!a=b!c=de

После тестирования объект готов к использованию.

Перенос значений полей в новые записи

В некоторых случаях требуется обеспечить перенос данных из полей существующей записи базы данных в соответствующие поля новой записи, создаваемой пользователем посредством формы. В Access такая возможность отсутствует, однако ее можно реализовать средствами Visual Basic. Для этого свойствам DefaultValue (значение по умолчанию) элементов управления, в которых отображаются переносимые поля, присваиваются значения полей текущей записи. В результате при создании новой записи значения свойств DefaultValue таких элементов управления автоматически помещаются в соответствующие поля новой записи. В случае необходимости нужно восстановить первоначальное значение свойства DefaultValue. Для хра-

нения первоначального значения свойства DefaultValue можно ис-

пользовать свойство Tag (дополнительные сведения).

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

справа от полей, являющихся претендентами на перенос значений в новые записи, расположены выключатели. Именами полей являются txtАдрес, txtГород и txtОбласть, а значениями по умолчанию - соот-

15

ветственно “ул. Мичурина”,”Кемерово” и “Кемеровская”.В свойства Tag переключателей помещены тексты “ctl=txtАдрес”, ”ctl=txtГород”, и “ctl=txtОбласть”, то есть теги вида ctl=ИмяПоля,. Левые части (имена тегов) одинаковы, но это не приводит к дублированию имен в свойстве Text, поскольку в каждый момент времени в свойстве Text содержится один такой тег, соответствующий нажатому выключателю.

. Свойство Нажатие кнопки всех выключателей содержит запись вида =Перенести([Form]). При нажатии любого выключателя запускается функция Перенести, и в качестве аргумента ей передается ссылка на форму frmПеренос. Процедура Перенести располагается в стандартном модуле.

Public Function Перенести(frm As Form) As Boolean Const k As String = “”””

Dim txt As Control Dim tgl As Control Dim t As Теги

Dim strName As String On Error GoTo Ошибка Set t = New Теги

Set tgl = Screen.ActiveControl t.Text = tgl.Tag

strName = t.Item(“ctl”) If Len(strName) > 0 Then

Set txt = frm(strName) If tgl.Value Then

t.Text = txt.Tag

t.Add “DefaultValue”, txt.DefaultValue txt.Tag = t.Text

txt.DefaultValue = k & txt.Value & k

Else

t.Text = txt.Tag

txt.DefaultValue = t.Item(“DefaultValue”)

End If End If

Перенести = True Выход:

On Error Resume Next


16

Exit Function

Ошибка:

Перенести = False

MsgBox “Ошибка ” & Err.Description & “(” & Err.Numder & “)” Resume Выход

End Function

Первая инструкция Set создает экземпляр объекта Теги и присваивает указатель на него объектной переменной t. Следующая инструкция Set обращается к свойству ActiveControl объекта Screen. Пусть для определенности нажат выключатель tglГород. В переменную tgl запишется ссылка на этот выключатель, т.к. именно он является активным элементом управления.

Извлекается свойство Tag активного выключателя (ctl=txtГород) и присваивается свойству Text объекта Теги. Далее по имени ctl с помощью метода Item объекта Теги извлекается значение txtГород. Это имя текстового поля, соответствующего нажатому выключателю. Если значение найдено (длина строки strName > 0), выполняются дальнейшие преобразования.

Объектной переменной txt присваивается ссылка на поле strName, которая в данный момент установлена на txtГород.

В условии инструкции If проверяется состояние нажатого выключателя. Если он находится в состоянии “Включено”, то его свойство Value не равно нулю, и выполняется ветвь If. В противном случае выполняется ветвь Else.

Если выключатель включен, то содержимое свойства Tag текстового поля добавляется в свойство Text. Если эта операция совершается впервые, то свойство Tag пусто, и свойство Text остается неизменным. В следующей инструкции методом Add в свойство Text добавляется тег с именем DefaultValue. В качестве значения тега используется свойство DefaultValue текстового поля (Кемерово).

Сформированное свойство Text запоминается в свойстве Tag текстового поля txtГород. Оно теперь будет служить для восстановления свойства DefaultValue, когда выключатель будет отжат.

Свойство DefaultValue текстового поля получает значение свойства Value поля текущей записи и становится для этого поля значением по умолчанию (например, «Белово»). Если теперь перейти в новую запись, в поле txtГород появится запись «Белово». Значение Value в правой части инструкции присваивания заключено в кавыч-

17

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

также наступает событие Click (нажатие кнопки), и запускается процедура Перенести. Теперь выполняется ветвь Else внутренней инструкции If.

Свойство Tag текстового поля (DefaultValue = Кемерово) добавляется к свойству Text. Метод Item извлекает значение тега (Кемерово) и присваивает его свойству DefaultValue текстового поля txtГород. Если теперь перейти к новой записи, в поле txtГород, появится текст “Кемерово”.

Реализация

Выше приведено описание примера, проверенного в MS Access 2002. С некоторыми изменениями пример можно реализовать и в других версиях. Наибольшие изменения потребует реализация в Access 2. Рассмотрим последовательность действий для этого случая.

1.Составить процедуру Split, которая разделяет строку на теги и размещает полученные теги в элементах массива.

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

нием Class_Initialize и Class_Terminate, которые разместить в модуле формы frmПеренос. Для того, чтобы эти процедуры запускались автоматически, нужно присвоить их имена событиям формы:

Загрузка Class_Initialize Отключение Class_Terminate

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

TextGet и TextLet.

4.Наиболее сложно реализовать объект Теги (семейство тегов). Для этого следует создать вспомогательную таблицу и использовать соответствующий объект TableDef, в который входит семейство Properties. Это семейство заменит семейство Collection, а объект Property – объект Тег.