|
||||||||
|
Пример формирования потоков данных.
Для построения примера образования потока данных выберите из главного меню команду File=>New, а затем из диалогового окна New Items пиктограмму Web Server Application. В результате вы получите заготовку модуля TWebModule. Перейдите в окно Web Module, выберите его, а затем перейдите в окно инспектора объектов. Дважды щелкните на свойстве Actions и создайте три действия с именами /file, /bitmap и /resource. Выберите действие /file, перейдите в окно инспектора объектов и выберите вкладку Events. Создайте событие OnAction, а затем добавьте в обработчик этого события следующий код: procedure
TWebModule1.WebModule1WebActionItem2Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled:
Boolean); Приведенный код довольно прост. Обработчик события OnAction создает класс TFileStream, который загружает файл; затем он устанавливает соответствующий тип MIME, чтобы сообщить броузеру клиента о передаче JPEG-файла, и присваивает результат создания экземпляра класса TFileStream свойству Response.ContentStream. Данные затем возвращаются клиенту путем вызова метода Response.SendResponse. В результате на переданной HTML-странице должно появиться изображение из указанного файла.
Действие /bitmap загрузит другое графическое изображение, причем иным способом. Код реализации этого действия несколько сложнее и имеет следующий вид: procedure
TWebModule1.WebModule1WebActionItem3Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Hadled:
Boolean); Преобразование растрового изображения в JPEG-файл с последующей передачей клиенту требует больших затрат. Для захвата растра из файла ресурсов используется класс TBitmap, а для выполнения операции преобразования растра в JPEG-файл создается экземпляр класса TJPEGImage из модуля JPEG. После создания класса TBitmap вызывается функция Windows API LoadBitmap для захвата растра из файла ресурсов с именем 'ATHENA'. Функция LoadBitmap возвращает дескриптор растра, который присваивается свойству Handle. Сам растр после этого сразу же назначается экземпляру класса TJPEGImage, а метод Assign благодаря перегрузке обладает достаточным интеллектом, чтобы "сообразить", что от него требуется преобразование растра в формат JPEG. Последующие инструкции служат прекрасным примером полиморфизма. Свойство Response.ContentStream объявляется как абстрактный класс TStream. Благодаря полиморфизму для создания можно использовать любой тип потомка класса TStream. В данном случае создается экземпляр класса TMemoryStream, и именно он используется для сохранения JPEG-файла, причем для этого вызывается метод TJPEGImage.SaveToStream. Теперь наш JPEG-файл находится в потоке и готов к пересылке. После сохранения JPEG-файла в потоке необходимо вернуть позицию потока к нулевой отметке. Это очень важный шаг, но, к сожалению, о нем очень часто забывают! Если этого не сделать, текущая позиция потока будет указывать на его конец, а значит, никакие данные не будут отправлены клиенту. После этого вызывается метод Response.SendResponse, выполняющий отправку данных, сохраненных в потоке. Еще один способ загрузки JPEG-файла заключается в использовании файла ресурсов. Вы можете загрузить JPEG-данные в файл *.RES, используя приведенный ниже код в файле *.RC, с последующей его компиляцией с помощью файла BRCC32.EXE. Если загружать данные как ресурс типа RCDATA, то можно прибегнуть к услугам класса TResourceStream, что позволит легко загрузить данные и отправить их броузеру клиента. Класс TResourceStream очень мощный и способен загрузить ресурс либо из самого ЕХЕ-файла, либо из ресурса, размещенного в любом файле библиотеки DLL. Как это делается, иллюстрируется с помощью действия /resource, а загрузка JPEG-данных выполняется из файла ресурсов с именем 'JPEG', который скомпилирован в ЕХЕ-файл: procedure
TWebModule1.WebModule1.WebActionItem4Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled:
Boolean); С помощью этого кода данные посылаются клиенту несколько другим способом. Вам снова повезло: перед вами более простой, но не менее прекрасный пример полиморфизма. Сначала создается экземпляр класса TResourceStream, который назначается свойству ContentStream. Поскольку конструктор класса TResourceStream сам загружает ресурс в поток, то вам уже не нужно предпринимать никаких дальнейших действий по формированию потока, а остается просто вызвать метод Response.SendResponse для отправки данных потока клиенту. В заключительном примере клиенту отправляется WAV-файл, который хранится в виде RCDATA-pecypca. Здесь используется метод Response.SendStream, который отправляет поток, создаваемый внутри этого метода. Тем самым иллюстрируется еще один способ пересылки потоковых данных: вы можете создать поток и модифицировать его при необходимости, а затем послать его клиенту с помощью метода SendStream. [Листинг с
примером формирования потоков
данных]
| ||||||||||||||
За содержание страницы отвечает Гончарова М.Н. © Кафедра СПиКБ, 2002-2017 |