Реализация семейства
Для реализации общедоступного семейства в разрабатываемом компоненте, в объекте Collection надо создать следующие свойства и методы.
• Метод Add. Добавляет новый элемент в семейство.
• Метод Remove. Удаляет элемент из семейства.
• Метод Clear. Удаляет все элементы из семейства.
• Свойство Count. Возвращает количество элементов в семействе.
• Свойство Item. Возвращает заданный элемент семейства.
Чтобы сделать это, вставьте следующее объявление семейства в окне Code модуля класса.
Dim DataCollection As New Collection
Data Collection —
это новая переменная которая может содержать несколько элементов. Затем вставьте определения следующих свойств и методов чтобы разработчик мог управлять семейством (добавлять и удалять элементы из семейства нумеровать их и отыскивать выделенные элементы по их ключу). Свойство Count класса возвращает значение свойства Count семейства.
Программа 15.7. Свойство Count переменной DataCollection
Public Property Get Count() As Long
Count = DataCollection.Count
End Property
Метод Add — это общедоступная функция, которая возвращает значение True, если ее аргументы успешно добавлены в семейство Если при выполнении возни кают ошибки, то метод возвращает False.
Программа 15.8. Метод Add переменной DataCollection
Public Function Add(dValue As Double) As Boolean
On Error GoTo AddError
DataCollection.Add dValue
Add = True
Exit Function
AddError:
Add = False
End Function
Метод Remove — также функция, возвращающая результат типа Boolean. Функция возвращает True, если указанный элемент успешно удален из списка. Кроме того, она генерирует прерывание ошибок выполнения, которое главное приложение может обработать с помощью оператора On Error. Заметьте, что оператор Err.Raise в программном коде 15.9 инициирует ошибку выполнения с номером и ее описанием (обязательно надо добавить константу vbObjectError, чтобы избежать конфликтов со стандартным сообщением об ошибке). Поскольку приложение использует класс — он будет получать стандартную ошибку Visual Basic. Заметьте, что Visual Basic может инициировать свою собственную ошибку 1. Но ошибка 1 существует только для нашего класса, вот почему была добавлена константа vbObjectError.
Программа 15.9. Метод Remove переменной DataCollection
Public Function Remove(index As Long) As Boolean
If index < 0 Or index > DataCollection.Count Then
DataCollection.Remove index
Remove = True
Else
Err Raise vbObiectError + 2, "ClassName", _
"Couldn't remove item"
(... элемент удалить нельзя)
Remove = False
End If
End Function
Синтаксис метода Raise для объекта Err:
Err.Raise number, source, description
где source — имя компонента, в котором появляется ошибка (возможно, что несколько компонентов инициируют одинаковую ошибку). Основное приложение должно знать одновременно номер и источник ошибки, а затем предпринять соответствующие действия (т.е. устранить причину, которая инициировала ошибку или повторить операцию).
Метод Item выбирает указанный элемент из семейства, основываясь на индексе, который служит аргументом. Если индекс выходит за границы семейства, возникает ошибка 2 выполнения.
Программа 15.10. Метод Item переменной DataCollection
Public Function Itemfindex As Long) As Double
If index < 0 Or index > DataCollection.Count Then
Err.Raise vbObjectError + 1, "ClassName", _
"Index out of bounds"
'(Индекс вышел за пределы границ массива)
Else
Item = DataCollection(index)
End If
End Function
Последний метод (Clear) удаляет все элементы из семейства. Поскольку семейство не имеет собственного метода Clear, необходимо удалить все элементы из семей ства с помощью его метода Remove. Заметьте, что обход семейства осуществляет из конца в начало. Прямой обход может вызвать ошибку исполнения, поскольку сразу после удаления первого элемента свойство DataCollection Count становится меньше на единицу, но это изменение не влияет на число итераций.
Программа 15.11. Метод Clear переменной DataCollection
Public Function Clear() As Boolean
On Error GoTo ClearError
For i = DataCollection.Count To 1 Step -1
DataCollection Remove i
Next
Clear = True
Exit Function
]
ClearError:
Clear = False
End Function
VB6 в действии: класс AXStat
Проект класса AXStat демонстрирует процесс создания классов, которые предоставляют семейства. Класс AXStat предоставляет члены стандартного семейства и следующие специальные члены.
• Свойство Average. Возвращает среднее значение из набора данных, который хранится в элементе управления.
• Свойство Min. Возвращает минимальное значение из набора данных.
• Свойство Мах. Возвращает максимальное значение из набора данных.
Специальные свойства достаточно просты и их реализация показана ниже.
Программа 15.12. Специальные члены класса AXStat
Public Property Get Average() As Double
Dim dSum As Double
Dim itm As Long
For itm = 1 To DataCollection.Count
dSum = dSum + DataCollection(itm)
Next
Average =
dSuiti / DataCollection.Count
End Property
Public Property Get Min () As Double
Dim itm As Long
Min = 1E+202
For itm = 1 To DataCollection.Count
If DataCollection(itm) < Min Then _
Min = DataCollection(itm)
Next
End Property
Public Property Get Max() As Double
Dim itm As Long
Max =
-1E+202
For itm =
1 To DataCollection.Count
If DataCollection(itm) > Max Then _
Max = DataCollection(itm)
Next
End Property
Этот код считывает значения данных, которые хранятся в семействе DataCollection, и вычисляет их базовую статистику. Можно использовать процедуру Property Get, чтобы получить более полную статистику, чем показана здесь. Заметьте, что свойства предназначены только для чтения (не имеет смысла устанавливать их значения) и не определены дуальные процедуры Property Let.
Код, который реализует стандартные методы семейства, подобен коду, приведенному ранее в разделе "Реализация семейства". Достаточно просто изменить имя класса в строке, которая инициирует ошибки исполнения.
Тестирование класса AXStat. Тестовый проект для класса AXStat показан на рис. 15.7. Кнопка Create Data Set (Создать набор данных) добавляет 100 случайных чисел к семейству класса. Кнопка Display Data (Отобразить данные) берет данные из класса и показывает их в окне списка. И, наконец, кнопка Show Statistics (Показать статистику) вызывает методы класса для вычисления основных статистических характеристик набора данных и их отображения. Кнопки справа демонстрируют способ обработки ошибок, инициируемых в классе (но к ним вернемся позже).
Для использования класса AXStat в проекте необходимо сначала добавить в проекте ссылку на класс, а затем создать объектную переменную, соответствующую классу. Следующее объявление должно появиться в самом начале окна кода тестовой формы:
Dim STATS As New Statistics
Ключевое слово New
говорит Visual Basic, что необходимо создать новый экземпляр модуля класса Statistics. Первая командная кнопка использует метод Add переменной STATS для создания набора данных из 100 значений.
Программа 15.13. Заполнение объекта STATS случайными данными
Private Sub Command1_C1ick()
List1.Clear
STATS.Clear
For i = 1 То 100
STATS.Add Rnd() * 1000
Next
Command2.Enabled = True
Command3.Enabled = True
End Sub
Рис. 15.7. Тестовая форма класса AXStat
Кнопка Display Data извлекает данные из переменной STATS с помощью метода Item. Значения данных формируются в цикле, который работает в диапазоне от 1 до STATS.Count.
Программа 15.14. Чтение данных из объекта STATS
Private Sub Command2_Click()
Dim i As Long
List1.Clear
For i = 1 To STATS.Count
List1.AddItem Format(STATS.Item(i), "000.000000")
Next
End Sub
Кнопка Show Statistics вызывает методы Average, Min и Мах переменной для вычисления основных статистических характеристик набора данных. Код, соответствующий кнопке Show Statistics, приведен ниже.
Программа 15.15. Использование класса AXStat для вычисления статистических характеристик
Private Sub Command3_Click()
StatsMsg = "There are " & STATS.Count & _
" points in the data set" & vbCrLf
' (В наборе присутствуют ... элементов данных)
StatsMsg = StatsMsg & "Their average is" & _
STATS.Average & vbCrLf
' (Их среднее значение. .)
StatsMsg = StatsMsg & "The smallest value" & STATS.Mm & vbCrLf
'(Минимальное значение...)
StatsMsg = StatsMsg & "The largest value"& STATS.Max
'(Максимальное значение...)
MsgBox StatsMsg
End Sub