Вход


Главная страница >> Учебный процесс >> Конспекты >> Delphi. Программирование для Internet >> Создание динамических HTML-страниц. >> Классы TDataSetTableProducer и TqueryTableProducer.

[Назад]    [Содержание ]    [Вперед]

  


Классы TDataSetTableProducer и TqueryTableProducer.


Классы 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 скрывается довольно мощный редактор компонентов, который можно использовать для установки большинства атрибутов компонентов.

Совет Чтобы открыть редактор свойства Columns, достаточно дважды щелкнуть на самом компоненте или свойстве 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
WHERE
CUSTOMER.CUSTNO = ORDERS.CUSTNO
AND
ORDERS.AMOUNTPAID <> ORDERS.ITEMSTOTAL

Это приведет к созданию маленькой объединенной таблицы, в которой будут зарегистрированы все заказчики из таблицы CUSTOMER.DB (со стандартным псевдонимом DBDemos), полностью не рассчитавшиеся за свой заказ. Затем можно построить таблицу для отображения этих данных и выделить суммы, подлежащие оплате. Для вывода данных на экран достаточно в редакторе свойства Columns установить свойство Query1.Active равным значению True.

На заметку Все приложения Web-сервера, предназначенные для обработки данных и использования компонентов Delphi для работы с данными, должны иметь компонент TSession, включенный в модуль TWebModule. К приложениям Web-сервера возможен многократный параллельный доступ, и для каждого запроса Delphi запустит в отдельном потоке ISAPI или NSAPI-приложение сервера. В результате при обращении к BDE (Borland Database Engine ? система доступа к базам данных фирмы Borland) вашему приложению не обойтись без собственного уникального сеанса. А как раз компонент TSession и гарантирует, что каждый поток будет иметь собственный сеанс и не вступит в конфликт с другими потоками, пытающимися получить доступ к тем же данным. В этой ситуации от вас требуется лишь снабдить свой проект компонентом TSession ? об остальном позаботится Delphi.
Совет При построении приложений Web-расширений свойство TWebApplication.CacheConnections может ускорить работу приложения. При каждом создании запроса к ISAPI- или NSAPI-приложению генерируется новый поток для обработки запроса, причем это происходит в процессе, создающем новый экземпляр вашего класса TWebModule. Обычно каждый поток выполняется только для одной связи, а при закрытии этой связи экземпляр класса TWebModule разрушается. Если свойство CacheConnections равно True, то каждый поток сохраняется и при необходимости используется повторно. Новые потоки создаются только в том случае, когда кэшированный поток недоступен. Таким образом, быстродействие увеличивается за счет экономии времени выполнения операции создания очередного экземпляра класса TWebModule. Однако осторожность и здесь не помешает, поскольку событие TWebModule.OnCreate вызывается только один раз для каждого кэшированного потока. По завершении работы кэшированный поток сохраняет свое конечное состояние. Это может вызвать проблемы при следующем использовании этого потока (в зависимости от того, что должно произойти при обработке события OnCreate). Если у вас это событие используется для инициализации переменных или выполнения других начальных действий, то, возможно, вам не стоит использовать кэшированные связи.

С помощью свойства TWebApplication.InactiveCount можно проверить текущее число неиспользуемых кэшированных связей. И наоборот, свойство TWebApplication.ActiveCount подскажет вам количество активных связей. Эти два свойства помогут определить подходящее значение для свойства TWebApplication.MaxConnections, ограничивающее общее число связей, которые класс TWebModule может обрабатывать одновременно. Если же значение свойства ActiveCount превысит значение свойства MaxConnections, будет сгенерирована исключительная ситуация.

Затем установите свойство Caption равным значению Delinquent Customers. Тем самым в редакторе компонента вы создадите, казалось бы, весьма непонятный заголовок, но его можно подправить во время выполнения.

Дважды щелкните на экземпляре QueryTableProducer1, чтобы открыть редактор компонента Columns. В верхней левой части редактора компонента можно установить общие свойства таблицы в целом. Нижняя часть редактора содержит элемент управления HTML, который будет отображать таблицу в ее текущем состоянии. А верхняя правая часть отведена для элементов управления, определяющих, какие поля базы данных будут включены в таблицу и как эти поля нужно отобразить.

Совет При необходимости измените размеры окна редактора свойства Columns; это не помешает, особенно в том случае, если таблица содержит много столбцов.

В верхнем левом углу окна установите значение 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 позволяет также выполнить вертикальное и горизонтальное выравнивание и настроить цвет ячейки заголовка столбца.

На заметку Класс THTMLTableColumn, как и другие связанные с таблицами классы, имеет свойство Custom, которое позволяет ввести строковое значение для данного элемента в таблице. Это значение будет введено прямо в дескриптор HTML, определяющий данный элемент таблицы. Элементы свойства Custom могут включать HTML-модификаторы ячейки, строки или столбца, не включенные в свойства класса или HTML-расширений. Броузер Microsoft Internet Explorer включает несколько расширений, предназначенных для форматирования таблиц, благодаря которым и возможна их настройка. Если вы хотите добавить эти возможности, создайте элемент в свойстве Custom в формате имя_параметра=значение. Можно также добавить несколько параметров, разделив их пробелами.

Таким образом; перечислены базовые свойства для таблицы, которые можно устанавливать во время выполнения. Теперь рассмотрим события, связанные с классом 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);
begin
═════QueryTableProducer1.MaxRows := Query1.RecordCount;
═════Query1.First;
═════Continue := True;
end;

Событие OnGetTableCaption позволяет отформатировать заголовок таблицы по вашему желанию. Дважды щелкните на этом событии в окне инспектора объектов, и вы увидите следующий обработчик событий:

procedure TWebModule1.QueryTableProducer1GetTableCaption(Sender: TObject; var Caption: String; var Alignment: THTMLCaptionAlignment);
begin
end;

Параметр Caption представляет собой var-параметр, в котором будет храниться окончательный вариант заголовка. Вы можете манипулировать этим параметром как вам заблагорассудится: например, добавлять HTML-дескрипторы для изменения размера, цвета и шрифта заголовка таблицы.

Дважды щелкнув на событии OnGetTableCaption в инспекторе объектов, создайте его обработчик для примера, над которым вы работали. Введите следующий код для форматирования заголовка таблицы, чтобы он стал более заметным на странице (эти изменения не должны отражаться на HTML-таблице, показанной в редакторе свойства Columns):

procedure TWebModule1.QueryTableProducer1GetTableCaption(Sender: Tobject; var Caption: String; var Alignment: THTMLCaptionAlignment);
begin
═════Caption := ?<B><FONT SIZE=?+2? COLOR=?RED?>Delinquent Accounts</FONT></B>?;
═════Alignment := caTop;
end;

Событие 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>
<HEAD>
<TITLE>Delinquent Accounts</TITLE>
</HEAD>
<BODY>

<CENTER><H2>Big Shot Widgets</H2></CENTER>
<P>
The Accounts highlighted in red are late in paying:
</P>

А в свойство TQueryTableProducer.Footer ? строки

<P>
<I>This information is to be kept in the strictest confidence</I><P>
<B><I>Copyright 1997 by BigShotWidgets</I></B><p>
</BODY>
</HTML>

Установка значений этих свойств приведет к размещению таблицы между указанными наборами HTML-кода, а при обращении к свойству Content класса TQueryTableProducer, как показано в приведенном ниже коде, будет создана законченная страница.

И наконец, вернитесь в главный модуль TWebModule вашего приложения и добавьте одно событие Action, установив его свойство PathInfo равным значению /TestTable. В его обработчик события OnAction добавьте следующий код:

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
═════Response.Content := QueryTableProducer1.Content;
end;

Затем скомпилируйте этот проект и убедитесь в том, что созданная DLL доступна вашему Web-серверу. Теперь, если вы вызовете URL http://<Bаш cepвep>/tableex.dll/TestTable, то увидите таблицу с заголовком и нижним колонтитулом, а также выделенные красным цветом ячейки, в которых содержится объем долга некоторых компаний (рис. 2).



Рисунок 2




[Назад]    [Содержание ]    [Вперед]

  


  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017