Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 16.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.35 Mб
Скачать

Var Align: thtmlAlign; var vAlign: thtmlvAlign; var CustomAttrs,

CellData: String); begin if (CellColumn = 4) and (CellRow > 0) then

CellData := '<a href="' + ScriptName + '/image?1 +

IntToSTR(CellRow-l) + ' "Target="image"> Show Image </a>'; end;

// Обработчик события AfterDispatch

procedure TWebModulel.WebModuleAfterDispatch(Sender: TObject;

Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin

Tablel.close; end;

// Обработчик события BeforeDispatch

procedure TWebModulel.WebModuleBeforeDispatch(Sender: TObject;

Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin

Tablel.Open;

ScriptName := Request.ScriptName; end;

// Обработчик события OnAction объекта WebActionlteml

procedure TWebModulel.WebModulelWebActionltemlAction (Sender: TObject;

Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin

// Формирование ответа браузеру с помощью // компонента DataSetTableProducerl

Response.Content:= DataSetTableProducerl.Content; end;

// Обработчик события OnAction объекта WebActionItem2

procedure TWebModulel.WebModulelWebActionItem2Action(Sender: TObject;

Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var

DataSourcel: TDataSource; DBImage1: TDBImage; Jpegl: TJpeglmage; Stream: TMemoryStream; num: integer; begin

DataSourcel:=TDataSource.Create(nil); DBImagel:=TDBImage.Create(nil); try

Tablel.Open;

DataSourcel.DataSet:=Tablel; DBImagel.DataSource:=DataSourcel ; DBImagel.DataField:='BMP'; // Извлечение параметров запроса num:=StrToInt(Request.Query); if num = 0 then Tablel.First

else Tablel.MoveBy(num); Jpegl:=TJpegImage.Create; try

Jpegl.CompressionQuality := 50;

Jpegl.Assign(DBImagel.Picture.Bitmap) ;

Stream := TMemoryStream.Create;

try

Jpegl.SaveToStream (Stream);

Stream.Position := 0;

Response.ContentStream := Stream;

Response.ContentType := 'image/jpeg';

Response.SendResponse;

finally

Stream.Free; end; finally

Jpegl.Free; end; finally

Tablel.Close; end; end;

end.

Результаты обработки запросов модулем isag.dll приведены на рис. 16.20.

Рис. 16.20. Результаты работы модуля isag.dll

В первом фрейме (рис. 16.20) в виде таблицы отображаются текстовые данные. Для формирования таблицы в левом фрейме используется следующий URL-запрос:

http://igin/scripts/isag.dll/text

Для обработки ЭТОГО запроса вызывается процедура WebModulelWebActionltemlAction, в которой генерируется HTML-документ, содержащий таблицу. Формирование HTML-документа выполняет метод Content компонента DataSetTableProducerl:

Response.Content:=DataSetTableProducerl.Content ;

При форматировании каждой ячейки этой таблицы в методе content объекта DataSetTableProducerl возникает событие OnFormatCell, в обработчике которого содержится условный оператор

if (CellColumn = 4) and (CellRow > 0) then ...

Тем самым допускается редактирование только пятого столбца всех строк, на­чиная со второй, и для них формируются ссылки вида

<а href="http://igin/scripts/isag.dll/image?O" Target="image"> Show Image </a>

Цифра после знака ? изменяется в зависимости от номера строки. Параметр Target=nimage" задает целевой фрейм для вывода графики после обработки за­проса.

Собственно публикация графической информации осуществляется в процедуре

WebModulelWebAct ionItem2Act ion.

Для извлечения параметров URL-запроса, передаваемых в самом запросе, ис­пользуется свойство Query параметра Request. Для преобразования строкового значения переданного параметра используется процедура strToint: num:=StrToInt(Request.Query);

С помощью метода MoveBy объекта Table производится установка указателя текущей записи на запись номер num.

Для извлечения графической информации из БД используется объект DBimage:

DataSourcel:=TDataSource.Create(nil);

DBImagel:=TDBImage.Create(nil);

Tablel.Open;

DataSourcel.DataSet:=Tablel;

DBIraagel.DataSource:=DataSourcel;

DBImagel.DataField:='BMP';

Информация в поле вмр базы данных хранится в формате BMP. Чтобы браузер мог отобразить графическую информацию, ее необходимо преобразовать в фор­мат JPG. Для этого используется объект класса tjpeg:

Jpegl:=TJpegImage.Create; Jpegl.CompressionQuality:=50;

Преобразование файла из формата BMP в формат JPG осуществляется с по­мощью метода Assign объекта Jpeglmage:

Jpegl.Assign(DBImagel.Picture.Bitmap);

Для отправки изображения браузеру используется промежуточный поток

Stream:=TMemoryStream.Create; Jpegl.SaveToStream(Stream);

Указатель текущей позиции устанавливается на начало потока с помощью свой­ства Position объекта Stream:

Stream.Position:=0;

Далее указателю на возвращаемый поток Web-сервера присваивается указатель на промежуточный поток:

Response.ContentStream:=Stream;

Тип возвращаемых данных устанавливается следующим образом:

Response.ContentType:='image/jpeg';

С помощью метода sendResponse находящиеся в потоке данные отсылаются браузеру:

Response.SendResponse;

Замечание

Событие BeforeDispatch возникает прежде, чем Web-диспетчер приступит к обработке поступившего HTTP-запроса. Событие AfterDispatch возникает по­сле того, как HTTP-ответ успешно сформирован, но еще не отослан. Эти собы­тия удобно использовать для выполнения соответственно инициализации и удаления различных ресурсов, необходимых для обработки запроса.