Visual Basic 6. Руководство разработчика

       

Реализация семейства


Для реализации общедоступного семейства в разрабатываемом компоненте, в объекте 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


Содержание раздела