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

Доступ к объектам проекта отчета Rave Report в режиме RunTime

Ну вот, когда проведена большая работа по исследованию классов в проекте отчета Rave Report, наконец, можно приступить непосредственно к работе с отчетом в режиме RunTime. Еще раз напомню порядок доступа к активному (текущему) отчету Rave:
Для доступа к проекту отчета необходимо обратиться к классу TRaveProjectManager.
Для доступа к классу TRaveProjectManager следует обратиться к свойству ProjMan класса TRvProject.
Чтобы получить доступ к активному отчету, следует обратиться к свойству ActiveReport класса TRaveProjectManager.
То есть последовательность такого типа: TRvProject.ProjMan.ActiveReport.

Как вы уже знаете в отчете содержаться еще и страницы. К сожалению, разработчики не предоставили методов для навигации по страницам отчета (представлено только одно свойство FirstPage – первая страница), но это проблема вполне решаема. Ниже приведена процедура, которая возвращает список указателей на объекты (если таковые имеются), порожденных от указанного класса.

// Возвращает список указателей на объекты, порожденных от указанного класса FindClass
procedure GetObjectList(RootComponent: TComponent; FindClass: TClass; var PageList: TList);
var
I: Integer;
begin
PageList.Clear;
if (RootComponent = NIL) or (PageList = NIL) then EXIT;
for I := 0 to RootComponent.ComponentCount - 1 do
if RootComponent.Components[I] is FindClass then PageList.Add(RootComponent.Components[I]);
end;

Пример вызова процедуры:

GetObjectList(RvProjectRTR.ProjMan.ActiveReport, TRavePage, RavePageList);

Данный вызов процедуры заполняет список RavePageList указателями на все найденные страницы в текущем отчете. Теперь используя список RavePageList можно удобно осуществлять навигацию по страницам отчета, точно так же, как по списку отчетов представленный менеджером отчетов TRaveProjectManager. Список отчетов можно получить, обратившись к свойству ReportList класса TRaveProjectManager. Используя процедуру GetObjectList можно получить список и других объектов произошедших от определенного класса, что облегчает навигацию по объектам определенного типа.

Примечание: У класса TRaveReport в наличии есть свойство “PageList”. Данное свойство определяет порядок страниц при печати. Допустим, в отчете имеется 10 страниц, а в “PageList” указанно печатать 3-ю и 8-ю страницу. Тогда свойство “PageList.Count”, будет равным 2-ум, и доступ вы сможете получить только к 3-й и 8-й странице отчета. Если же в свойстве “PageList” нет ссылок на страницы отчета (PageList = NIL), то при попытке обратиться к данному свойству будет получено сообщение об ошибке. Поэтому не следует забывать специфику данного свойства.

Примечание: TRaveReport также предоставляет свойство “Page” доступное только для чтения. Можно было бы предположить, что данное свойство хранит ссылку на активную страницу текущего отчета, но по каким то причинам в данном свойстве все время присутствует значение равное NIL. Так что назначение данного свойства для меня пока неизвестно.

Слов сказано уже много, но на практике еще мало чего сделано. Думаю, настало время перейти к практической части. За основу, как оговаривалось в начале статьи, взят демонстрационный проект отчета “RaveDemo.rav”, вот над ним и будут производиться все опыты на практике. Для экспериментов возьмем, к примеру, отчет Mirror Report.

Попробуем изменить заголовок первой страницы у отчета Mirror Report. Для оттого необходимо:
Найти и активизировать отчет Mirror Report средством вызова метода SelectReport класса TRvProject.
Произвести поиск текстового элемента оформления TRaveText на первой странице отчета TRavePage. Для этого можно воспользоваться методом FindRaveComponent класса TRaveProjectManager, который в случае успешного поиска в качестве возвращаемого параметра вернет найденный объект, в противном случае возвратится NIL.
Убедиться, что искомый объект произошел от нужного класса.
Если искомый объект найден, то произвести с ним все необходимые манипуляции.
После внесенных изменений сгенерировать отчет методом Execute или ExecuteReport класса TRvProject.

Ниже представлен пример реализации всего выше изложенного.

 …
var
I: Integer;
TmpRaveComponent: TRaveComponent;
begin
// Поиск и активизация необходимого отчета. Метод вернет false если отчет не найден
if not RvProjectRTR.SelectReport('Mirror Report', true) then EXIT;
// Поиск компонента с именем 'Text1' на первой странице отчета
TmpRaveComponent := RvProjectRTR.ProjMan.FindRaveComponent('Text1',
RvProjectRTR.ProjMan.ActiveReport.FirstPage);
// Если объект найден, и он произошел от класса TRaveText
if (TmpRaveComponent <> NIL) and (TmpRaveComponent is TRaveText) then
begin
// Замена выводимого текста
TRaveText(TmpRaveComponent).Text := 'Это мой новый заголовок';
// Изменение стиля шрифта
TRaveText(TmpRaveComponent).Font.Style := [fsItalic];
end;
// Генерация активного отчета
RvProjectRTR.Execute;
end;
…

Как видите, ничего особо сложного нет. Найдя необходимый объект в отчете с ним можно делать почти все что угодно. Почему почти? Когда вы исследовали визуальные элементы оформления отчета средствами RTTI, то, может быть, обратили внимание на то, что все эти компоненты не имеют свойства Visible, хотя данное свойство уже доступно начиная с класса TRaveComponent. К сожалению, разработчики по каким то причинам не стали учитывать значение свойства Visible, что в принципе огорчает. Все-таки иногда может возникнуть необходимость скрыть, что-либо из отчета в зависимости от событий в программе.

Есть возможность имитировать свойство Visible используя свойство Parent нужного объекта. Чаще всего в качестве родителя объектов выступает страница отчета, но для группировки визуальных компонентов отчета в качестве родителя может выступать компонент-контейнер TRaveSection (также группировку объектов выполняют TRaveRegion и TRaveDataBand). Если визуальному компоненту не будет указан родитель в свойстве Parent, т.е. значение равное NIL, то данный объект не будет отображен в сгенерированном отчете. Для имитации свойства Visible объектов вновь обратимся к отчету Mirror Report. В данном отчете скроем все элементы оформления TRaveRectangle путем скрытия объектов TRaveSection.

Последовательность действий будет следующей:
Найти и активизировать отчет Mirror Report средством вызова метода SelectReport класса TRvProject.
Пробежаться по всем дочерним компонентам страницы и найти компоненты производные от класса TRaveSection.
У компонентов TRaveSection в свойстве Parent проверить наличие родителя. Если родительский компонент назначен, то данному свойству присвоить значение NIL (скрытие объекта), в ином случае данному свойству в качестве родителя присвоить страницу отчета (отображение объекта на странице).
После внесенных изменений сгенерировать отчет.

Возможно, некоторые задались вопросом, – почему бы сразу не скрыть TRaveRectangle напрямую, а через объект TRaveSection? Все возможно, но в данном случае:
Элементы оформления TRaveRectangle объединены в группу компонентом TRaveSection. Следовательно, у объектов TRaveRectangle общий родитель TRaveSection. При назначении свойству Parent значения NIL у объекта TRaveSection, данный объект теряет родителя и скрывается со всеми его дочерними компонентами TRaveRectangle.
Если каждому объекту TRaveRectangle в свойстве Parent указать значение равное NIL, а затем в данном свойстве в качестве нового родителя указать страницу отчета, то данные компоненты окажутся не на своем месте. Это вызвано тем, что значения в свойствах Left и Top компонента 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. Для этого необходимо:
Создать объект производный от TRaveRectangle и придать ему нужное оформление.
Подогнать размеры TRaveRectangle под размеры TRaveText.
Поместить объект 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;
…

В режиме RunTime вполне самостоятельно возможно создать: отчет, страницу отчета, визуальные элементы оформления или другие объекты, поддерживаемые отчетом Rave Report. Для создания нового отчета необходимо обратиться к методу NewReport менеджера отчетов TRaveProjectManager. В качестве возвращаемого параметра, возвращается объект порожденный от класса TRaveReport вновь созданного отчета. Для создания новой страницы для отчета следует обратиться к методу NewPage класса TRaveReport. Данный метод, как и в предыдущей ситуации, в качестве возвращаемого параметра возвращает объект типа TRavePage вновь созданной страницы отчета.

Примечание: При создании нового отчета автоматически создается и новая страница.

При создании многостраничного отчета не следует забывать про свойство GotoPage компонента TRavePage или свойство PageList компонента TRaveReport, ведь данные свойства содержат указатели на следующую генерируемую страницу отчета. Если не воспользоваться ни одним из представленных свойств, то при генерации отчета будет сгенерированна только первая страница отчета. При создании новой страницы или отчета в RunTime нет необходимости указывать вновь созданным объектам хозяина или родителя компонента, все это, данные методы NewReport и NewPage осуществляют самостоятельно. При создании визуальных и не визуальных компонентов следует указать хозяина объекта. Если в качестве хозяина будет передано значение равное NIL, то после завершения работы с данными объектами, программист должен уничтожить их самостоятельно, воспользовавшись методом “Free” данного объекта. Для всех визуальных элементов оформления отчета следует обязательно указывать нужного родителя в свойстве Parent. Вспомните имитацию скрытия объектов в отчете. Также учитывайте установленную единицу измерения в проекте отчета, для верного размещения визуальных объектов в отчете, иначе можете удивиться полученному результату.

В ниже приведенном примере создается отчет с двумя страницами. На первой странице создается текстовый элемент оформления TRaveText, а на второй странице компонент TRaveBitMap для вывода графического изображения.

 Const
NewRep = 'MyNewReport'; // Имя отчета (динамически создаваемого)
FieldStr = 'FieldStr'; // Имя строкового поля
FieldInt = 'FieldInt'; // Имя целочисленного поля
NewDataView = 'NewDataView'; // Имя компонента для посредника с источником данных
…

// Вычисление позиции точки в процентах относительно ширины/высоты визуального компонента
function SetPointInPercent(RaveControlWH: TRaveUnits; Percent: Byte): TRaveUnits;
begin
Result := (RaveControlWH / 100) * Percent;
end;

…
const
Picture = '1.bmp';
var
TmpRaveReport: TRaveReport;
TmpRavePage: TRavePage;
TmpRaveText: TRaveText;
TmpRaveBitMap: TRaveBitmap;
TmpPageList: TRaveComponentList;
begin
// Если отчет уже создан, то выходим
if RvProjectRTR.SelectReport(NewRep, true) then EXIT;
// Добавление нового отчета в проект и заполнение его свойств
TmpRaveReport := RvProjectRTR.ProjMan.NewReport;
with TmpRaveReport do
begin
Name := NewRep;
FullName := NewRep;
// Создание новой страницы для отчета (здесь будет графическое изображение)
TmpRavePage := NewPage;
// Указывается следующая страница для генерации отчета,
// после того, как будет сгенерированна первая страница отчета
TmpRaveReport.FirstPage.GotoPage := TmpRavePage;
end;
// Создание компонента для вывода графического изображения и заполнение его свойств
TmpRaveBitMap := TRaveBitMap.Create(TmpRavePage);
with TmpRaveBitMap do
begin
Name := 'MyNewRaveBitMap';
Left := SetPointInPercent(TmpRavePage.PageWidth, 5);
Top := SetPointInPercent(TmpRavePage.PageHeight, 20);
Width := SetPointInPercent(TmpRavePage.PageWidth, 30);
Height := SetPointInPercent(TmpRavePage.PageHeight, 30);
// Загрузка графического изображения (если найден указанный файл)
if FileExists(Picture) then Image.LoadFromFile(Picture);
// Размеры изображения будут подогнаны под клиентские размеры компонента
MatchSide := msBoth;
// Родителем данного компонента будет страница TmpRavePage
Parent := TmpRavePage;
end;
// Создание элемента TRaveText и заполнение его свойств
TmpRaveText := TRaveText.Create(TmpRaveReport.FirstPage);
with TmpRaveText do
begin
Left := SetPointInPercent(TmpRaveReport.FirstPage.PageWidth, 10);;
Top := SetPointInPercent(TmpRaveReport.FirstPage.PageHeight, 15);;
Font.Size := 18;
Name := 'MyNewRaveText';
// Родителем данного объекта будет первая страница отчета
Parent := TmpRaveReport.FirstPage;
Text := 'Этот текст расположен на первой странице отчета';
end;
// Заполение свойств страницы TmpRavePage
with TmpRavePage do
begin
Name := 'MyNewRavePage';
FullName := 'Моя новая страница';
end;
// Создание списка генерируемых страниц
TmpPageList := TRaveComponentList.Create;
TmpPageList.Add(TmpRavePage);
TmpPageList.Add(TmpRaveReport.FirstPage);
TmpRaveReport.PageList := TmpPageList;
// Обновление списка доступных отчетов
RvProjectRTR.GetReportList(ListReport.Items, True);
end;
…

В данном примере для перехода к следующей генерируемой странице применены оба свойства PageList и GotoPage. Чтобы лучше понять их принцип работы создайте новый отчет по выше представленному примеру и сгенерируйте его.

 …
if RvProjectRTR.SelectReport('Мой новый отчет', true) then RvProjectRTR.Execute;
…

Как видите, отчет сгенерировал три страницы. Это происходит потому, что сначала осуществляется проход по списку в свойстве PageList (если он не пуст). Вновь генерируемая страница из этого списка также проверяет свое свойство GotoPage на наличие перехода на другую страницу. После генерации страницы указанной в свойстве GotoPage (если данное свойство указывает на страницу) продолжается обход по списку PageList. Следует соблюдать осторожность при указании порядка генерации страниц отчета, при задании неверного порядка может произойти бесконечный цикл генерации страниц (если данный случай имеет место быть).

Схематично это можно отобразить так (в скобках указан порядок генерации страниц):

Если очистить список страниц у отчета в свойстве PageList (все в том же выше приведенном примере) и вновь сгенерировать отчет, то результат соответственно будет совсем другим.

 …
if RvProjectRTR.SelectReport('Мой новый отчет', true) then
begin
RvProjectRTR.ProjMan.ActiveReport.PageList := NIL;
RvProjectRTR.Execute;
end;
…

Можно в отчете в RunTime подключить и источник данных. Как оговаривалось выше эти функции выполняют основные классы: TRaveDataView, TRaveDataField и собственно сам источник данных, например TRvDataSetConnection.
Условимся, что некий источник данных в проекте уже существует и содержит некоторые данные. В данном случае рассмотрим пример подключения к текстовому типу поля таблицы. Для начала нам потребуется “связной” с источником данных – TRaveDataView. Для того, чтобы созданный “связной” присутствовал в проекте отчета Rave Report его нужно добавить в список подключенный модулей данных, воспользовавшись методом Add свойства DataObjectList у класса TRaveProjectManager. У созданного объекта TRaveDataView достаточно заполнить четыре основных свойства: Name – имя компонента, Parent - родительский компонент (TRaveProjectManager), DataCon.Connection – подключаемый источник данных (в данном примере TRvDataSetConnection), ConnectionName – имя подключаемого источника данных.
Далее необходимо найти необходимое поле в источнике данных TDataSet воспользовавшись методом FindField и выяснить к какому типу данных это поле принадлежит. После определения типа поля в источнике данных необходимо создать соответствующее (совместимое) поле данных TRaveDataField для отчета Rave Report. Для TRaveDataField также достаточно заполнить четыре основных свойства: Name – имя компонента, FieldName – имя поля, Parent – родительский компонент (TRaveDataView), DataIndex – порядковый номер в списке полей источника данных (таблице).
При необходимости в отчете можно создать TRaveRegion, TRaveDataBand, TRaveDataText (если не созданны). Будем считать, что данные объекты уже созданы в проекте отчета Rave Report. Для TRaveDataBand, TRaveDataText следует указать поставщика источников данных (TRaveDataView) воспользовавшись свойством DataView этих классов. Для TRaveDataText следует дополнительно указать имя поля, из которого будет производиться выборка данных, для чего следует обратиться к свойству DataField этого класса.

Пример реализации подключения источника данных приведен ниже. Данный пример присоединяет источник данных к вновь созданному отчету (‘MyNewReport‘ – рассмотренному выше).

 …
var
TmpRaveReport: TRaveReport;
TmpDataView: TRaveDataView;
TmpDataField: TRaveDataField;
TmpRaveRegion: TRaveRegion;
TmpRaveDataBand: TRaveDataBand;
TmpRaveDataText: TRaveDataText;
TmpField: TField;
begin
TmpDataField := NIL;
if not RvProjectRTR.SelectReport(NewRep, true) then EXIT;
if (ADOTableRTR.FieldCount < 1) or (not ADOTableRTR.Active) then EXIT;
// Поиск строкового поля
TmpField := RvDataSetConnectionRTR.DataSet.FindField(FieldStr);
if TmpField = NIL then EXIT;
TmpRaveReport := RvProjectRTR.ProjMan.ActiveReport;
// Создание TRaveDataView обеспечивающий работу с источником данных
TmpDataView := TRaveDataView.Create(RvProjectRTR.ProjMan);
RvProjectRTR.ProjMan.DataObjectList.Add(TmpDataView);
with TmpDataView do
begin
Name := NewDataView;
Parent := RvProjectRTR.ProjMan;
DataCon.Connection := RvDataSetConnectionRTR;
ConnectionName := TmpDataView.DataCon.Connection.Name;
end;

// В зависимости от типа данных поля создается поле данных для отчета
// Rave Report соотвествующего типа
case TmpField.DataType of
ftString,
ftWideString: TmpDataField := TRaveStringField.Create(TmpDataView);
ftInteger: TmpDataField := TRaveIntegerField.Create(TmpDataView);
end;
if TmpDataField = NIL then EXIT;
// Заполение свойств поля данных
with TmpDataField do
begin
Name := TmpField.Name; // Имя компонента
FieldName := TmpField.FieldName; // Имя поля
FullName := TmpField.DisplayName; // Альтернативное имя поля
// Порядковый номер в списке полей источника данных (таблице)
DataIndex := TmpField.Index;
Parent := TmpDataView; // Родительский компонент
end;
// Создание TRaveRegion на котром будут расположены компоненты для работы с источником данных
TmpRaveRegion := TRaveRegion.Create(TmpRaveReport.FirstPage);
with TmpRaveRegion do
begin
Name := 'NewRaveRegion';
Parent := TmpRaveReport.FirstPage;
Left := SetPointInPercent(TmpRaveReport.FirstPage.PageWidth, 5);
Top := SetPointInPercent(TmpRaveReport.FirstPage.PageHeight, 15);
Width := SetPointInPercent(TmpRaveReport.FirstPage.PageWidth, 70);
Height := SetPointInPercent(TmpRaveReport.FirstPage.PageHeight, 60);
end;
// Создание TRaveDataBand для размещения елементов оформления отчета на нем
TmpRaveDataBand := TRaveDataBand.Create(TmpRaveRegion);
with TmpRaveDataBand do
begin
Name := 'NewDataBand';
Parent := TmpRaveRegion;
Left := SetPointInPercent(TmpRaveRegion.Width, 5);
Top := SetPointInPercent(TmpRaveRegion.Height, 5);
Width := SetPointInPercent(TmpRaveRegion.Width, 90);
Height := SetPointInPercent(TmpRaveRegion.Height, 5);
DataView := TmpDataView;
end;
// TRaveDataText обеспечит отображение информации из источника данных
TmpRaveDataText := TRaveDataText.Create(TmpRaveDataBand);
with TmpRaveDataText do
begin
Name := 'NewDataText';
Parent := TmpRaveDataBand;
Left := SetPointInPercent(TmpRaveDataBand.Width, 1);
Top := SetPointInPercent(TmpRaveDataBand.Height, 1);
Width := SetPointInPercent(TmpRaveDataBand.Width, 50);
DataView := TmpDataView;
DataField := TmpDataField.FieldName;
end;
RvProjectRTR.ExecuteReport(NewRep);
…

Создав новый отчет или изменив существующий можно сохранить внесенные изменения. Чтобы ваши труды не пропали даром, измененный проект отчета можно сохранить, воспользовавшись методом Save. Если возникнет необходимость сохранить проект отчета Rave Report под другим именем, то следует изменить имя файла проекта в свойстве ProjectFile или воспользоваться методом SetProjectFile перед сохранением проекта. Все данные свойства и методы доступны у менеджера отчета TRvProject или TRaveProjectManager. Пример сохранения проекта отчета под другим именем:

 …
// Сохраниение новго отчета под именем 'TestSave.rav'
RvProjectRTR.SetProjectFile('TestSave.rav');
RvProjectRTR.Save;
…

P.S. Ну, вот вроде и все о чем хотелось поведать. Надеюсь после выхода данной статьи, у пользователей генератора отчета Rave Report работа хоть сколько-то облегчится. Если вы заметили какие-либо ошибки, недочеты в данной статье, а также если у вас есть какие либо предложения или дополнения к данной статье, то все ваши отзывы будут приятны здесь: Sun-bittern@mail.ru

Турушев Виталий (Sun bittern ©).
Нижний Тагил 2004г.
Литература:
Стив Тейксейра и Ксавье Пачеко “DELPHI 5 Руководство разработчика. Том 2. Разработка компонентов и работа с базами данных”.

Автор статьи:  Турушев Виталий

Comments are closed.