Применение объекта Outline

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

 

       Для автоматического формирования дерева почти все бэнды имеют свойство OutlineText, в которое можно поместить строку-выражение. Выражение будет вычислено при формировании отчета и его значение при печати бэнда будет добавлено в дерево. При этом иерархия элементов в дереве повторяет иерархию бэндов в отчете. Это значит, что в дереве будут главные и подчиненные элементы, соответствующие главным и подчиненным бэндам в отчете (пример – отчет с двумя уровнями данных или с группами). Рассмотрим работу с деревом на примере отчета с группами, который мы изучали ранее.

 

clip0189

 

       Укажем значение свойства бэнда GroupHeader1.OutlineText равным <Group."Company">. При запуске отчета мы увидим следующее:

 

clip0190

 

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

 

       Давайте добавим второй уровень в дерево отчета. Для этого надо всего лишь установить свойство бэнда MasterData.OutlineText равным <Group."OrderNo">. При этом дерево будет выглядеть так:

 

clip0191

 

       Как видим, теперь возможна навигация и по номерам заказов, причем иерархия элементов дерева повторяет иерархию отчета.

 

       Теперь покажем, как сформировать аналогичное дерево с помощью скрипта, без использования свойства OutlineText. В нашем отчете очистим свойства OutlineText обоих бэндов и создадим два обработчика событий GroupHeader1.OnBeforePrint и MasterData1.OnBeforePrint:

 

PascalScript:

 

procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent);

begin

Outline.LevelRoot;

Outline.AddItem(<Group."Company">);

end;

 

procedure MasterData1OnBeforePrint(Sender: TfrxComponent);

begin

Outline.AddItem(<Group."OrderNo">);

Outline.LevelUp;

end;

 

begin

 

end.

 

 

C++ Script:

 

void GroupHeader1OnBeforePrint(TfrxComponent Sender)

{

Outline.LevelRoot;

Outline.AddItem(<Group."Company">);

}

 

void MasterData1OnBeforePrint(TfrxComponent Sender)

{

Outline.AddItem(<Group."OrderNo">);

Outline.LevelUp;

}

 

{

 

}

 

       Запустив отчет, убедимся, что он работает аналогично предыдущему отчету, где дерево формировалось автоматически. Рассмотрим, как происходит формирование дерева.

 

       Метод Outline.AddItem добавляет к текущему узлу дерева дочерний узел и делает его текущим. Таким образом, если несколько раз подряд вызвать AddItem, то получится "лесенка" типа

 

Item1

Item2

   Item3

     ...

 

Для управления текущим элементом служат методы Outline LevelUp и LevelRoot. Первый метод перемещает указатель на элемент, расположенный уровнем выше. Так, скрипт

 

Outline.AddItem('Item1');

Outline.AddItem('Item2');

Outline.AddItem('Item3');

Outline.LevelUp;

Outline.AddItem('Item4');

 

построит дерево вида

 

Item1

Item2

   Item3

   Item4

 

т.е. элемент Item4 будет являться дочерним по отношению к элементу Item2. Метод LevelRoot передвигает текущий элемент в корень дерева. Например, скрипт

 

Outline.AddItem('Item1');

Outline.AddItem('Item2');

Outline.AddItem('Item3');

Outline.LevelRoot;

Outline.AddItem('Item4');

 

построит дерево вида

 

Item1

Item2

   Item3

Item4

 

       После этих разъяснений понятно, как работает наш отчет. Каждый раз при печати заголовка группы текущим элементом делается корень дерева, куда добавляется имя компании. После этого печатается список заказов, и каждый заказ добавляется в виде дочернего элемента компании. Чтобы номера заказов располагались на одном уровне, а не выводились в виде "лесенки", в скрипте делается переход на уровень вверх с помощью метода Outline.LevelUp.