использование TfrxRect и GetRealBounds в скрипте - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь использовать скрипт

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 голосов
/ 19 октября 2018

Объяснение:

Если я правильно понимаю ваш вопрос, вы можете рассмотреть следующее:

  • Во-первых, если вы хотите использовать тип, вынужно вызвать AddType() метод класса TfsScript.
  • Во-вторых, в FastScript реализованы только опубликованные методы добавленных классов.Если вы хотите использовать публичный метод (например, GetRealBounds), вам нужно использовать AddMethod() метод TfsScript.

Проблема с вашим скриптом (даже если вы добавляете тип TfrxRect) заключается в том, что TfrxRect является упакованной записью, а FastScript не поддерживает записи.Таким образом, вы можете определить свой собственный класс TfrxBarCodeView с помощью соответствующих методов.

Следующий пример покажет вам один из возможных способов решения вашей проблемы (это пример Delphi, но я смог воспроизвести и устранить вашу ошибку).

Delphi part:

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.

Быстрый код сообщения:

procedure BarCodeResize(Bc : TfrxMyBarCodeView);
var
   R, L : double;
begin
   Bc.Text := '1234567890 test 1234567890 asdf 1234567890';
   R := Bc.GetRealBoundsRight * fr1CharX / fr01cm;
   L := Bc.GetRealBoundsLeft * fr1CharX / fr01cm;
   Bc.Zoom := Bc.Width / (R - L);
   ShowMessage('Right: ' + FloatToStr(R) + ', Left:  ' + FloatToStr(L));
end;   

procedure Page1OnBeforePrint(Sender: TfrxComponent);
begin
   BarCodeResize(TfrxMyBarCodeView(BarCode1));                                
end;

begin

end.

Примечания:

Протестировано с Delphi 7, FastReport 4.7, FastScript 1.7.

...