FastReportでDelphiの変数を使って表示する方法

データベースを使わずに、変数を使って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デザイナー

実行例

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください