データベースを使わずに、変数を使ってFastReportに表示する方法をいくつかまとめました。
変数の値をFastReportで表示する
TfrxReportオブジェクトに変数の値を渡します。
frxReport1.Script.Variables['val1'] := 'Hello World';
frxReport1.Script.Variables['val2'] := 12345;
frxReport1.ShowReport();
FastReportデザイナーで変数の値を表示するコントロールに変数名を設定します。
実行時に変数名が設定された値に置き換わります。
実行例
作業手順をまとめました。
リストや配列の値をFastReportで表示する
TfrxUserDataSetをフォームに配置します。
FastReportデザイナーにTfrxUserDataSet追加します。
マスターデータのバンドを追加し、テキストオブジェクトを配置します。
テキストオブジェクトに変数名を設定します。
レポートを表示する時に、リストや配列の要素数を指定します。
frxUserDataSet1.RangeEnd := reCount;
frxUserDataSet1.RangeEndCount := 10; //要素数
frxReport1.ShowReport();
TfrxReportオブジェクトのOnGetValueイベントを記述します。
引数VarNameはFastReportデザイナーで設定したテキストオブジェクトの変数名です。
表示する値をValueに設定します。
procedure TForm1.frxReport1GetValue(const VarName: string; var Value: Variant);
begin
if VarName = 'val1' then
Value := Format('行 %d 列 %d', [frxUserDataSet1.RecNo, 1])
else if VarName = 'val2' then
Value := Format('行 %d 列 %d', [frxUserDataSet1.RecNo, 2])
else if VarName = 'val3' then
Value := Format('行 %d 列 %d', [frxUserDataSet1.RecNo, 3]);
end;
実行例
作業手順をまとめました。
■複数のリストや配列の値をFastReportで表示する
複数のTfrxUserDataSetを配置することもできます。
このときFastReportデザイナーの変数名には、どのTfrxUserDataSetから値を取得するかわかるように、TfrxUserDataSetの名前をつけます。
[コンポーネント名."変数名"]
TfrxUserDataSetのFieldsプロパティで、使用できる変数名を登録することができます。
Fieldsプロパティを設定するとFastReportデザイナーのデータツリーに使用できる変数名が表示されます。
また、変数名をプルダウンメニューから選択できるようになります。
表示する値を設定するには、TfrxReportオブジェクトのOnGetValueイベントでなく、TfrxUserDataSetのOnGetValueイベントを使用します。
procedure TForm1.frxUserDataSet1GetValue(const VarName: string;
var Value: Variant);
begin
if VarName = 'val1' then
Value := Format('行 %d 列 %d', [frxUserDataSet1.RecNo, 1]);
end;
procedure TForm1.frxUserDataSet2GetValue(const VarName: string;
var Value: Variant);
begin
if VarName = 'val2' then
Value := Format('行 %d 列 %d', [frxUserDataSet2.RecNo, 2])
else if VarName = 'val3' then
Value := Format('行 %d 列 %d', [frxUserDataSet2.RecNo, 3]);
end;
レコードの終わりはTfrxUserDataSetのOnCheckEOFイベントで指定します。
procedure TForm1.frxUserDataSet1CheckEOF(Sender: TObject; var Eof: Boolean);
begin
Eof := (frxUserDataSet1.RecNo > 10);
end;
procedure TForm1.frxUserDataSet2CheckEOF(Sender: TObject; var Eof: Boolean);
begin
Eof := (frxUserDataSet2.RecNo > 2);
end;
表示するレコードが次のレコードに移る時には、TfrxUserDataSetのOnNextイベントが発生します。
このイベントで表示する値を用意することもできます。
実行例
■変数に格納されたファイル名から画像を表示する
FastReportデザイナーで図オブジェクトを追加し、FileLinkプロパティに変数名を設定します。
[frxUserDataSet1."picture_file"]
OnGetValueイベントでpicture_file変数にファイル名を渡します。
procedure TForm1.frxUserDataSet1GetValue(const VarName: string;
var Value: Variant);
begin
if VarName = 'picture_file' then
Value := FFiles[frxUserDataSet1.RecNo];
end;
次のプログラムは、C:\pictureフォルダーにあるJPGファイルを一覧表示します。
フォーム
type
TForm1 = class(TForm)
Button1: TButton;
frxUserDataSet1: TfrxUserDataSet;
frxReport1: TfrxReport;
procedure Button1Click(Sender: TObject);
procedure frxUserDataSet1CheckEOF(Sender: TObject; var Eof: Boolean);
procedure frxUserDataSet1GetValue(const VarName: string;
var Value: Variant);
private
{ Private 宣言 }
FFiles: TStringDynArray;
public
{ Public 宣言 }
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FFiles := TDirectory.GetFiles('C:\picture', '*.jpg', TSearchOption.soTopDirectoryOnly);
frxReport1.ShowReport();
end;
procedure TForm1.frxUserDataSet1CheckEOF(Sender: TObject; var Eof: Boolean);
begin
Eof := (frxUserDataSet1.RecNo >= Length(FFiles));
end;
procedure TForm1.frxUserDataSet1GetValue(const VarName: string;
var Value: Variant);
begin
if VarName = 'filename' then
Value := FFiles[frxUserDataSet1.RecNo]
else if VarName = 'picture_file' then
Value := FFiles[frxUserDataSet1.RecNo];
end;
FastReportデザイナー
実行例