Engine オブジェクトの使用
Engine オブジェクトが、レポートの構築を管理するレポートのエンジンを表すということは、既に述べました。ページ上にバンドを配置する処理は、エンジンのプロパティおよびメソッドを使用することにより管理できます。まず、いくつかの理論があります。
下図は、レポート ページのさまざまなサイズを示しています。
ページの物理的なサイズは、PaperWidth
プロパティと PaperHeight
プロパティです。これらは、ページが選択されているときにオブジェクト インスペクターで見ることができます。したがって、A4 用紙のサイズは 210 x 297 mm になります。
PageWidth
および PageHeight
は印刷可能な領域の大きさであり、通常、用紙の物理的サイズよりも小さくなります。印刷可能領域のサイズは、レポート ページのプロパティの LeftMargin
、TopMargin
、RightMargin
、および BottomMargin
によって決まります。印刷可能領域のピクセル単位のサイズは、Engine.PageWidth
および Engine.PageHeight
関数によって返されます。
最後に、FreeSpace
はページ上の空き領域の高さです。ページ上に "ページ フッター" バンドがある場合は、FreeSpace
を計算する際にその高さが考慮されます。この高さは、Engine.FreeSpace
関数によってピクセル単位で返されます。
次のバンドを表示した後にページ上の空き領域が減り、そのことが
FreeSpace
を計算する際に考慮されるということに留意してください。
レポート ページはどのように構築されるのでしょうか?FastReport のコアは、十分な空き領域がある限りページにバンドを表示します。残りの空き領域がなくなると、ページ フッター バンドが出力され(必要な場合)、新しい空のページが作成されます。
既に述べたように、次のバンドを表示した後、空き領域の高さは減ります。さらに、次のバンドの表示は、X 軸と Y 軸の座標によって定義される現在の位置から開始されます。
現在の位置は、それぞれ
Engine.CurX
プロパティとEngine.CurY
プロパティによって返されます。
次のバンドの出力後、その出力されたバンドの高さが自動的に CurY
へ加算されます。新しいページが作成された後、CurY
は 0 になります。CurX
は、複数列レポートを出力するときに変更されます。
Engine.CurX
および Engine.CurY
は、取得だけでなく設定にも使用できます。つまり、これらの値を増減することで、バンドを移動させることができるということです。たとえば、次のようなレポートがあるとします。
次のように出力することができます。
これは、バンドの OnBeforePrint イベントにハンドラーを記述することによって実現されます。
Pascal スクリプト:
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
Engine.CurX := Engine.CurX + 5;
end;
C++ スクリプト:
void MasterData1OnBeforePrint(TfrxComponent Sender)
{
Engine.CurX = Engine.CurX + 5;
}
CurY
を変更すると、たとえば次のように、バンドを重なり合った状態にすることができます。
次のスクリプトによって実現されます。
Pascal スクリプト:
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
Engine.CurY := Engine.CurY - 15;
end;
C++ スクリプト:
void MasterData1OnBeforePrint(TfrxComponent Sender)
{
Engine.CurY = Engine.CurY - 15;
}
Engine.NewPage
メソッドは、レポート内の任意の必要な場所に改ページを挿入し、その後、新しい出力ページの先頭から出力を続行します。この例では、2 番目のレコードを出力した後に改ページを挿入します。
Pascal スクリプト:
procedure MasterData1OnAfterPrint(Sender: TfrxComponent);
begin
if <Line> = 2 then
Engine.NewPage;
end;
C++ スクリプト:
void MasterData1OnAfterPrint(TfrxComponent Sender)
{
if (<Line> == 2)
Engine.NewPage();
}
ここで留意すべき点は、OnAfterPrint イベントを使用したことです(つまり、バンドが出力された後です)。また、Line
システム変数はレコードの連続番号を返すという点に注目してください。
Engine.NewColumn
メソッドは、複数列レポートに段区切りを挿入します。ページ上に空いている列がなくなると、新しいページが作成されます。