Работа с отчетами Rave Report в режиме RunTime

При назначении свойству «Parent» значения NIL у объекта TRaveSection, данный объект теряет родителя и скрывается со всеми его дочерними компонентами TRaveRectangle. 1.Если каждому объекту TRaveRectangle в свойстве «Parent» указать значение равное NIL, а затем в данном свойстве в качестве нового родителя указать страницу отчета, то данные компоненты окажутся не на своем месте. Это вызвано тем, что значения в свойствах «Left» и «» компонента TRaveRectangle получены относительно клиентской части компонента TRaveSection. Отсюда вывод, что для корректного восстановления объектов для каждого TRaveRectangle нужно указать своего прежнего родителя, а это несколько усложняет подход к данной задаче. Но при необходимости все это возможно реализовать. Ниже представлен фрагмент кода, имитирующий скрытие объектов.

...
var
 I: Integer;
 TmpRaveComponent: TRaveComponent;
begin
 // Поиск и активизация необходимого отчета. Метод вернет false если отчет не найден
 if not RvProjectRTR.SelectReport('Mirror Report', true) then
  EXIT;
 // Проход по всем объектам первой страницы отчета
 for I := 0 to RvProjectRTR.ProjMan.ActiveReport.FirstPage.ComponentCount - 1
  do
  // Если объект является TRaveSection
  if RvProjectRTR.ProjMan.ActiveReport.FirstPage.Components[I] is TRaveSection
  then
  begin
  TmpRaveComponent :=
  TRaveComponent(RvProjectRTR.ProjMan.ActiveReport.FirstPage.Components[I]);
  // Если данный объект не имеет родителя, то в качестве
  // родителя указывается первая страница отчета
  if TmpRaveComponent.Parent = nil then
  TmpRaveComponent.Parent := RvProjectRTR.ProjMan.ActiveReport.FirstPage
  // Если объект имеет родителя, то уничтожается ссылка на родителя,
  // что в следствии приводит к скрытию объекта
  else
  TmpRaveComponent.Parent := nil;
  end;
 // Генерация активного отчета
 RvProjectRTR.Execute;
 ...

Примечание: Вместо свойства «Visible» разработчики предусмотрели свойство «DisplayOn» у визуальных элементов оформления. Данное свойство позволяет установить, в каком случае отображать данный элемент оформления. Отображать: только при предварительном просмотре, только при выводе на печать, отображать в обоих случаях или наследовать настройки родителя. Изменение значения данного свойства упорно игнорируется визуальными компонентами. Очень жаль.
Рассмотрим еще одну проблему при оформлении отчета. Следует обратить внимание на отсутствие привычных свойств у некоторых визуальных компонентов. Возьмем, например компонент для вывода текста (TRaveText – аналог компонента TLabel). Данный компонент не предоставляет свойства для выбора фонового цвета (цвет кисти Brush) и по умолчанию является прозрачным.
На заметку: Фоновый цвет TRaveText останется прозрачным в том случае, если сгенерировать отчет, вызвав метод «Execute» или «ExecuteReport» класса TRvProject. Если отчет сгенерировать из среды разработки Rave Report, то фоновая заливка белого цвета под текстом останется непрозрачной. Такая вот недоработка присутствует в Rave Report.
Также в данном компоненте отсутствует свойство, определяющее его высоту. Не найдется там и привычное свойство «AutoSize» для выравнивания клиентского размера объекта под размер выводимого текста. Отчасти некоторые недостатки можно имитировать. Для придания фонового цвета можно подложить под компонент, к примеру, элемент оформления прямоугольник (TRaveRectangle).
Создать имитацию фонового цвета для текста в редакторе событий «Event Editor» весьма проблематично. Данная проблема выражается в следующем: т.к. в TRaveText не предоставлено свойство «Height» определяющее его высоту, то соответственно нет возможности получить точный размер по высоте компонента. Следовательно, при изменении размера шрифта компонента придется вручную подгонять высоту компонента TRaveRectangle. Также попытка получить доступ к свойству «BoundsRect, Height» (или к другому свойству или методу, не предоставленному в инспекторе объектов среды разработки отчета Rave Report) компонента может привести к плачевным результатам (даже если компиляция кода в «Event Editor» прошла успешно). В лучшем случае можно отделаться сообщением об ошибке, в худшем – критическое завершение работы генератора отчета Rave Report c потерей всех несохраненных данных, а при работе под
Windows 98 возможен полный «крах» системы.
Как видите, редактор событий «Event Editor» не предоставляет таких гибких возможностей для работы, как доступ к объектам в режиме RunTime. Для имитации фонового цвета как упоминалось выше вполне можно применить TRaveRectangle. Для этого необходимо: 1.Создать объект производный от TRaveRectangle и придать ему нужное оформление. 1.Подогнать размеры TRaveRectangle под размеры TRaveText. 1.Поместить объект TRaveRectangle на задний план, воспользовавшись методом объекта «SendToBack».
Реализация имитации фонового цвета под текстом представлена ниже. В данном случае не удалось только создать имитацию «AutoSize» для объекта TRaveText:

...

var

 I: Integer;

 TmpRaveComponent: TRaveComponent;

 TmpRavePage: TRavePage;

 BGRect: TRaveRectangle;

begin

 // Поиск и активизация необходимого отчета. Метод вернет false если отчет не найден

 if not RvProjectRTR.SelectReport('Mirror Report', true) then

  EXIT;

 TmpRavePage := RvProjectRTR.ProjMan.ActiveReport.FirstPage;

 // Поиск компонента с именем 'Text1' на первой странице отчета

 TmpRaveComponent := RvProjectRTR.ProjMan.FindRaveComponent('Text1',

  TmpRavePage);

 // Если объект найден, и он произошел от класса TRaveText

 if (TmpRaveComponent <> nil) and (TmpRaveComponent is TRaveText) then

 begin

  // Создание графического примитива - прямоугольник

  BGRect := TRaveRectangle.Create(TmpRavePage);

  // Заполнение свойств вновь созданного объекта

  with BGRect do

  begin

  Name := 'BackGroundRect';

  FillColor := clYellow;

  BorderStyle := psClear;

  // Указание родителя компонента

  Parent := TmpRavePage;

  // Подгонка размеров прямоугольника под размеры компонента TRaveText

  BoundsRect := TRaveText(TmpRaveComponent).BoundsRect;

  // Перемещение объекта на задний план

  SendToBack;

  end;

 end;

 // Генерация активного отчета

 RvProjectRTR.Execute;

end;

...

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...