|
Для свойств разрабатываемого класса можно использовать как открытые (общедоступные), так и закрытые переменные. В последнем случае для считывания и записи данных класса (закрытых свойств) используются процедуры с зарезервированными наименованиями Property Get и Property Let.
Использование в качестве свойств класса открытых переменных проще, чем закрытых, однако при этом не используются существенные преимущества закрытых переменных, поскольку невозможно будет осуществить контроль за тем, какие значения присваиваются свойсвам класса. Использование же закрытых переменных в качестве свойств класса позволяет полностью контролировать процесс присвоения данным объекта разрабатываемого класса их значений. При этом, в частности, можно указывать на недопустимые значения. Например, если вы разрабатываете класс, связанный с хранением и обработкой данных времени, то можно учесть, что переменные, хранящие значения часов, минут и секунд, не могут быть больше числа 60.
Объявим в модуле класса две закрытые переменные mStrWin (строка для хранения значения в Win-кодировке) и mStrDOS (строка для хранения значения в DOS-кодировке):
Private mStrWin As String
Private mStrDOS As String
Далее для каждой переменной создадим процедуры, предназначенные для чтения данных:
Public Property Get StrWin() As String
StrWin = mStrWin
End Property
Public Property Get StrDOS() As String
StrDOS = mStrDOS
End Property
Каждая из процедур возвращает значение соответствующей закрытой переменной. Например, если переменная A объявлена как WinDOS, то для выдачи ее свойства mStrWin в диалоговом окне функции MsgBox следует использовать оператор:
MsgBox A.StrWin
Процедуры Property Get должны быть немного сложнее, так как при присвоении какому-либо свойству значения мы сразу же будем изменять и второе свойство объекта, преобразуя его при помощи одной из функций CharToOemA или OemToCharA:
Public Property Let StrWin(ByVal StrWinNew As String)
Dim code As Long
mStrWin = StrWinNew
'перекодировка в DOS:
mStrDOS = Space(Len(mStrWin))
code = CharToOemA(mStrWin, mStrDOS)
End Property
Public Property Let StrDOS(ByVal StrDOSNew As String)
Dim code As Long
mStrDOS = StrDOSNew
'перекодировка в DOS:
mStrWin = Space(Len(mStrDOS))
code = OemToCharA(mStrDOS, mStrWin)
End Property
На этом содание простого класса заканчивается, и можно его тестировать. Создадим форму для тестирования нового класса:
Рис. 8.12.
Форма для тестирования класса WinDOS
Код модуля формы, представленный в листинге 8.7, обеспечивает ввод данных в текстовое окно Строка в Win-кодировке (верхнее текстовое окно) и при щелчке на кнопке Записать в DOS-окно (нижнее текстовое окно) выполняет код строк 8–9. Здесь свойству StrWin объекта Str1 присвается значение из верхнего текстового окна, а затем его свойство StrDOS выводится в нижнем текстовом окне. Можно анологичным образом вводить данные в нижнем окне, а перекодированную строку получать в верхнем.
Листинг 8.7. Код модуля формы для тестирования объекта класса WinDOS
1 'код модуля формы
3 Dim Str1 As WinDOS
5 Private Sub Command1_Click()
6 'записать значение свойства StrDOS в окно Text2
8 Str1.StrWin = Text1.Text
9 Text2.Text = Str1.StrDOS
11 End Sub
13 Private Sub Command2_Click()
14 'записать значение свойства StrWin в окно Text1
16 Str1.StrDOS = Text2.Text
17 Text1.Text = Str1.StrWin
19 End Sub
21 Private Sub Form_Load()
23 'создать объект WinDOS:
24 Set Str1 = New WinDOS
26 End Sub
На рис.8.13 приведен фрагмент работы с формой, предназначенной для тестирования класса WinDOS.
Рис. 8.13.
Фрагмент работы с формой, предназначенной для тестирования класса WinDOS
Функции Property Get и Property Let могут вообще не использоваться в классе, могут только возвращать или устанавливать значения закрытых данных, а могут нести еще б о льшую нагрузку, чем та, которую выполняют представленные здесь функции Property Let (не только устанавливают значение одной из закрытых переменных, но и используют функции перекодирования для другой переменной). Например, можно ограничить длины используемых строк и без «лишнего шума» отбрасывать лишние символы, как это показано в листинге 8.8.
Листинг 8.8. Модифицированный код модуля класса WinDOS
1 'код модуля класса
3 Option Explicit
5 Private mStrWin As String 'строка в Win-кодировке
6 Private mStrDOS As String 'строка в DOS-кодировке
7 Const mMaxLen = 10 'максимальная длина строки
9 Public Property Get StrWin() As String
10 StrWin = mStrWin
11 End Property
13 Public Property Get StrDOS() As String
14 StrDOS = mStrDOS
15 End Property
18 Public Property Let StrWin(ByVal StrWinNew As String)
19 Dim code As Long
20 '”бесшумное” отбрасывание “лишних” символов:
21 mStrWin = Mid(Trim(StrWinNew), 1, mMaxLen)
22 'перекодировка в DOS:
23 mStrDOS = Space(Len(mStrWin))
24 code = CharToOemA(mStrWin, mStrDOS)
26 End Property
29 Public Property Let StrDOS(ByVal StrDOSNew As String)
30 Dim code As Long
31 '”бесшумное” отбрасывание “лишних” символов:
32 mStrDOS = Mid(Trim(StrDOSNew), 1, mMaxLen)
33 'перекодировка в DOS:
34 mStrWin = Space(Len(mStrDOS))
35 code = OemToCharA(mStrDOS, mStrWin)
37 End Property
В общем случае класс, конечно, может состоять не только из функций Property Get и Property Let. Вы можете создавать для классов столько функций (процедур) обработки данных класса, сколько это необходимо для эффективного использования объектов, построенных на базе класса.
Поскольку автор книги не считает Visual Basic одной из лучших систем для разработки объектно-ориентированных приложений, на этом тема создания классов пользователя завершается, но вы можете найти в другой литературе довольно обширные сведения по данному вопросу, в том числе и по созданию коллекций и классов коллекций.
[1] Когда имя DLL-файла заканчивается цифрами 32, это означает, что DLL содержит 32-разрядный код. Каждый раз, когда у вас есть выбор, вы должны использовать в своем VB-коде 32-разрядные версии любой библиотеки DLL.
Дата добавления: 2015-09-12; просмотров: 10 | Поможем написать вашу работу | Нарушение авторских прав |