レポートへのカスタム関数の接続
FastReport は、レポート デザインに使用するための、多数の組み込み標準関数を備えています。また、独自のカスタム関数を追加する機能もあります。関数の接続は、FastReport に含まれている、FastScript スクリプト ライブラリ インターフェイスを使用して実行されます(FastScript の詳細については、付属するライブラリ マニュアルを参照してください)。
どのようにしてプロシージャや関数を接続できるのか、例を示します。関数のパラメーターの個数と型は異なることがあります。Set および Record 型のパラメーターを渡すことはできません。これらは、FastScript でサポートされていません。そのようなパラメーターは単純な型として、たとえば、TRect
は X0, Y0, X1, Y1: Integer として渡す必要があります。さまざまなパラメーターを持つ関数を追加する処理の詳細については、FastScript ドキュメントを参照してください。
Delphi のフォーム上で、関数およびプロシージャとそのコードを宣言します。
function TForm1.MyFunc(s: String; i: Integer): Boolean;
begin
// 必要なロジック
end;
procedure TForm1.MyProc(s: String);
begin
// 必要なロジック
end;
レポート コンポーネントの onuser 関数ハンドラーを作成します。
function TForm1.frxReport1UserFunction(const MethodName: String;
var Params: Variant): Variant;
begin
if MethodName = 'MYFUNC' then
Result := MyFunc(Params[0], Params[1])
else if MethodName = 'MYPROC' then
MyProc(Params[0]);
end;
レポート コンポーネントの Add メソッドを使用して、関数一覧に追加します(通常、Delphi フォームの on create または on show イベントで行います)。
frxReport1.AddFunction('function MyFunc(s: String; i: Integer): Boolean');
frxReport1.AddFunction('procedure MyProc(s: String)');
これで、接続された関数をレポート スクリプトで使用できるようになりました。さらに、それを TfrxMemoView
型のオブジェクトから参照することができます。また、この関数は、[データ ツリー]ウィンドウの[関数]ページ タブにも表示されます。このウィンドウでは、関数はカテゴリ別に分かれており、どれか関数を選択すると、その関数に関するヒントがウィンドウの下部ペインに表示されます。
関数を別々のカテゴリに登録し、関数の説明ヒントを表示するように、上のコード サンプルを変更します。
frxReport1.AddFunction('function MyFunc(s: String; i: Integer): Boolean', 'My functions', ' MyFunc function always returns True');
frxReport1.AddFunction('procedure MyProc(s: String)', 'My functions', ' MyProc procedure does not do anything');
これで、追加した項目が "My Functions" カテゴリの下に現れるようになります。
既存のカテゴリのいずれかに関数を登録したい場合は、次のカテゴリ名のうちの 1 つを使用します。
'ctString' – 文字列関数
'ctDate' – 日付と時刻関数
'ctConv' – 変換関数
'ctFormat' – 書式
'ctMath' – 数学関数
'ctOther' – その他の関数
空のカテゴリ名を指定した場合、その関数は関数ツリーのルートに置かれます。
多数の関数を追加する場合は、すべてのロジックを別個のライブラリ ユニットに置くことをお勧めします。例を示します。
unit myfunctions;
interface
implementation
uses SysUtils, Classes, fs_iinterpreter;
// ここに、他の外部ライブラリへの参照を追加することもできます
type
TFunctions = class(TfsRTTIModule)
private
function CallMethod(Instance: TObject; ClassType: TClass; const MethodName: String; var Params: Variant): Variant;
public
constructor Create(AScript: TfsScript); override;
end;
function MyFunc(s: String; i: Integer): Boolean;
begin
// 必要なロジック
end;
procedure MyProc(s: String);
begin
// 必要なロジック
end;
{ TFunctions }
constructor TFunctions.Create;
begin
inherited Create(AScript);
with AScript do
AddMethod('function MyFunc(s: String; i: Integer): Boolean', CallMethod, 'My functions', ' MyFunc function always returns True');
AddMethod('procedure MyProc(s: String)', CallMethod, 'My functions', ' MyProc procedure does not do anything'');
end;
end;
function TFunctions.CallMethod(Instance: TObject; ClassType: TClass; const MethodName: String; var Params: Variant): Variant;
begin
if MethodName = 'MYFUNC' then
Result := MyFunc(Params[0], Params[1])
else if MethodName = 'MYPROC' then
MyProc(Params[0]);
end;
initialization
fsRTTIModules.Add(TFunctions);
end.
ファイルを拡張子 .pas で保存し、そのファイルへの参照を Delphi プロジェクトのフォームの uses 節で追加します。すべてのカスタム関数が、任意のレポート コンポーネントで使用できるようになります。これらの関数を各 TfrxReport
に追加するためにコードを書く必要はありません。また、各レポート コンポーネントの onuserfunction ハンドラーに追加のコードを書く必要もありません。