我使用FreeReport(来自FastReport),并且需要实现以下代码:

If TOTALPAGES > 1 then Pageheader.visible = false


我不知道,在哪里编写此代码,我试图在其中放入Pascal代码,但它不起作用。

并且此记录也不起作用:

[IFF([TOTALPAGES] > 1,'PAGEHEADER.VIBLE=0')]


什么是正确的方法?

最佳答案

通常放置代码的位置应为PageHeader带的OnBeforePrint(*)事件,但这不适用于<TotalPages#>

procedure PageHeader1OnBeforePrint(Sender: TfrxComponent);
begin
    TfrxPageHeader(Sender).visible :=  (<TotalPages#> = 1);
end;


这种方法的问题是<TotalPages#>目前不会被评估。
这里的第二个问题是显示或隐藏PageHeader可能会影响页面数。为了获得期望的结果,您将必须通过frxreport1.PrepareReport(true);呈现报告。您可能会执行两次,使用可见的PageHeader和不可见的PageHeader。报告的每个部分都可以通过frxReport1.FindObject访问。使用前请确保已分配。
附带说明一下,影响对象在打印/预览上的另一个位置是frxReport组件的OnPrint事件,将在呈现每个对象之前为每个对象调用该事件。

begin
  frxReport1.FindObject('PageHeader1').Visible := true;
  frxReport1.PrepareReport(true);

  // in my test case 2 Pages
  Showmessage(IntToStr(frxReport1.PreviewPages.Count));

  frxReport1.ShowPreparedReport;

  frxReport1.FindObject('PageHeader1').Visible := false;
  frxReport1.PrepareReport(true);

  // in my test case 1 Page
  Showmessage(IntToStr(frxReport1.PreviewPages.Count));

  frxReport1.ShowPreparedReport;
end;


通常的地方执行报告代码:

08-25 06:06