Компоненты, использующие BDE. Компонент TRvCustomConnection.
Листинг 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, и вы увидите компонент нужного соединения. В этом случае объект прямого просмотра получит все необходимые поля, которые затем следует связать с элементами оформления отчета.