|
||||||||
|
Классы TDataSetTableProducer и TqueryTableProducer.
Помимо обычных документов HTML, в Delphi предусмотрен класс TDataSetTableProducer, с помощью которого можно легко и эффективно создавать HTML-таблицы на основе некоторого набора данных. Этот класс позволяет полностью настраивать все характеристики таблицы в пределах, установленных правилами HTML. По своим функциональным возможностям он во многом напоминает компонент TDBGrid, так как с его помощью можно форматировать отдельные ячейки, строки и столбцы. При этом вы можете получать доступ к любому набору данных ? локальному или удаленному (в области видимости вашей системы, разумеется). Благодаря этому вы имеете возможность строить Web-узлы корпоративного уровня, которые получают доступ к данным практически из любого источника. Своим поведением класс TDataSetTableProducer несколько отличается от других элементов управления базами данных: он получает доступ к данным непосредственно из потомка класса TDataSet, а не через компонент TDataSource. Он имеет свойство DataSet, которое в период разработки можно установить равным любому потомку TDataSet, содержащемуся в том же модуле TWebModule, или во время выполнения ? любому динамически создаваемому значению. А после установки свойства DataSet класс TDataSetTableProducer можно сконфигурировать на отображение любых столбцов выбранного набора данных. С помощью свойства TableAttributes можно установить общие характеристики данной таблицы. Свойства Header и Footer имеют тип TStrings и позволяют добавлять HTML-код до и после самой таблицы. Эти свойства можно использовать в сочетании с вашим собственным динамически создаваемым кодом HTML или с другим кодом из компонента TPageProducer. Например, если главным элементом страницы является таблица, то свойства Header и Footer можно использовать для заполнения базовой структуры HTML-страницы. Если же в ваши планы не входит фокусирование внимания на таблице, стоит воспользоваться пользовательским дескриптором ТТаg в компоненте TPageProducer для размещения таблицы в соответствующем месте страницы. В любом случае для создания Web-страниц на базе наборов данных можно использовать компонент TDataSetTableProducer. Настройка самой таблицы выполняется с помощью свойств Columns, RowAttributes и TableAttributes. Под свойством Columns скрывается довольно мощный редактор компонентов, который можно использовать для установки большинства атрибутов компонентов.
Свойства Caption и CaptionAlign определяют способ отображения заголовка таблицы. В свойстве Caption хранится текст, предназначенный для объяснения содержимого таблицы и выводимый либо над, либо под нею. Свойство DataSet (Query в классе TQueryTableProducer) служит для определения данных, используемых в таблице. За исключением способа получения доступа к данным, классы TDataSetTableProducer и TQueryTableProducer функционируют идентично. Они имеют одни и те же свойства и одинаково сконфигурированы. Благодаря этому можно создать таблицу, которая является результатом простого объединения двух других таблиц и использования класса TQueryTableProducer, и на ее примере рассмотреть работу обоих классов. Создайте новое Web-приложение и опустите в окно модуля TWebModule компонент TQueryTableProducer из вкладки Internet, а также компоненты TQuery и TSession из вкладки Data Access палитры компонентов. Установите свойство QueryTableProducer1.DataSet равным значению Query1, а свойство Query1.DatabaseName равным DBDEMOS. Сохраните проект под именем TABLEEX.DPR. Затем установите свойство Query1.SQL следующим образом: SELECT CUSTNO, ORDERNO,
COMPANY, AMOUNTPAID, ITEMSTOTAL FROM CUSTOMER, ORDERS Это приведет к созданию маленькой объединенной таблицы, в которой будут зарегистрированы все заказчики из таблицы CUSTOMER.DB (со стандартным псевдонимом DBDemos), полностью не рассчитавшиеся за свой заказ. Затем можно построить таблицу для отображения этих данных и выделить суммы, подлежащие оплате. Для вывода данных на экран достаточно в редакторе свойства Columns установить свойство Query1.Active равным значению True.
Затем установите свойство Caption равным значению Delinquent Customers. Тем самым в редакторе компонента вы создадите, казалось бы, весьма непонятный заголовок, но его можно подправить во время выполнения. Дважды щелкните на экземпляре QueryTableProducer1, чтобы открыть редактор компонента Columns. В верхней левой части редактора компонента можно установить общие свойства таблицы в целом. Нижняя часть редактора содержит элемент управления HTML, который будет отображать таблицу в ее текущем состоянии. А верхняя правая часть отведена для элементов управления, определяющих, какие поля базы данных будут включены в таблицу и как эти поля нужно отобразить.
В верхнем левом углу окна установите значение Border равным 1, чтобы иметь возможность видеть границы таблицы в редакторе компонентов в процессе построения. Значение свойства CellPadding установите равным 2, чтобы создать достаточный интервал между границей и текстом. Если вы предпочитаете слегка раскрасить таблицу, установите свойство BgColor равным значению Aqua. Это заменит черный (по умолчанию) цвет фона таблицы на аквамариновый. Причем заметьте, что это значение можно переопределить путем установки фонового цвета для строки или столбца. Кроме того, установки цвета для столбца имеют преимущество перед установками цвета для строки. Наконец, щелкните четыре раза на кнопке Add в верхнем правом углу окна. Это приведет к созданию в редакторе четырех элементов THTMLTableColumn, для каждого из которых столбец таблицы будет отображаться в элементе управления HTML в нижней части редактора. При выборе одного из элементов THTMLTableColumn в окне инспектора объектов будут отображены его свойства. Выберите первый элемент THTMLTableColumn и установите его свойство FieldName равным CUSTNO. Обратите внимание на то, что свойство Fields включает поля, содержащиеся в SQL-запросе Query1, благодаря которому они стали доступны. Для оставшихся трех элементов THTMLTableColumn выберите в качестве имени поля (FieldName) соответственно значения CustNo, Company и AmountOwed. Установка значения поля FieldName приведет к созданию заголовков столбцов таблицы, совпадающих с именами полей. Однако имена полей базы данных часто оказываются не слишком удачными заголовками столбцов, поэтому вы можете изменить их значения с помощью свойства Title. Это составное свойство, и одним из его подсвойств является Caption. Установите свойства Title. Caption четырех столбцов равными значениям Cust #, Order #, Company и Amount Owed соответственно. Значение Amount Owed, возможно, не вполне подходит для описания информации, содержащейся в данный момент в четвертом столбце, но это дело поправимое. Свойство Title позволяет также выполнить вертикальное и горизонтальное выравнивание и настроить цвет ячейки заголовка столбца.
Таким образом; перечислены базовые свойства для таблицы, которые можно устанавливать во время выполнения. Теперь рассмотрим события, связанные с классом TQueryTableProducer, с помощью которых во время выполнения можно настраивать таблицу. Событие OnCreateContent возникает до генерации любого кода HTML. Оно содержит параметр Continue, и в вашей власти установить его значение логического типа (Boolean). Если ваше приложение определяет, что по каким-то причинам таблица не должна быть сгенерирована, можете установить этот параметр равным значению False, что надежно исключит какую бы то ни было обработку, а обращение к свойству Content вернет пустую строку. Такая возможность приостановки обработки может пригодиться при подготовке запроса, установке свойства TQueryTableProducer.MaxRows или для других действий, выполняемых перед отображением таблицы. Например, по мере создания таблицы приложение должно опросить каждую запись в запросе Query. Чтобы запрос гарантированно указывал на нужную запись, приложение должно вручную передвигать курсор в запросе в начало каждой строки. Иными словами, запрос должен начинаться с самого начала, как в классе TQueryTableProducer. Следовательно, обращение к методу Query1.First в обработчике события OnCreateContent гарантирует, что запрос и HTML-таблица синхронизированы относительно друг друга. Поэтому добавьте следующий код в обработчик события QueryTableProducer1.OnCreateContent: procedure
TWebModeule1.QueryTableProducer1CreateContent(Sender: TObject;
var Continue: Boolean); Событие OnGetTableCaption позволяет отформатировать заголовок таблицы по вашему желанию. Дважды щелкните на этом событии в окне инспектора объектов, и вы увидите следующий обработчик событий: procedure
TWebModule1.QueryTableProducer1GetTableCaption(Sender: TObject;
var Caption: String; var Alignment: THTMLCaptionAlignment); Параметр Caption представляет собой var-параметр, в котором будет храниться окончательный вариант заголовка. Вы можете манипулировать этим параметром как вам заблагорассудится: например, добавлять HTML-дескрипторы для изменения размера, цвета и шрифта заголовка таблицы. Дважды щелкнув на событии OnGetTableCaption в инспекторе объектов, создайте его обработчик для примера, над которым вы работали. Введите следующий код для форматирования заголовка таблицы, чтобы он стал более заметным на странице (эти изменения не должны отражаться на HTML-таблице, показанной в редакторе свойства Columns): procedure
TWebModule1.QueryTableProducer1GetTableCaption(Sender: Tobject;
var Caption: String; var Alignment: THTMLCaptionAlignment); Событие OnFormatCell можно использовать для изменения внешнего вида отдельной ячейки. В этом примере можно добавить код для выделения ячейки Amount Owed любой компании, которая еще не оплатила свой счет полностью. Конечно, это не делается "в лоб", как с обычными сетками, поскольку класс TQueryTableProducer обеспечивает вас только строковыми значениями. Но, как упоминалось ранее, вы можете использовать параметры CellRow и CellColumn для перемещения курсора компонента TQuery по создаваемой таблице, собирая соответствующие данные и выполняя вычисления в процессе обработки каждой строки. Обработчик события OnFormatCell передает информацию о текущей ячейке, форматируемой в параметрах CellRow и CellColumn. Оба эти параметра могут принимать только целые значения. Остальные являются var-параметрами, которым можно присваивать значения, зависящие от логики вашего приложения. С помощью параметров Align и VAlign вы можете применить к данным ячейки операции горизонтального и вертикального выравнивания. При этом с помощью параметра CustomAttrs можно передать дополнительные параметры ячейки Custom, а текст ячейки вы должны выделить в параметре CellData. Параметр CellData имеет тип string, который ограничивает ваши возможности по обработке содержимого ячейки в его родном формате. Если на самом деле данные хранятся в базе данных в виде целых значений, вам придется вызывать функцию StrToInt для обратного преобразования в число. На примере следующего кода иллюстрируется один из возможных способов сбора значений TField для данной ячейки. Возможно, в следующей версии Delphi, помимо (или вместо) строкового значения, в обработчик события OnFormatCell (приведенный в листинге) будет передано и реальное значение TField. Затем в свойство TQueryTableProducer.Header добавьте следующие строки: <HTML> <CENTER><H2>Big
Shot Widgets</H2></CENTER> А в свойство TQueryTableProducer.Footer ? строки <P> Установка значений этих свойств приведет к размещению таблицы между указанными наборами HTML-кода, а при обращении к свойству Content класса TQueryTableProducer, как показано в приведенном ниже коде, будет создана законченная страница. И наконец, вернитесь в главный модуль TWebModule вашего приложения и добавьте одно событие Action, установив его свойство PathInfo равным значению /TestTable. В его обработчик события OnAction добавьте следующий код: procedure
TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled:
Boolean); Затем скомпилируйте этот проект и убедитесь в том, что созданная DLL доступна вашему Web-серверу. Теперь, если вы вызовете URL http://<Bаш cepвep>/tableex.dll/TestTable, то увидите таблицу с заголовком и нижним колонтитулом, а также выделенные красным цветом ячейки, в которых содержится объем долга некоторых компаний (рис. 2). Рисунок 2
| ||||||||||||||||||||||
За содержание страницы отвечает Гончарова М.Н. © Кафедра СПиКБ, 2002-2017 |