Код элемента управления
Rates
Стандартные свойства элемента управления добавлены с помощью мастера интерфейса ActiveX. Остановимся на процедурах, которые загружают текстовый файл и выводят его в элемент управления ListBox.
Программа 21.10. Метод DownloadRates
Public Function DownloadRates(RatesURL As String)
On Error GoTo DLoadError
AsyncRead RatesURL, vbAsyncTypeFile, "Rates"
Exit Function
DLoadError:
RaiseEvent DLoadError(1024, "Could not download currency _
rates.")
' (He удалось загрузить курсы валют)
End Function
Метод, вызывающий функцию AsyncRead, передает ей URL Web-сервера в качестве параметра. Загруженная информация сохранится в файле с именем Rates.
Интересное действие выполняется, когда происходит событие
AsyncReadComplete объекта UserControl.
Private Sub UserControl_AsyncReadComplete(AsyncProp As AsyncProperty)
Dim FileName As String
On Error GoTo DLoadError
If AsyncProp.PropertyName = "Rates" Then
FileName = AsyncProp.Value
ReadRates FileName
End If
Exit Sub
DLoadError:
RaiseEvent DLoadError(1025, "Error in Downloading rates")
' (Ошибка при загрузке курсов)
End Sub
Код начинается с проверки значения свойства
PropertyName объекта AsyncProp. В элементе управления Rates это свойство принимает только значение Rates. Если элемент управления загружает несколько файлов сразу, то свойство укажет, загрузка какого файла уже завершена, чтобы его можно было обработать. Когда метод AsyncRead загружает файл, свойство Value объекта AsyncProp содержит имя файла и путь на локальном диске. Это имя не имеет никакого отношения к фактическому имени файла на сервере. Оно является уникальным именем файла, созданным системой во временной папке файлов Интернет. Имя файла используется подпрограммой ReadRates() для отображения курсов в элементе управления ListBox.
Программа 21.11. Подпрограмма ReadRates()
Private Sub ReadRates(FileName As String)
Dim FNum As Integer
Dim currencyName As String, currencyValue As Currency
FNum = FreeFile
CurrencyList.Clear
On Error GoTo ReadError
Open FileName For Input As FNum
Input ttFNum, m_LastUpdate
i=1
While Not EOF(FNum)
Input #FNum, currencyName, currencyValue
CurrencyList.AddItem currencyName & Chr(9) & _
Format(currencyValue, "#.000")
CurrencyNames(i) = currencyName
AllRates.Add Str(currencyValue), currencyName
i = i + 1
Wend
RaiseEvent RatesRead
Exit Sub
ReadError:
RaiseEvent DLoadError(1025, "Unkown data format")
' (Неизвестный формат данных)
End Sub
Это прямолинейный VB-код, который открывает текстовый файл и помещает его строки в элемент управления CurrencyList типа ListBox. Он сохраняет курсы валюты в списке AllRates, используя имя валюты в качестве ключа. Эта методика упрощает поиск курса обмена валюты. Подпрограмма ReadRates(), описанная в параграфе Private объекта UserControl, не может вызываться из основного приложения.
Обратите внимание на код обработки события ошибки во всех подпрограммах. При разгрузке информации из Интернет может произойти любое количество ошибок. HTTP-сервер может выключиться, файлы на сервере — реорганизоваться, может произойти ошибка передачи. Все это нужно отследить, продолжив работу программы надлежащим образом.
Возможность, которую можно добавить к проекту — сделать так, чтобы программа следила за загружаемым свойством и не допускала инициализации другой загрузки того же свойства хост-приложением, в то время как первое свойство загружается. Приведенный код выдаст общее сообщение об ошибке
"Error in downloading rates" ("Ошибка в загрузке курсов"). Метод AsyncRead может вызываться для загрузки файла, пока загружается другой файл, но он не может загружать один и тот же файл дважды.
Тестирование элемента управления Rates
Тестирование элемента управления, который загружает значения свойства с HTTP-сервера, требует, чтобы приложение было соединено с сервером, а документ, используемый для тестирования, находился на сервере. Если имеется собственный Web-сервер (Internet Information или Server Personal Web Server), то можно только скопировать Rates, txt файл в виртуальный каталог Web-сервера. Или просто скопировать файл в корневой каталог и соединиться с сервером, используя следующий URL.
http://127.0.0.1/RatesPage.htm
Адрес 127.0.0.1 — адрес компьютера в сети. Фактически, нет необходимости в реальной сети. Если на компьютере установлен Web-сервер, то можно использовать этот URL, чтобы соединиться с файлом. Если Web-сервер находится на другом компьютере той же сети, замените "127.0.0.1" фактическим именем компьютера.
В большинстве случаев собственного Web-сервера нет. Тогда используется сервер провайдера услуг Интернет, если есть разрешение помещать файлы на этот сервер (большинство ISP предоставляет абонентам несколько мегабайт для пользовательских страниц). Чтобы проверить элемент управления Rates с ISP-сервера, поместите Rates.txt файл в каталог на сервере. Для этого выполните следующие действия.
1. Создайте новую папку на жестком диске и поместите туда файл Rates.txt (если есть другие HTML-файлы, которые необходимо поместить на сервер, также перепишите их в эту папку).
2. Запустите Web Publishing Wizard (утилита, поставляемая с Windows и FrontPage).
3. Первая страница Web Publishing Wizard - экран приглашения. Щелкните на кнопке Next, чтобы перейти к выбору файлов или папок.
4. Введите имя созданной папки в поле File Name Box или Folder Name Box. Щелкните на кнопке Next.
5. В следующем окне определите имя Web-сервера и щелкните на кнопке Advanced. Появится другое окно, в котором необходимо выбрать протокол, используемый для пересылки файла.
6. Выберите FTP и щелкните на кнопке Next.
В следующем окне установите URL провайдера услуг Интернет. Необходимо определить имя сервера, чтобы ISP поместил страницы пользователя (имя локального каталога изменять не нужно). Для большинства ISP этот URL выглядит примерно так.
users.ISPname.com/yourname
Часть
yourname — имя пользователя, которое используется для входа в систему. Если адрес пользователя — jdoe@usa1.com, то имя входа в систему — jdoe, a URL каталога на ISP-сервере следующий.
users.usa1.com/jdoe
Многие ISP используют символ тильды перед именем пользователя (users.usa1.com ~ jdoe). Если поискать "user pages" на ISP Web-узле, то будет найдена вся необходимая информация.
Чтобы увидеть последнее окно мастера, щелкните на кнопке Next. Затем щелкните на кнопке Finish, чтобы поместить файлы на сервер.
Чтобы проверить каталог на сервере, запустите Internet Explorer и введите URL файла Rates.txt, находящегося на сервере.
Http://users.usa1.com/jdoe/rates.txt
Содержимое файла Rates.txt отобразится в окне броузера. Это значит, что файл на сервере успешно размещен и элемент управления Rates будет видеть его на сервере (и загружать с него). Необходимо скопировать URL из поля Address броузера и вставить его в код (передать как параметр в метод DownloadRates элемента управления Rates).
Описанный процесс работает со многими ISP, но так можно обратиться не ко всем ISP. Если возникают проблемы при помещении файлов на сервер, необходимо выяснить у Internet провайдера, что необходимо выполнить для размещения персонального Web-узла. Вместо Web-узла поместите файл Rates.txt. Или, если собственный Web-узел уже есть, поместите файл Rates.txt в тот же каталог. Это не повлияет на Web-узел, так как ни одна из его страниц не содержит гиперсвязи к этому файлу.
Если курсы валют были загружены, а через некоторое время вы снова щелкнули на кнопке Download Rate, то возможно появление на элементе управления тех же значений. Можно разместить новые файлы на сервере несколько раз, но курсы не будут меняться. Опытные Web-пользователи уже сообразили, в чем дело AsyncRead метод не запрашивает сервер, чтобы загрузить Rates.txt файл снова он восстанавливает файл из кэша, сохраняет информацию в другом временном файле, а код элемента управления считывает его. В действительности, метод AsyncRead входит в класс IntemetExplorer и использует тот же кэш, что и Internet Explorer.
Там, где Internet Explorer 4 позволяет обновить страницу, метод AsyncRead не поддерживает параметр, заставляющий считывать данные с сервера вместо кэша. Для решения этой проблемы измените установки кэша Internet Explorer Выполните следующие действия.
1. Запустите Internet Explorer и выберите команду Internet Options в меню View
2. Щелкните на кнопке Settings (Установки), чтобы открыть диалоговое окно Settings.
3. Чтобы заставить Internet Explorer перезагружать страницу с сервера (вместо чтения из кэша), установите флажок Eveiy visit to the page.
Теперь Internet Explorer не будет использовать кэш, и при каждом возврате к предыдущей странице, даже с интервалом в несколько секунд, страница будет перезагружаться с сервера. Когда эта книга была подготовлена к печати, Microsoft анонсировала первую бета-версию Internet Explorer 5. Возможно, новый AsyncRead метод позволит выбирать, загружать страницу или просто регенерировать кэш.
Другой интересный подход включить класс IntemetExplorer в элемент управления, вызвать его метод Refresh2 и вынудить загрузку файла. Когда метод AsyncRead вызывается снова, он обращается за данными в кэш, который будет содержать уже обновленные данные.
Загрузка свойств изображения
Метод AsyncRead может загружать свойства изображения. Изображения загружаются в виде двоичных файлов и отображаются с помощью метода LoadPicture. Visual Basic может создать контекст устройства для сохранения загруженного битового изображения. Чтобы загрузить изображение, нужно вызвать функцию AsyncRead.
AsyncRead URL, vbAsyncTypePicture, "Image"
Константа
vbAsyncTypePicture
сообщает Visual Basic, что загружаемый объект -изображение. Файлы не создаются на хост-компьютере, поэтому считать значения пикселей нет возможности. Чтобы работать с изображением, необходимо контролировать его загрузку с помощью функции AsyncReadComplete. Когда загрузка свойства Image (или др. имени, назначенного свойству в методе AsyncRead) завершается, необходимо прочесть значение свойства и сохранить его в объекте Picture с помощью следующего оператора.
Set Bitmap = AsyncProp.Value
Если загружаются несколько изображений, то для идентификации свойств используются различные имена. Можно использовать такие свойства объекта Bitmap, как Height (Высота) и Width (Ширина). Следующий фрагмент кода создает объект Picture с загруженным растровым изображением и вызывает подпрограмму Showlmage(), чтобы отобразить его в элементе управления PictureBox.
Private Sub UserControl_AsyncReadCornplete (AsyncProp As AsyncProperty)
On Error GoTo DloadError
If AsyncProp.PropertyName = "Image" Then
Set Bitmap = AsyncProp.Value
Showlmage Bitmap
' Ширина Bitmap задается в твипсах,
' для преобразования ее в пиксели используйте оператор
' Int(ScaleX(Bitmap.Width, vbHimetric, vbPixels))
End If
Exit Sub
DLoadError:
' сброс события ошибки
End Sub
Подпрограмма ShowImage() использует метод PaintPicture, чтобы скопировать битовое изображение из переменной Bitmap в элемент управления PictureBox.
Picture1.PaintPicture Image, 0, 0, _
Picture1.ScaleWidth, Picture1.ScaleHeight, _
0, 0, Picture1.ScaleWidth,Picture1.ScaleHeight
Подведем итог: загрузка свойств изображения с HTTP-сервера аналогична загрузке текстовых файлов. Необходимо определить тип данных, загружаемых в функцию AsyncRead (константа vbAsyncTypePicture
используется вместо vbAsyncTypeFile). Когда изображение загружено, объект Picture создается автоматически. В нем и сохраняется битовое изображение (так же, как автоматически генерировался текстовый файл). Можно использовать метод PaintPicture, чтобы передать растровое изображение от объекта Picture элементу PictureBox или непосредственно объекту UserControl.
Наконец, можно загрузить данные в формате массива, определяя константу vbAsyncTypeArray в функции AsyncRead. При этом Visual Basic создает байтовый массив, который можно обрабатывать с помощью кода.
Глава 22. Активные серверные страницы
• Взаимодействие клиент-сервер
• Использование активных серверных страниц
• Передача данных на сервер
• Обработка данных клиента
• Использование объекта Server
• Разработка Web-приложений
Мы уже знаем, как Web-cepep пересылает информацию клиенту в форме HTML-документов и как клиент взаимодействует с сервером с помощью гиперссылок (см. гл. 19), как создавать Web-страницы, позволяющие пользователю вводить данные на клиентском компьютере, и пересылать их вместе с URL на сервер. Кода сервер получает данные (так называемые значения параметров) от клиента, он обрабатывает их и возвращает результат в HTML-формате. В этой главе мы узнаем, как сервер извлекает параметры из сообщения клиента и обрабатывает их. Это самая важная часть механизма взаимодействия клиент-сервер и (во всяком случае, до появления ASP) наиболее сложная для реализации.
Параметры, передаваемые клиентом, разнообразны. Это может быть регистрационная информация, аргументы для поиска, параметры настройки. Компанию может интересовать информация из баз данных, извлекаемая по мере поступления запросов. Для получения самых "свежих" данных с Web-сервера переслать на сервер имя гиперссылки недостаточно. Представьте, что пользователю нужны данные о продажах некоторого товара в штате Северная Каролина или список наиболее активных заказчиков из Техаса. Данные получают из базы данных при поступлении запроса. Это не может быть документ, подготовленный загодя и находящийся на диске сервера в ожидании запроса. После запроса сервер должен извлечь необходимую информацию из базы, преобразовать ее в HTML-формат и передать клиенту.
Многие компании (крупные и не очень) осуществляют сделки, используя Web. Стало быть, коммерческий Web-узел должен предоставлять пользователю информацию о товарах и принимать заказы (товары, их количество, адрес получателя и т.п ) Требования к коммерческим Web-узлам — одна из тем, рассматриваемых в этой главе.
Примечание
В этой главе не рассмотрены вопросы, связанные с передачей конфиденциальной информации, например, номера кредитной карточки. Подобную информацию можно найти в документации к соответствующим продуктам
Microsoft, например, к Commerce Server.