КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Историко-стилистический анализ
Begin Var Begin Begin Var Begin Begin Begin Response.Content:=DataSetTableProducer1.Content; end; Оформим обработчик события ОnAсtion для действия по умолчанию, который может выглядеть так:
procedure TWebModule1.WebModule1defaultAction(Sender:TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); Response.Content:='<H2>Ошибка запроса!</H2>'; Response.Content:=Response.Content+'<a href=../dstr2.exe> <h2>Назад</h2></a>'; end;
Первая часть задачи выполнена. Клиент может отправить запрос к базе данных на сервер и получить отчет о запросе в окне браузера. (http://localhost/cgi-bin/Имя проекта.exe)
Далее реализуем вторую половину задачи: просмотрев весь список соревнований, клиент должен иметь возможность получить полную информацию об интересующем его состязании. Простейший вариант, это превратить строки с названиями состязания в первой колонке в ссылки. И это можно сделать, если воспользоваться одним из трех событий поставщика, возникающих в процессе формирования таблицы. Эти события называются OnCreateContent, OnGetTableCaption и OnFormatCell. Первое инициируется перед созданием таблицы. В нем можно внести последние изменения в этот процесс или совсем отменить: если обработчик этого события вернет в параметре Continue значение False, то таблица формироваться не будет. Второе событие вызывается при формировании заголовка таблицы. В этом обработчике можно изменить название таблицы и задать режим выравнивания текста заголовка.
Третье событие, вызывается при формировании содержимого каждой ячейки.
procedure TWebModule1.DataSetTableProducer1FormatCell(Sender:TObject; CellRow, CellColumn: Integer; var BgColor:THTMLBgColor; var Align: THTMLAlign; var VAlign:THTMLVAlign; var CustomAttrs,CellData: String); if (CellRow>0) and (CellColumn=0) then Celldata:='<a href=dstr2.exe\full?EventNo='+ table1.Fields[0].AsString+'>'+Celldata+'</A>';
end.
Параметры этой процедуры включают в себя номера столбца и строки таблицы для обрабатываемой ячейки (нумерация начинается с нуля), цвет фона ячейки, горизонтальное и вертикальное выравнивание, дополнительные атрибуты ячейки и текст, помещаемый в ячейку. В операторе if проверяются номера столбца и строки ячейки, и если ячейка не из первой строки (строки заголовка) и находится в первом столбце, то ее содержимое меняется: добавляются соответствующие теги HTML и данные о пути и запросе. В качестве имени пути здесь вставлена строка full, но объекта-действия для этого пути пока нет. Далее, за именем пути прописывается строка EventNo=, к которой добавляется содержимое первого поля базы данных, поле EventNo, преобразованное в строку. В результате Query -часть запроса для одной из строк таблицы будет иметь вид EventNo=7. Теперь нужно создать объект-действие для пути /full. Это действие должно сформировать новый документ с подробными данными о выбранном спортивном состязании. Для данной цели будет использоваться другой поставщик данных из таблиц данных: ТDataSetPageProducer. Добавим его в форму приложения. В свойстве DataSet этого компонента нужно указать таблицу, с которой работает поставщик, - Table1 в данном случае. Затем заполняем свойство HTMLDoc шаблоном, заготовкой того документа, который должен получить клиент. Шаблоны использует еще один компонент из панели Internet: TPageProducer. Когда в процессе обработки документа, компоненту встречается шаблон, он инициирует событие OnHTMLTag. В обработчике этого события должна пройти замена шаблона на соответствующие данные. Но в случае рассматриваемого компонента, TDataSetPageProducer, обработкой шаблонов можно и не заниматься, если дать им имена совпадающие с именами полей таблицы данных. В этом случае компонент сам произведет замену шаблонов на значения соответствующих полей текущей записи таблицы данных. В качестве "шаблонного" документа можно использовать следующий текст:
<html> <head> <title>Обзор спортивного состязания</title> </head> <Table Width="100%" Border=1 BgColor="Silver"><Caption>Заказ билетов на спортивные соревнования</Caption> <TR><TH Align="Right">Номер по порядку</TH> <TH Align="Left"><#EventNo></TH></TR> <TR><TH Align="Right">Название состязания</TH> <TH Align="Left"><#Event_Name></TH></TR> <TR><TH Align="Right">Дата проведения</TH> <TH Align="Left"><#Event_Date></TH></TR> <TR><TH Align="Right">Время проведения</TH> <TH Align="Left"><#Event_Time></TH></TR> <TR><TH Align="Right">Цена билета</TH> <TH Align="Left"><#Ticket_price></TH></TR> </Table> <br><br> <#Event_Description> <br><br> <#Event_Photo> <br><br> <a href="../dstr2.exe">Вернуться назад</a> </body> </html> В тексте фрагмента программы хорошо видны шаблоны, имена которых совпадают с именами полей таблицы events.db. В конце текста выводится ссылка, активизировав которую, можно вернуться к полному списку записей таблицы. Далее нужно создать объект-действие для значения пути full, у него в свойстве PathInfo задается строка /full. Если выбрать из списка значений свойства Producer значение DataSetPageProducer1 и откомпилировать проект, то получим следующее: при выборе разных строк таблицы выводятся данные только из первой записи. И это закономерно, так как данные для получения сведений из нужной записи есть, но они никак не используются. Очевидно, самым простым решением в данном случае было бы простое перемещение указателя в таблице на отобранную запись. И сделать это можно в обработчике события OnAction объекта-действия full. Но чтобы этот обработчик срабатывал первым, необходимо очистить свойство Producer и вызывать нужный поставщик из обработчика события OnAction. Обработчик будет выглядеть следующим образом: procedure TWebModule1.WebModule1fullAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled:Boolean); q1:string; options:TLocateOptions; q1:=Request.QueryFields.Values['EventNo']; Table1.Locate('EventNo',q1,options); Response.Content:=DataSetPageProducer1.Content; end; Здесь в переменную q1 помещается значение для поля EventNo, затем выполняется переход к соответствующей записи таблицы, которая становится теперь текущей записью, а в последней строке вызывается функция Content поставщика данных, который подставляет на место шаблонов, значения из текущей записи таблицы и возвращает сформированный документ свойству Content объекта Response.
В таблице events.db имеются еще графические изображения и Mемо -поля, их также нужно выводить в ответ на запрос пользователя. Сейчас вместо графики и текста из Mемо -поля можно увидеть в браузере "условные обозначения" (MEMO) и (GRAPHIC). Для работы с этими полями придется ввести в обработчик события OnHTMLTag компонента TDataSetPageProducer следующий код: procedure TWebModule1.DataSetPageProducer1HTMLTag(Sender:TObject; Tag: TTag; const TagString: String; TagParams: TStrings; var ReplaceText: String); if CompareText(TagString,'Event_Photo')=0 then ReplaceText:='<img src=Photo?EventNo='+ table1.Fields[0].AsString+'>'; if CompareText(TagString,'Event_Description')=0 then ReplaceText:=Table1.FieldByName('Event_Description').AsString; end; Что касается обработки Mемо -поля, то здесь все делается в одну строку, а за рисунком придется еще раз обратиться на Web -сервер. Здесь формируется тег HTML, используемый для описания графических изображений, который ссылается на приложение (имя приложения и адрес сервера браузер в данном случае подставляет сам) с новым значением пути Photo, за которым следует ссылка на нужную запись таблицы данных. Естественно, нужно добавить в приложение еще один объект-действие, обработчик события OnAction, код которого приводится ниже: procedure TWebModule1.WebModule1PhotoAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled:Boolean); B:TBitmap; S:TMemoryStream; q1:string; options:TLocateOptions; q1:=Request.QueryFields.Values['EventNo']; Table1.Locate('EventNo',q1,options); B:=TBitmap.Create; B.Assign(Table1.FieldByName('Event_Photo')); S:=TMemoryStream.Create; B.SaveToStream(S); S.Position:=0; Response.ContentType:='image/x-xbitmap'; Response.ContentStream:=S; B.Free; end; В вышеприведенном фрагменте вначале указатель в таблице устанавливается на нужную запись, затем создается объект типа BitMap и в него переписывается содержимое поля Event_Photo. Затем создается поток в памяти и в него переписывается нужный графический образ. Далее остается установить указатель в потоке на начало и передать Web -серверу указатель на поток и тип данных в потоке. Сведения об авторах произведения
Дата добавления: 2017-01-13; Просмотров: 242; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |