Самоучитель по Delphi 7 для профессионалов

         

Добавление страниц к отчету



После создания первой страницы к отчету необходимо добавить еще две страницы и оформить их по образцу первой. Здесь все операции рутинны и не требуют дополнительных пояснений. В результате дерево проекта для отчета rptxp выглядит так, как показано на рис. 25.2.

Кроме обычных страниц, принадлежащих отчету, в Rave Reports можно создавать глобальные страницы, которые можно связать с любым отчетом проекта (например, титульные страницы). Для создания новой глобальной страницы используется команда File | New Global Page главного меню. Затем процесс разработки не отличается от обычных страниц.

Теперь для того, чтобы при просмотре или печати отчета отображались все страницы, а не только первая, необходимо дополнительно настроить свойство PageList отчета. В редакторе свойства необходимо перенести в список Page List все нужные страницы. Для этого страница выбирается из выпадающего списка Report Pages. Затем нужно щелкнуть на кнопке Add Page. Аналогичная операция выполняется и для глобальных страниц проекта, доступных в списке Global Pages.

Результат для отчета rptxp представлен на рис. 25.3.

Рис. 25.2. Дерево проекта SimpleDemo для отчета rptXP

Рис. 25.3. Редактор свойства PageList отчета rptXP

Используя кнопки слева в группе Page List, можно изменять порядок следования страниц при печати отчета или удалять страницы из списка.

Теперь отчет rptxp готов. Дополнительно к нему, с использованием тех же элементов и действий, в рассматриваемом нами примере создан еще один отчет rptRV. При этом по умолчанию текущим считается отчет, который при последнем сохранении проекта был текущим.

Проект отчета сохранен в файле SimpleDemo.RAV.



 



Использование элемента FontMaster



Невизуальный элемент FontMaster позволяет использовать одинаковые шрифты в элементах оформления, например, в пределах одной секции. Для этого необходимо перенести в секцию элемент FontMaster и задать в его свойстве Font нужные характеристики шрифта. После этого во всех элементах, которые будут использовать этот шрифт, в списке свойства FontMirror надо выбрать этот элемент FontMaster.

В результате, один раз настроив шрифт, можно применить его для любого числа элементов оформления.



Этапы создания отчета и включение его в приложение



Процесс создания отчета с использованием генератора отчетов Rave Reports состоит из трех этапов. Первый выполняется в визуальной среде Rave Reports, второй и третий — в среде разработки Delphi.

1. На первом этапе в визуальной среде Rave Reports создается проект отчета и в нем необходимые страницы, объекты доступа к данным (см. гл. 24). На страницах располагаются элементы оформления, при необходимости к ним подключаются просмотры данных (если отчет отображает информацию из таблиц базы данных) и объекты аутентификации пользователей отчетов. Создаются обработчики событий. И в завершение этапа готовый проект отчета сохраняется в файле с расширением rav.

2. На втором этапе в проект приложения в Delphi переносятся компоненты TRvProject и TRvSystem (см. г/?. 23) со страницы Rave Палитры компонентов. При этом в состав приложения автоматически включается ядро генератора отчета. Первый компонент связывается с файлом проекта отчета и представляет в приложении отчет со всеми его свойствами, страницами, элементами оформления и т. д. Второй компонент связывается с первым, взаимодействует с ядром генератора отчетов и обеспечивает печать отчета из приложения.

3. На третьем этапе создается программный код, обеспечивающий выполнение функций приложения, связанных с отчетом. Наряду со стандартными операциями предварительного просмотра и печати отчета это могут быть загрузка из файла и сохранение в файле, преобразование формата данных отчета, изменение содержания отчета в зависимости от выполненных пользователем действий и т. д. На этом этапе используются свойства, методы и методы-обработчики событий компонентов TRvProject и TRvSystem и других компонентов со страницы Rave Палитры компонентов.

Далее в этой главе мы подробно рассмотрим перечисленные этапы и различные аспекты программирования, связанные с ними.



Компонент TRvNDRWriter



Компонент TRvNDRWriter предназначен для сохранения отчетов в файлах. При этом используется двоичный формат NDR.

Приемник данных определяется свойством

type

TStreamMode = (smMemory, smTempFile, smFile, smUser); property StreamMode: TStreamMode;

smMemory — для вывода данных используется поток в памяти (объект типа TMemoryStream);

smTempFile — данные сохраняются во временном файле, в папке, определенной в операционной системе для хранения временных файлов;

smFile — данные сохраняются в файле;

smUser — данные передаются в поток, заданный разработчиком.

Имя файла, в котором будет сохранен отчет, определяется свойством

property FileName: String;

А для определения потока используется свойство

property Stream: TStream;

Таким образом, если вы хотите использовать для сохранения отчета файл, перед использованием компонент настраивается, например, так:

RvNDRWriterl.StreamMode := smFile; RvNDRWriterl.FileName := ReportFilePath;

Если вы планируете использовать поток, сделайте следующим образом:

var ReportStreara: TMemoryStreain;

ReportStream := TMemoryStream.Create/try

RvNDRWriterl.StreamMode := smUser;

RvNDRWriterl.Stream := ReportStream;

finally

ReportStream.Free; end;

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

procedure Start;

а по окончании создания отчета использовать метод

procedure Finish;

Например, следующий фрагмент кода создает в отчете текст с заданным положением:

with RvNDRWriterl do 

begin

Start;

Units := unMM;

SetFont('Times New Roman', 14);

Bold := True;

OriginX := 0.0;

OriginY := 0.0;

GotoXY(1.0, 12.0);

Print('Заголовок ttl');

GotoXY(6.0, 18.0);

Println('Заголовок 12');

GotoXY(6.0, 24.0);

Println('Заголовок 13');

GotoXY(6.0, 30.0);

PrintIn('Заголовок #4');

 Finish; 

end;

А вот так можно нарисовать прямоугольник и разместить в нем изображение:




with RvNDRWriterl do

begin

Start;

Units := unMM;

SetBrush(clBlue, bsSolid, nil);

Rectangle (5.0, 35.0, 65.0, 95.0);

Bitmap := TBitmap.Create;

Bitmap.LoadFromFile('factory.BMP');

PrintBitmapRect(10.0, 40.0, 60.0, 90.0, Bitmap);

Bitmap.Free;

Finish;

end;

В данном фрагменте кода метод

procedure PrintBitmapRect(XI,Y1,X2,Y2: double;

 Bitmap: TBitmap);

отображает растровое изображение Bitmap в прямоугольнике, обеспечивая его масштабирование в соответствии с размерами прямоугольника.

Внимание

Компонент TRvNDRWriter имеет свойство canvas (см. гл. 10), но использовать его нельзя — любые операции с канвой не возымеют действия и ваши труды не будут сохранены.

При использовании пары методов start и Finish не нужно предпринимать никаких дополнительных усилий для сохранения отчета — это будет сделано Методом Finish.

Множество других свойств и методов компонента (мы не будем останавливаться на них специально, т. к. их использование достаточно прозрачно) обеспечивают оформление отчета, управление страницами, настройку принтера и т. д.


Нумерация страниц отчета



В первую очередь создадим заголовок страницы и включим механизм нумерации страниц. Для этого перенесем на страницу элемент Section со страницы Standard Палитры инструментов и поместим его в верхней части страницы отчета. Эта секция будет объединять элементы оформления заголовка.

Поместим в секции элемент DataText — нам необходимо его свойство DataFieid. Редактор свойства Data Text Editor (рис. 25.1) позволяет настраивать свойство так, чтобы элемент мог отображать разнообразные данные. Сейчас нас интересуют номера страниц отчета.

Из списка Report Variables, который содержит глобальные переменные отчета, необходимо выбрать переменную RelativePage. Затем нужно щелкнуть на кнопке Insert Report Var и переменная Report.RelativePage появится в поле Data Text в нижней части диалога. Эта переменная при печати отчета будет содержать порядковый номер текущей страницы.

Рис. 25.1. Редактор свойства DataField элемента DataText

Аналогичным образом добавим переменную TotalPages, которая возвращает общее число страниц отчета. Затем вручную отредактируем текст в поле Data Text:

'Страница ' + Report.RelativePage + ' из ' + Report.TotaiPages

Шаблон номера страницы готов. Но для того, чтобы механизм нумерации заработал, необходимо перенести на страницу невизуальный элемент pageNuminit. Он будет работать автоматически. Единственное, что нужно сделать, — это настроить свойство initvalue, в котором задается номер начальной страницы.

Примечание 

Обратите внимание, что элемент PageNuminit должен быть только один и располагаться на первой странице, которая должна содержать свой номер. Иначе, на каждой странице, на которой есть такие элементы, нумерация начнется сначала.

 



Отчет в приложении



Теперь, когда проект SimpleDemo.RAV с двумя отчетами готов, перейдем к разработке приложения в Delphi.

Любое приложение, использующее генератор отчетов Rave Reports, должно иметь как минимум пару компонентов — TRvProject и TRvSystem. Первый из

них есть проект отчета в приложении. С его помощью разработчик получает доступ к отчетам проекта и их свойствам. Второй компонент обеспечивает использование ядра генератора отчетов Rave Reports при печати или предварительном просмотре отчета (см. рис. 23.1). Подробнее о свойствах и методах этих компонентов см. гл. 23.

При использовании этих компонентов в состав исполняемого кода приложения автоматически включается ядро генератора отчетов Rave Reports. Соответственно при распространении приложения не требуются дополнительные файлы — даже файл проекта отчета можно включить в приложение (см. ниже).

Компонент TRvProject необходимо связать с файлом проекта Simple-Demo. RAV. Для этого используется его свойство

property ProjectFile: string;

Файл RAV можно распространять вместе с приложением или включить его в состав исполняемого файла. Для этого используется свойство

property StoreRAV: boolean;

компонента (см. рис. 23.2).

Перед использованием отчетов из компонента TRvProject его необходимо открыть. В нашем примере при открытии формы приложения компонент открывается и в список считываются полные имена отчетов проекта и отображается описание текущего отчета:

procedure TfmMain.FormShow(Sender: TObject);

 begin

rpProject.Open;

rpProject.GetReportList(IbxRptLiat.Items, True);

rpProject.ReportDescToMemo(meDesc) ;

 end;

Но только один из отчетов доступен для использования одновременно. Для смены текущего отчета можно воспользоваться методом

function SelectReport(ReportName: string;

FullName: boolean): boolean;

Для идентификации текущего отчета компонент TRvProject имеет два свойства, которые возвращают его имя и полное имя. Это соответственно свойства ReportName и ReportFullName. При необходимости использовать имя отчета для одного из методов (например метод SelectReport) можно использовать оба имени. Во всех методах, где в качестве параметра применяется имя отчета, имеется дополнительный параметр FullName типа Boolean. При его значении True используется полное имя отчета.

Обратите внимание, что перед использованием любых свойств и методов, относящихся к отчету в компоненте TRvProject, отчет необходимо открыть.

Для этого используется метод open:

RvProjectl.Open;

или свойство 

Active: RvProjectl.Active := True;

Так же, если в процессе работы приложения в компонент TRvproject нужно загрузить новый проект отчета, процедуру открытия нужно повторить:

RvProjectl.Close;

RvProjectl.SetProjectFile

(dlgOpenProject.FileName);

RvProjectl.Open;

Компонент отчета необходимо связать с компонентом TRvSystem. Для этого в свойстве Engine компонента TRvproject необходимо задать ссылку на компонент TRvSystem.



Преобразование форматов данных



С компонентом TRvNDRWriter (вернее с файлами в формате NDR, которые он создает) взаимодействует ряд компонентов Rave Reports, которые обеспечивают преобразование данных из этого специфического формата в более распространенные форматы.

 Компонент TRvRenderpoF обеспечивает преобразование отчета в формат PDF для дальнейшего использования в Adobe Acrobat Reader.  Компонент TRvRenderHTML обеспечивает преобразование отчета в формат HTML.  Компонент TRvRenderRTF обеспечивает преобразование отчета в формат RTF.  Компонент TRvRenderText обеспечивает преобразование отчета в текстовый формат.

Все они используются по одной схеме.

Сначала необходимо загрузить отчет из файла NDR в поток.

После этого вызывается метод

procedure PrintRender(NDRStream: TStream; OutputFileName: TFileName);

который и выполняет преобразование:

var ReportStream: TMemoryStream;

ReportStream := TMemoryStream.Create;

try

ReportStream.LoadFromFile(NDRFilePath);

RvRenderHTMLl.NDRStream := ReportStream;

RvRenderHTMLl.PrintRender(ReportStream, 'sdf);

finally

ReportStream.Free; 

end;



Просмотр и печать отчета



Если в предыдущем пункте, обсуждая отчет в приложении Delphi, мы говорили о компоненте TRvproject, то за выполнение любых операций с ним отвечает компонент TRvSystem.

При стандартной настройке этого компонента при печати или предварительном просмотре отчета всегда отображается диалог настройки печати (см. рис. 23.4). Если отображение этого диалога необходимо, печать текущего отчета компонента TRvproject, с которым связан данный компонент TrvSystem. осуществляется методом

procedure Execute;

любого из этих компонентов.

Если диалог настройки печати не нужен, компонент TRvSystem позволяет выполнить операцию напрямую. Для этого необходимо выполнить несколько действий.

Сначала нужно настроить свойство

type

TReportDest = (rdPreview, rdPrinter, rdFile);

 property DefaultDest: TReportDest;

которое определяет, куда будет направлен отчет — в окно просмотра, на принтер или в файл.

Затем необходимо изменить свойство

type

SystemSetup = (ssAllowSetup, ssAllowCopies, ssAllowCollate,

ssAllowDuplex, ssAllowDestPreview, ssAllowDestPrinter, ssAllowDestFiie,

ssAllowPrinterSetup);

TSystemSetups = Set of TSystemSetup;

property SystemSetups: TSystemSetups;

убрав из него опцию ssAllowSetup, которая включена по умолчанию:

RvSysteml.SystemSetups := RvSysteml.SystemSetups — [ssAllowSetup];

и, наконец ,свойству

property DoNativeOutput: Boolean;

необходимо присвоить значение False, т. к. по умолчанию оно имеет значение True, которое и заставляет компонент показывать диалог настройки печати перед выполнением операции.

Обратите внимание на очень важную деталь — чтобы все сделанные настройки действительно сработали, печать отчета необходимо выполнять только методом Execute Компонента TRvProjeet.



Простой отчет в визуальной среде Rave Reports



При описании первого этапа наша задача — описать возможности проекта RAV, исследовать его структуру и составные части, которые можно использовать в приложении Delphi. Собственно элементы оформления просты в использовании и мы акцентируем внимание лишь на нескольких элементах, требующих небольших пояснений.

Для начала создадим в визуальной среде Rave Reports новый проект (команда File | New главного меню). Обратите внимание, что по умолчанию вместе с проектом создается первый отчет Reportl с одной страницей Pagel. Его мы и используем, переименовав в rptxp. Проекту присвоим имя simpleDemo.



Разработка, просмотр и печать отчетов



Мы уже обсуждали в предыдущих главах визуальную среду создания отчетов Rave Reports и набор компонентов Delphi на странице Rave Палитры компонентов, предназначенный для интегрирования отчета в приложение Delphi. В этой главе мы обратимся к практике разработки и использования отчетов Rave Reports в приложениях Delphi.

Рассматриваемые в данной главе примеры не отличаются изощренностью оформления и сложностью, но позволяют поэтапно проследить всю методику создания отчетов и использования их в приложениях и обладают основными атрибутами стандартных отчетов. В них имеются заголовки, нумерация страниц, выводится текстовая и графическая информация.

Но сам по себе отчет — это всего лишь шаблон, который необходимо включить в приложение. Для этого применяются компоненты Rave Reports, которые помимо этой важной функции реализуют еще несколько очень полезных операций. Это, например, возможность сохранения и загрузки отчета в файлах и преобразование типов данных отчета из базового формата RAV в наиболее популярные форматы.

Вопросы создания отчетов для баз данных здесь не затрагиваются и обсуждаются в следующей главе.

В этой главе рассматриваются следующие вопросы:

 разработка проекта отчета в визуальной среде Rave Reports;  использование компонентов TRvProject и TrvSystem;  просмотр и печать отчета;  использование в отчете внешних файлов;  преобразование форматов данных при помощи компонентов Rave Reports.

Приложение Delphi, которое реализует печать



Приложение Delphi, которое реализует печать отчетов, должно иметь в своем составе компоненты TRvProject и TRvSystem. Первый обеспечивает представление проекта отчета из файла RAV в приложении. Второй взаимодействует с ядром генератора отчетов и управляет печатью и предварительным просмотром отчетов.
Набор компонентов Rave Reports позволяет преобразовать формат данных отчета в наиболее распространенные форматы данных: HTML, RTF, PDF, TXT.

Сохранение отчета во внешнем файле



При помощи методов компонента TRvSystem можно сохранить отчет для последующей печати в формате PRN или сохранить проект Rave Reports в формате RAV.

Для реализации первого варианта необходимо в качестве источника печати указать файл:

...

if dlgSavePRN.Execute then begin

rsSystem.DoNativeOutput := False; 

rsSystem.DefaultDest := rdFile;

rsSystem.SystemSetups := rsSystem.SystemSetups — [ssAllowSetup]; 

rsSystem.OutputFileName := dlgSavePRN.FileName; 

rpProj ect.Execute; 

end;

...

Как видите, здесь мы воспользовались методикой прямой печати, описанной в предыдущем разделе, указав в качестве приемника файл с расширением ргп, выбранный в стандартном диалоге выбора файла.

Если же нужно сохранить проект отчета в файле с расширением rav, можно использовать метод SaveToFile компонента TRvproject:

if dlgSaveProject.Execute

then RvProjectl.SaveToFile(dlgSaveProject.FileName);

Также просто выполнить и обратную операцию — загрузить в компонент TRvProject проект отчета из файла, но при этом не забудьте закрыть текущий отчет:

RvProjectl.Close;

RvProjectl.LoadFromFile(dlgOpenProject.FileName);

RvProjectl.Open;

Аналогичную функцию выполняет метод

procedure SetProjectFile(Value: String);

компонента TRvProject.