Проектирование документов ActiveX

Как вы узнали из урока 17, с помощью документов ActiveX вы сможете распространить возможности Visual Basic на Интернет или вашу интрасеть. Документы ActiveX представляют собой приложения Visual Basic, в которых функции контейнера выполняет Microsoft Internet Explorer 3 (или более новая версия). Используя документы ActiveX в своих проектах, вы сможете создавать переносимые варианты приложений и работать с ними на портативных компьютерах, в дальних офисах и даже из дома. Приложение работает прямо из Web-броузера. Тем не менее, документ ActiveX не является Web-страницей — это вполне самостоятельное приложение. Кроме того, пользователи могут свободно переключаться между документами ActiveX и Web-страницами в броузере.

Чтобы наглядно продемонстрировать, как это происходит, мы продолжим работу над приложением WebComm и создадим клиента WebComm в виде документа ActiveX (вместо стандартного ЕХЕ-файла):

1. Создайте новый проект командой File > New Project.

2. В диалоговом окне New Project выберите значок ActiveX Document EXE.

3. Задайте свойству Name проекта значение WebCommClient.

4. Откройте диалоговое окно свойств проекта — для этого щелкните правой кнопкой мыши на имени проекта в окне проекта и выполните команду WebCommServer properties из контекстного меню.

5. Перейдите на вкладку Make и введите в поле Title строку Клиент WebComm.

6. Закройте диалоговое окно кнопкой ОК.

7. Задайте свойству Name документа UserDocumentl значение docWebComm.

8. Щелкните правой кнопкой мыши на панели элементов и выполните команду Components из контекстного меню.

9. Установите флажки рядом со строкой Microsoft Winsock Control 6.0. Закройте диалоговое окно кнопкой ОК — элемент Winsock появляется на панели.

10. Добавьте элемент Winsock в docWebComm и задайте его свойству Name значение wsk.

11. Создайте элемент-надпись (Label) в левой верхней части документа. Задайте его свойству Name значение lblName, а свойству Caption — значение Введите имя:.

12. Создайте под надписью текстовое поле. Задайте его свойству Name значение txtName. Удалите текущее содержимое свойства Text.

Совместная потоковая модель

В открывшемся диалоговом окне Project Properties (см. ниже) обратите внимание на рамку Threading Model вкладки General. Работа с потоковыми моделями — одна из новых возможностей Visual Basic 6. Точнее, эта возможность была выпущена для Visual Basic 5 в составе дополнения (service pack), но в версии 6 она является встроенной. Некоторые компоненты ActiveX могут быть многопоточными — это означает, что они «хорошо ведут себя» с другими объектами и не мешают работе друг друга.

Проектирование документов ActiveX - student2.ru

В Visual Basic разделение потоков между объектами основано на совместной потоковой модели (apartment-model threading). При таком подходе каждый поток имеет свою собственную копию глобальных данных, необходимых для работы объекта. При создании нового потока создается новая копия данных, а внесенные в нее изменения не влияют на глобальные данные других потоков. Упрощенно говоря, в результате приложения Visual Basic могут поддерживать ограниченную многозадачность.

Если вам захочется больше узнать о проблемах многопоточности, обращайтесь к справочной системе Visual Basic.

13. Создайте еще одну надпись рядом с полемtxtName. Задайте ее свойствуName значение lblТх, а свойствуCaption - значениеВведите сообщение:. Свойство Enabled должно быть равноFalse. 14. Создайте текстовое поле под lblТх. Задайте его свойству Name значение txtTx, удалите текущее содержимое свойства Text. Кроме того, задайте свойству Enabled значение False.

15. Создайте еще одно текстовое поле, расположенное на пару линий сетки ниже txtTx, и задайте его свойству Name значение txtRx. Задайте свойству Enabled значение False и удалите текущее содержимое свойства Text.

16. Задайте свойству Multiline элемента txtRx значение True, а свойству ScrollBars -значение 2 - Vertical.

После создания всех элементов документ будет выглядеть так, как показано на рис. 18.8.

Проектирование документов ActiveX - student2.ru

Рис. 18.8. Клиент WebComm в режиме конструирования 17. Сохраните проект.

Вероятно, вы уже поняли, что визуальное конструирование составляет лишь незначительную часть процесса разработки приложений Visual Basic. К счастью, программный код в данном случае не так уж сложен. Он добавляется в приложение следующим образом:

1. Дважды щелкните на документе в окне конструктора, чтобы открыть окно программы.

2. Вставьте следующий фрагмент в процедуру события Resize документа:

Private Sub UserDocument_Resize()

Растянуть текстовое поле With txtRx

.Move 0, .Top, ScaleWidth, (ScaleHeight - .Top) End Sub

3. Вставьте следующий код в процедуру события Terminate: у

Private Sub UserDocument_Terminate() Закрыть соединение

wsk.Close End Sub

Чтобы другие собеседники знали, кто участвует в разговоре, пользователь должен ввести свое имя. Мы обеспечиваем выполнение этого требования, устанавливая соединение с сервером лишь после ввода данных в поле Name. После ввода имени и нажатия клавиши Enter документ подключается к серверу.

4. Вставьте следующий фрагмент в процедуру события KeyPress поля txtName:

Private Sub txtName_KeyPress(KeyAscii As Integer)

Переслать данные, когда пользователь нажимает Enter If (KeyAscii = 13) And _

(txtName.Text <> "") Then Подключиться к серверу With wsk

.Protocol = sckTCPProtocol .RemoteHost = "10.0.0.1" .RemotePort = 12345 .Connect End With

Сделать доступным к текстовым полям lblТх. Enabled = True txtTx. Enabled = True txtRx.Enabled = True

Запретить возможное изменение имени IblName.Enabled = False txtName.Enabled = False End If End Sub

Обратите внимание: текстовое поле передачи (txtTx) и окна разговора (txtRx) остаются заблокированными до тех пор, пока в поле Name не появится какой-нибудь текст.

ПРИМЕЧАНИЕПеред тем как запускать приложение, необходимо заменить свойство RemoteHost именем хоста или IP-адресом компьютера, на котором работает сервер WebComm. В нашем примере свойство RemoteHost равно 10.0.0.1, что соответствует первому свободному адресу в тестовом пуле TCP/IP.

В большинстве чат-комнат перед текстом сообщения указывается имя участника. Это позволяет другим собеседникам следить за тем, от кого пришло то или иное сообщение. Конечно, наша чат-комната должна следовать этому неписаному правилу. Проблема решается просто: мы берем имя, введенное в поле Name, приписываем к нему текст сообщения и отсылаем полученную строку.

5. Вставьте следующий фрагмент в процедуру события txtTx_KeyPress:

Private Sub txtTx_KeyPress(KeyAscii As Integer) Dim msg As String

Переслать данные, когда пользователь нажимает Enter If (KeyAscii = 13) And _

(wsk.State = sckConnected) Then

Включить в сообщение имя отправителя msg = "[" & _

UCase$(Trim$(txtName.Text))& _ "] - " & txtTx.Text

Отправить сообщение wsk.SendData msg

Очистить поле с отправленным текстом txtTx.Text = " End If End Sub

Кроме того, нам понадобится функция, которая будет обрабатывать поступающие сообщения и отображать их в окне разговора.

6. Вставьте следующий фрагмент в процедуру события wsk_DataArrival:

Private Sub wsk_DataArrival(ByVal bytesTotal As Long) Dim msg As String

Получить сообщение из буфера wsk.GetData msg, , bytesTotal

Вывести сообщение в текстовом поле With txtRx

.Text = msg & _

vbCrLf & _ vbCrLf & _ .Text End With End Sub

7. Сохраните проект!

Как видите, клиент устроен намного проще, чем сервер, хотя оба приложения во многом похожи. Каждое из них должно создать свою сторону сеанса и обрабатывать поступающие данные. Полученные данные обрабатываются в процедуре события DataArrival методом GetData, а отправляются — методом SendData. Впрочем, оставим теорию! Наверняка вам не терпится посмотреть, как работает наша чат-комната!

Наши рекомендации