КАТЕГОРИИ: Архитектура-(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) |
Реализуемый в книге пример является учебным. При создании реальных систем следует соблюдать соответствие всем образцам документов, согласно принятым стандартам делопроизводства
Замечание Поскольку создаваемый компонент уже имеет клиентскую сущность и запускается на его стороне, то он должен быть реализован как отдельный ActiveX-проект. Давайте создадим новый ActiveX Form-проект. Для этого нужно выбрать следующую последовательность меню: File | New | ActiveX | ActiveX Form и заполнить появившееся диалоговое окно, как показано на рис. 12.3. Если у вас уже был открыт некий проект, то по нажатии кнопки ОК на экране появится сообщение, что новая форма не может быть добавлена в существующий проект, поскольку он не является библиотекой ActiveX. Для продолжения работы необходимо подтвердить создание нового проекта и закрытие старого. В рабочей области нужно открыть модуль main и его форму, на которой размещаются компоненты (рис. 12.4). Рис. 12.3. Пример заполнения диалогового окна Рис. 12.4. Вид формы и ее компонентов примера Параметры элементов, расположенных на форме, можно устанавливать как угодно, но, в целях согласования со следующими листингами, названия некоторых объектов лучше согласовать с табл. 12.2. Таблица 12.2. Описание ключевых компонентов на форме
После размещения элементов на форме можно установить параметры их отображения и значения по умолчанию. Для того чтобы воспользоваться возможностями печати, необходимо подключить модуль printers к нашему модулю, вписав соответствующее название В секцию uses. Теперь осталось обработать нажатие кнопки Печать. Следует помнить, что механизм получения конкретных значений заказа будет внедрен в наше ActiveX-приложение в ходе изложения материала последующих глав. Для реализации первой задачи обработаем событие onPrintBtnCiick следующим образом (листинг 12.2). Листинг 12.2. Реализация процедуры обработки нажатия кнопки Печать: procedure Tshop.printbtnClick(Sender: TObject); begin printbtn.Hide; print; printbtn.show; end; Как обычно, чтобы вызвать заготовку для такой функции, нужно два раза щелкнуть мышью по соответствующей кнопке. В приведенном листинге принтер печатает в графическом режиме. Для печати некоторого материала нужно вызвать свойство Canvas объекта Printer, которое позволяет рисовать необходимый к выводу на печать материал. В данном случае мы просто скопировали с "холста" формы область, занятую объектом Panel, в соответствующую область "холста" принтера, при этом сместив ее вниз и вправо на 20 пикселов, с целью формирования полей при печати. Методы BeginDoc и EndDoc, соответственно, активизируют рисование выводимого на печать материала на "холсте" принтера и отправляют его на печать. Добавим свойство tabiecontent в нашу форму, которое устанавливается при ее вызове. Для этого, используя пункты меню Edit | Add to Interface, вызовем диалоговое окно и заполним его, как показано на рис. 12.5. Рис. 12.5. Заполнение диалогового окна добавления нового свойства После нажатия кнопки ОК следует реализовать появившуюся процедуру и функцию. Данные, на основании которых осуществляется представленный ниже разбор, будут получены в результате модифицирования нашего примера электронного магазина. Реализация процедуры, обрабатывающей значение, помещаемое в свойство tabiecontent, приведена в листинге 12.3. Листинг 12.3. Реализация процедуры установки и получения свойства tabiecontent procedure Tshop.Set_tablecontent(const Value: WideString); var Myrow: string; count: byte; begin tmpvalue:=Value; table. Rows [ 0 ]. Add (' Номер'); table.Rows[0].Add('Наименование товара'); table. Rows [ 0 ]. Add (' Количество'); table.Rows[0].Add('Цена, рублей'); table.Rows[0].Add('Стоимость'); delete(tmpvalue,1,(Pos('<TR>',tmpvalue)+3)); delete(tmpvalue,!,(pos('<TR>',tmpvalue)-1)); tmpvalue:=copy(tmpvalue,1,Pos('</TABLE>',tmpvalue)-1); count:=1; repeat begin delete(tmpvalue,1,(Pos('<TR>',tmpvalue)+3)); if pos('<TR>',tmpvalue)>0 then myrow:=copy(tmpvalue,1,(Pos('<TR>',tmpvalue)-1)) else myrow:=copy(tmpvalue,1,length(tmpvalue)); table. Rows [count ]_.Add (J£&&^l^&WL\y, Repeat delete(myrow,1,(Pos('<TD>',myrow)+3)); if Pos('<TD>',myrow)>0 then table.Rows [count].Add (copy (myrow, 1, (Pos ('<TD>',myrow) -1)')) else table.Rows[count].Add(copy(myrow,1,length(myrow))); until (Pos('<TD>',myrow)=0); end; count:=count+l; until (Pos('<TR>',tmpvalue)=0); end; В данной процедуре происходит "очистка" самих данных от их HTML-представления и занесение конкретных значений в ячейки таблицы. Для того чтобы дополнительно не модифицировать в значительной степени HTML-код серверной части, мы воспользуемся генератором корзины и эту информацию передадим в качестве параметра ActiveX-формы. После того как все добавлено, можно устанавливать следующие обязательные параметры в меню Web Deployment Options:
После осуществления соответствующих настроек можно вызывать команду Web Deploy. После ее выполнения в каталогах, которые вы определили для выходных файлов, появятся файлы bill.htm и bill.осх. Желательно сразу помещать эти файлы в каталог htdocs Web-сервера Apache.
Модернизация серверной части В серверном модуле shop.dpr, который был реализован в предыдущей главе, следует сделать ряд изменений. Прежде всего, нужно описать класс TBiliview как наследник класса TBasicview, а затем реализовать отправку содержимого заказа клиенту. Эти коррективы представлены в листинге 12.4. Листинг 12.4. Модернизация проекта shop function TBillView.CreateContent (const TagString: string): String; var tag: string; cart: tcartview; begin cart:=tcartview.Create('templates\\Cart.htm'); cart.ForwardRequest(Request, Response); tag:=Response.Content; {Здесь был использован объект "корзина" для генерации HTML-представления таблицы заказов. Следом идет отделение "лишней" информации — служебных тегов и т. д.} tag:=copy(tag,26,Length(tag)-166); while ((pos('<',tag) > 0) and (pos('>',tag) > 0)) do begin Insert('<',tag,Pos('<',tag)); Delete(tag,Pos('<',tag),1); Insert('>',tag,Pos('>', tag)); Delete(tag,Pos('>',tag),1); end; while Pos("", tag)>0 do begin Insert('Squot;',tag,Pos('"',tag)); Delete(tag,Pos('"',tag),1); end; Result:= '«OBJECT classid="clsid:9BC76146-C899-4841-AAA4-3F14C6565152" codebase="http://localhost/bill.cab#version=l,0,0,0"'+ 'width=590 height=536 align=center hspace=0 vspace=0>'+ '<PARAM NAME="tablecontent" Value="'+tag+'"x/OBJECT>'; end; Кроме сделанных изменений в реализации, следует внести коррективы в интерфейсную часть и процедуру обработки запросов пользователя. При описании реализации создаваемой системы в гл. 10были опушены сведения о классе TBiiivew. В листинге 12.5 приведен интерфейс для данного класса. Листинг 12.5. Интерфейсная часть класса TBillVew TBillView = class (TBasicView) public function CreateContent (const TagString: string): String; override; end; В соответствии с дополнением системы возможностью генерации счета, необходимо провести модернизацию процедуры разбора запроса браузера клиента. Добавляемые В процедуру TDispatcher. CreateCorrespondingView строки кода приведены в листинге 12.6. Листинг 12.6. Дополнение в процедуру TDispatcher. CreateCorrespondingView else if position = 'order' then result:= TOrderView.Create ('templates\\0rder.htm') else if position = 'bill' then result:= TBillView.Create ('templates\\Bill.htm') else result:= nil;... В результате, мы получили вариант электронного магазина, который уже позволяет печатать счет. Перед тем как тестировать компонент, нужно запустить Web-сервер. Проверьте установки безопасности браузера. Он должен осуществлять загрузку неподписанных компонентов ActiveX. Таким образом, был получен еще один фрагмент реализации информационной системы, на этот раз, работающий на стороне клиента. Дополнив его функциями получения данных заказа и отправки информации о клиенте, мы получим законченный клиентский модуль. Однако сначала нужно познакомиться со способом обмена данными, при котором уже не нужно пользоваться браузером или готовым Web-сервером, а именно на основе сокетов. ГЛАВА 13
Дата добавления: 2014-12-29; Просмотров: 425; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |