Компонент TRvCustomConnection
Компонент TRvCustomConnection обеспечивает доступ к самым разнообразным источникам данных. Фактически через этот компонент разработчик может передать в отчет все данные, какие только сможет загрузить в приложение. Причина столь удивительной универсальности кроется в том, что:
- во-первых, компонент изначально не ориентирован ни на один конкретный вид данных;
- во-вторых, работа по созданию строк отчета возлагается на разработчика, который должен использовать для этого методы-обработчики событий.
Повторим банальную истину, что чудес не бывает, и, как видите, за гибкость приходится расплачиваться дополнительным объемом работы.
Для того чтобы настроить соединение через компонент TRvCustomConnection, необходимо выполнить следующие действия.
1. Определить число строк отчета и установить его в компоненте.
2. Создать структуру данных отчета (метаданные). Здесь нужно решить, какие именно поля будут присутствовать в отчете, в каком порядке, дать им названия и определить их тип данных.
3. Создать процедуру, обеспечивающую передачу данных из источника данных в текущую строку отчета.
4. Связать компонент соединения с объектом прямого просмотра.
Обсудим эту последовательность действий более детально на простом примере. Создадим небольшое приложение, которое позволяет загружать текстовые файлы в два компонента TMemo. Перенесем на форму и настроим все необходимые компоненты Rave Reports.
Затем разработаем отчет, который печатает данные из этих двух компонентов в двух колонках. Отчет тоже несложен и состоит из полос заголовка и окончания, а также полосы данных с расположенными на ней двумя элементами Оформления DataText.
Наша задача сейчас — настроить компонент TRvCustomConnection так, чтобы он мог отображать данные из двух компонентовTMemo.
Листинг 26.1. Методы -обработчики событий компонента TRvCustomConnection, обеспечивающего соединение отчета с массивами Memo
procedure TfmMain.rcCustomOpen(Connection: TRvCustomConnection);
begin
Connection.DataRows := Max(meLeft.Lines.Count, meRight.Lines.Count);
i := 0;
end;
procedure TfmMain.rcCustomGetCols(Connection: TRvCustomConnection);
begin
Connection.WriteField('LeftColumn', dtString, 40, 'LeftColumn', '');
Connection.WriteField('RightColumn1, dtString, 40, 'RightColumn1, '');
end;
procedure TfmMain.rcCustomGetRow(Connection: TRvCustomConnection);
begin
if meLeft.Lines.Count >= i
then Connection.WriteStrData('', meLeft.Lines[i])
else Connection. WriteNullData; if meRight.Lines.Count >= i
then Connection.WriteStrData('', meRight.Lines[i])
else Connection. WriteNullData;
Inc(i);
end;
При открытии соединения в методе- обработчике onopen рассчитывается число записей, необходимое для отображения наиболее длинного из двух файлов.
Метод-обработчик onGetCols вызывается, когда отчету необходимы метаданные о наборе данных соединения. Здесь создаются два поля.
Для этого используется метод
procedure WriteField(Name: String; DataType; TRPDataType; Width: Integer; FullName: String; Description: String);
который создает поле в соответствии с переданными в нем параметрами.
И при печати отчета для каждой строки вызывается метод-обработчик OnGetRow, в котором задаются значения полей. Для каждого типа данных используется свой метод:
function WriteBCDData(FormatData: String; NativeData: Currency): String;
function WriteBlobData(var: Buffer; Len: Longint): String;
function WriteBoolData(FonnatCata: String; NativeData: Boolean): String;
function WriteCurrData(FormatData: String; NativeData: Currency): String;
function WriteDateTime(FormatData: String; NativeData: TDateTime);
function WriteFloatData(FomatData: String; NativeData: Extended): String;
function WritelntData(FormatData: String; NativeData: Integer): String;
function WriteNullData;
function WriteStrData(FormatData: String; NativeData: String): String;
Обратите внимание, что все эти методы не определяют, какому именно полю будет присвоено значение. Поэтому присваивание осуществляется в порядке следования полей: первый по порядку метод отправляет в отчет значение для первого поля, второй для второго и т. д.
Примечание
Методы-обработчики компонентов TRvCustomConnection и TRvDataSetConnection совпадают (см. выше разд. "Компонент TRvDataSetConnection" данной главы).
Теперь осталось связать соединение с проектом отчетов. Это делается стандартным образом — при создании объекта прямого просмотра. Но здесь есть одна особенность. Как уже говорилось выше, при создании прямого просмотра в нем автоматически создаются объекты полей, соответствующие полям набора данных. И теперь мы знаем, что у компонента соединения имеется специальный метод-обработчик OnGetCols, который вызывается при создании полей.
Однако, если вы создадите объект прямого просмотра обычным способом, визуальная среда Rave Reports создаст один-единственный объект поля, не имеющего ничего общего с реальными метаданными. Для того чтобы поля импортировались в проект отчета правильно, необходимо, чтобы при создании объекта просмотра приложение, содержащее компонент TRvDataSetConnection, было запущено. Тогда в диалоге выбора соединений (см. рис. 26.4) необходимо включить флажок Runtime, и вы увидите компонент нужного соединения. В этом случае объект прямого просмотра получит все необходимые поля, которые затем следует связать с элементами оформления отчета.