在脚本中使用TfrxRect和GetRealBounds

时间:2018-09-24 21:10:51

标签: fastreport

我想使用该脚本

procedure BarCodeResize(Bc : TfrxBarCodeView);
var
r : TfrxRect;
begin
bc.Text := '1234567890 test 1234567890 asdf 1234567890';
r := bc.GetRealBounds;
bc.Zoom := bc.Width/(r.Right - r.Left);
frxReport1.ShowReport();
end;

但是它显示了我在'r:TfrxRect;'

行的错误

1 个答案:

答案 0 :(得分:0)

说明:

如果我正确理解了您的问题,则可以考虑以下事项:

  • 首先,如果要使用类型,则需要调用AddType()类的TfsScript方法。
  • 第二,在FastScript中,仅实现已发布的添加类的方法。如果要使用公共方法(例如GetRealBounds),则需要使用AddMethod()的{​​{1}}方法。

您的脚本存在问题(即使您添加了类型TfsScript)也是如此,TfrxRect是打包记录,而FastScript不支持记录。因此,您可以使用适当的方法定义自己的TfrxRect类。

下一个示例将向您展示解决问题的一种可能方法(这是Delphi的示例,但是我能够重现并解决您的错误)。

Delphi部分:

TfrxBarCodeView

快速报告代码:

unit FMainBarcode;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, frxClass, fs_iinterpreter, frxBarcode;

type
  TForm1 = class(TForm)
    Button1: TButton;
    frxReport1: TfrxReport;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TfrxMyBarCodeView = class(TfrxBarCodeView)
  public
     constructor Create(AOwner: TComponent); override;
     function GetRealBoundsRight: double;
     function GetRealBoundsLeft: double;
  end;

type
  TFunctions = class(TfsRTTIModule)
  private
    function CallMethod(Instance: TObject; ClassType: TClass; const MethodName: String; Caller: TfsMethodHelper): Variant;
  public
    constructor Create(AScript: TfsScript); override;
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   // Show report
   frxReport1.ShowReport;
end;

{ TMyfrxBarCodeView }
constructor TfrxMyBarCodeView.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

function TfrxMyBarCodeView.GetRealBoundsLeft: double;
begin
   Result := GetRealBounds.Left;
end;

function TfrxMyBarCodeView.GetRealBoundsRight: double;
begin
   Result := GetRealBounds.Right;
end;

{ TFunctions }
constructor TFunctions.Create(AScript: TfsScript);
begin
  inherited Create(AScript);
   // Add type
   AScript.AddType('TfrxRect', fvtVariant);
   // Add public method
   with AScript.FindClass('TfrxBarCodeView') do begin
      AddMethod('function GetRealBounds: TfrxRect', CallMethod);
   end{with};
   // Add class and public methods
   with AScript.AddClass(TfrxMyBarCodeView, 'TfrxBarCodeView') do begin
      AddMethod('function GetRealBoundsRight: double', CallMethod);
      AddMethod('function GetRealBoundsLeft: double', CallMethod);
   end{with};
end;

function TFunctions.CallMethod(Instance: TObject; ClassType: TClass; const MethodName: String; Caller: TfsMethodHelper): Variant;
begin
   Result := 0;
   if (ClassType = TfrxBarCodeView) and (MethodName = 'GETREALBOUNDS') then begin
      //Result := TfrxBarCodeView(Instance).GetRealBounds;
   end{if};
   if (ClassType = TfrxMyBarCodeView) and (MethodName = 'GETREALBOUNDSRIGHT') then begin
      Result := TfrxMyBarCodeView(Instance).GetRealBoundsRight;
   end{if};
   if (ClassType = TfrxMyBarCodeView) and (MethodName = 'GETREALBOUNDSLEFT') then begin
      Result := TfrxMyBarCodeView(Instance).GetRealBoundsLeft;
   end{if};
end;

initialization
  fsRTTIModules.Add(TFunctions);

end.

注释:

在Delphi 7,FastReport 4.7,FastScript 1.7中进行了测试。