В стандартной поставке VB 6.0 есть один интересный ActiveX Control – DataRepeater. Он предназначен для отображения содержимого баз данных. А интересный он тем, что для работы ему нужен … другой ActiveX Control.
Чтобы разобраться, как он работает, давайте создадим приложение с его использованием. За основу возьмем один из файлов Архива конференций на сайте vbrussian.com (статья писалась специально для этого сайта). Итак:
Шаг 1. Создайте новый проект Standard EXE.
Name=BaseView
Изменим некоторые параметры формы:
Name=frmMain
Caption=" Конференция RU.Visual.Basic"
Height=6465
StartUpPosition=2
(CenterScreen)
Width=9000
Откроем диалоговое окно существующих контролов через меню Project/Components… и выберем Microsoft ADO Data Control и Microsoft DataRepeater Control. Нажмем кнопку Закрыть.
Расположим на форме контрол ADO:
Name=Adodc1
Align=2 (vbAlignBottom)
Подключим наш файл базы данных к этому контролу:
В окне свойств ADO выберите свойство ConnectionString и дважды щелкните на нем мышкой. В окне подключения выберите опцию Use Connection String и нажмите кнопку Build (построить). Под ярлыком "Поставщик услуг" выберите Microsoft Jet 3.51 OLE DB Provider. Перещелкнитесь на ярлык "Подключение" и под пунктом 1. Выберите или введите имя базы данных, укажите путь к нашей базе. В данном примере мы поместим базу данных в той же директории, что и программа (хотя это не обязательно). Обязательно нажмите кнопку внизу "Проверить подключение". В случае ошибок будет выдана соответствующая информация. Нажмите кнопку ОК. Теперь в поле Use Connection String у Вас должна быть запись наподобие следующей: Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=C:\BaseView\VbRU_5_00.mdb (путь к базе данных, естественно, у Вас будет другой). Нажмите кнопку ОК, и данная запись появится в окне свойств.
Перейдем к свойству RecordSource. Зная структуру нашей базы данных (а кто не знает – может посмотреть через Access или VisData), составим SQL-запрос. В нашем случае он выглядит так: SELECT * FROM MsgHeader, MsgBody WHERE MsgHeader.MSGID=MsgBody.MsgID
NB! Мы "жестко" привязали базу данных к конкретному пути. Позже мы исправим это.
Теперь расположим на форме DataRepeater:
Name=DataRepeater1
Caption=" Информация"
CaptionStyle=3
(drpCentered)
DataSource=Adodc1
Height=5655
Left=60
Top=60
Width=8715
На этом построение интерфейса нашего приложения и подключение его к базе данных закончено.
Шаг 2. Займемся "начинкой" для DataRepeater'а. Создайте новый проект ActiveX Control.
Проект: Name=BaseViewControl
UserControl:
Name=BWCtrl
Height=2640
Width=8115
Расположим ряд лейблов на нашем контроле (имена и позиции их даны в следующей таблице):
Name |
Caption |
Left |
Top |
Height |
Width |
Label1(0) | От кого | 0 | 0 | 195 | 870 |
Label1(1) | Кому | 4020 | 0 | 195 | 510 |
Label1(2) | Название | 0 | 180 | 195 | 870 |
Label1(3) | Дата | 0 | 360 | 195 | 870 |
lblFrom | From | 900 | 0 | 195 | 3135 |
lblTo | To | 4560 | 0 | 195 | 3435 |
lblSubject | Subject | 900 | 180 | 195 | 7095 |
lblTime | Time | 900 | 360 | 195 | 7095 |
Первые четыре лейбла несут функцию только надписей, а вот последние четыре будут выводить сообщения базы данных.
Ну и, наконец, разместим текстовое поле для вывода содержимого письма. Текстовым полем мы воспользовались из-за того, что оно будет связано у нас с полем MEMO, и мы не знаем объем выводимой информации. Поэтому на нем можно включить линейку прокрутки.
Name=txtMsg
BackColor=&H8000000F&
Font.Name=Courier New 'чисто из
эстетических
соображений +
он
компактнее
Font.Size=8
Height=2055
Left=0
Locked=True
MultiLine=True
ScrollBars=2(vertical)
Top=560
Width=7995
NB! В данном случае мы умышленно установили свойство Locked в True, предполагая, что данная база будет использоваться ТОЛЬКО ДЛЯ ЧТЕНИЯ. На будущее, если Вы захотите иметь возможность проводить изменения – просто не устанавливайте этого свойства. Ниже будет показана обработка свойств, как на чтение, так и на запись.
Шаг 3. Займемся кодом для нашего контрола. Нам необходимо написать 5 свойств (по количеству выводимых на экран полей из базы данных).
Покажу, как это делается на примере одного свойства pFrom, для поля From в базе данных (полный листинг, как всегда в конце статьи).
Public Property Get pFrom() As String
pFrom = lblFrom.Caption
End Property
Public Property Let pFrom(ByVal vNewValue
As String)
lblFrom.Caption = vNewValue
End Property
Откройте контрол и выберите меню Tools/Procedure Attributes… Нажмите кнопку Advanced>>. Затем, выбирая в поле Name имя каждого свойства, пометьте CheckBox'ы с именами Property is data bound и Show in DataBindings collection at design time. Тем самым мы позволим во время разработки подсоединить к данным свойствам поля базы данных. Нажимаем ОК. Теперь можно компилировать наш ActiveX Control.
Шаг 4. Закрываем этот проект и возвращаемся к исходному (т.е. BaseView). Щелкните мышью на контроле DataRepeater1, а затем в окне свойств выберите свойство RepeatedControlName. В выпадающем списке вы увидите перечень всех ActiveX Control'ов на вашем компьютере. Выберите тот, который мы только что создали BaseViewControl.BWCtrl, и он сразу же отобразится на форме. Теперь перейдем к свойству (Custom). Выберите ярлык RepeaterBindings. В списке Property Name определяем свойство pFrom, в списке DataField – находим ему соответствие – From. После чего нажимаем кнопку Add и наши, связанные между собой свойство контрола и поле в базе данных, появляются в таблице RepeaterBindings. Проделайте те же манипуляции с другими свойствами и нажмите кнопку ОК.
NB! В списке DataField Вы увидите еще два поля: MsgBody.MsgID и MsgHeader.MsgID. Данные два поля служат для связывания таблиц, выводу на экран не подлежат, поэтому просто оставьте их в покое :)
Шаг 5 (последний). Делаем заключительные косметические штрихи.
Переключитесь на Adodc1. Скопируйте значение свойства ConnectionString и внесите его в код (Form_Load). Удалите "жесткую" привязку к файлу. В результате Вы должны получить строку примерно следущего содержания:
Adodc1.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.3.51;" & _
"Persist Security Info=False;Data Source=" & _
App.Path & "\VbRU_5_00.mdb;"
Ниже запишите свойство RecordSource:
Adodc1.RecordSource = _
"Select * from MsgHeader, MsgBody WHERE MsgHeader.MSGID=MsgBody.MsgID"
И, наконец, присвоение свойства DataSource у DataRepeater1 к Adodc1
Set DataRepeater1.DataSource = Adodc1
Теперь в окне свойств значения свойств ConnectionString и RecordSource у Adodc1, а так же DataSource у DataRepeater1 – можно очистить, мы их отслеживаем программным путем.
В событии Adodc1_MoveComplete проследите отслеживание изменения Надписи на Adodc1.
Проект можно компилировать и запускать. Да, конечно, в сам проект можно добавить много разных "вкусностей", но это не входит в задачи данной статьи :)
NB! При компиляции проекта нашего ActiveX Control'а (BaseViewControl) - происходит его автоматическая регистрация, поэтому при переносе конечного проекта на другой компьютер не забудьте зарегистрировать наш OCX через regsvr32.exe.
2000 г.