如何验证FastReport 4中存在文件

时间:2015-08-04 15:33:38

标签: delphi delphi-xe fastreport

我使用快速报告4

DelphiXE 编写报告

使用以下内容,使用存储在表中的文件名在运行时动态加载图片:

procedure Picture1OnBeforePrint(Sender: TfrxComponent);
var  pname : string;                                     
begin
   pname := frxGlobalVariables['imgPath']+ <frxDBDataset1."PHOTO">;                                                      
   Picture1.Picture.LoadFromFile(pname);
end;

只要文件存在就运行正常。如何验证要加载的文件是否存在?

我尝试使用Delphi FileExists()功能,但 FastReport 4

中显然不存在

更新 使用下面的说明,我将FrFileExists功能添加到我的报告中。

我按照以下方式调用报告中的代码:

procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
   Photo := imgPath + <frxDBDataset1."PICTURENAME"> + '.jpg';
   if (FrFileExists(Photo)) then Picture1.LoadFromFile(Photo);
end;

我运行了运行时设计器,函数就在那里,但正在运行 报告我得到以下内容:

The following error(s) have occured:  
Could not convert variant of type (Null) into type (Boolean)

如果您认为变量Photo不正确,只要图片存在,以下代码就会起作用:

Picture1.LoadFromFile(Photo);

仍然需要让它发挥作用。

3 个答案:

答案 0 :(得分:1)

FastReport允许编写和使用自定义函数。

如何执行此操作,您可以在以下位置找到:FastReport DeveloperManual-en.pdf

在报告中使用自定义函数”一章第37,38,33页

我希望这会有所帮助。

<强>更新

  

在报告中使用自定义功能

     

FastReport具有大量内置标准功能供使用   在报告设计中。 FastReport还允许自定义功能   书面和使用。使用“FastScript”库添加功能   接口,包含在FastReport中(了解更多信息)   FastScript参考它的库手册)。

     

让我们来看看程序如何   和/或函数可以添加到FastReport。的数量和类型   参数因功能而异。 “Set”和“Set”的参数   FastScript不支持“记录”类型,因此它们必须是   使用更简单的类型实现,例如TRect可以作为传递   四个整数:X0,Y0,X1,Y1。有更多关于使用   在FastScript文档中具有各种参数的函数。

     

在Delphi表单中声明函数或过程及其代码。

function TForm1.MyFunc(s: String; i: Integer): Boolean;
begin
// required logic
end;
procedure TForm1.MyProc(s: String);
begin
// required logic
end;
     

为报告组件创建“onUser”函​​数处理程序。

function TForm1.frxReport1UserFunction(const MethodName: String;
var Params: Variant): Variant;
begin
  if MethodName = 'MYFUNC' then
    Result := MyFunc(Params[0], Params[1])
  else if MethodName = 'MYPROC' then
  MyProc(Params[0]);
end;
     

使用报告组件的add方法将其添加到功能列表中   (通常在Delphi表格的“onCreate”或“onShow”事件中)。

frxReport1.AddFunction('function MyFunc(s: String; i: Integer):Boolean');
frxReport1.AddFunction('procedure MyProc(s: String)');
     

添加的功能现在可以在报告脚本中使用,也可以   由“TfrxMemoView”类型的对象引用。功能也是   显示在“数据树”功能选项卡上。在此选项卡上的功能是   分为类别,当选择一个关于功能的提示   显示在选项卡的底部窗格中。将上面的代码示例修改为   在单独的类别中注册函数,并显示描述性   提示:

frxReport1.AddFunction('function MyFunc(s: String; i: Integer): Boolean',
'My functions',
' MyFunc function always returns True');
frxReport1.AddFunction('procedure MyProc(s: String)',
'My functions',
' MyProc procedure does not do anything');
     

添加的功能将显示在“我的功能”类别下。至   现有类别中的寄存器功能使用以下之一   类别名称:

     
      
  • 'ctString'字符串函数
  •   
  • 'ctDate'日期/时间函数
  •   
  • 'ctConv'转换功能
  •   
  • 'ctFormat'格式化
  •   
  • 'ctMath'数学函数
  •   
  • 'ct其他'其他功能
  •   
     

如果类别名称留空,则该功能位于   函数树根。要添加大量功能   建议将所有逻辑放在单独的库单元中。这里   是一个例子:

unit myfunctions;
interface
implementation
uses SysUtils, Classes, fs_iinterpreter;
// you can also add a reference to any other external library here
type
  TFunctions = class(TfsRTTIModule)
    private
    function CallMethod(Instance: TObject; ClassType: TClass;
    const MethodName: String; var Params: Variant):Variant;
    public
    constructor Create(AScript: TfsScript); override;
end;

function MyFunc(s: String; i: Integer): Boolean;
begin
// required logic
end;

procedure MyProc(s: String);
begin
// required logic
end;
{ TFunctions }
constructor TFunctions.Create;
begin
  inherited Create(AScript);
  with AScript do
    AddMethod('function MyFunc(s: String; i: Integer): Boolean',CallMethod,'My functions', ' MyFunc function always returns True');
    AddMethod('procedure MyProc(s: String)', CallMethod,'My functions','MyProc procedure does not do anything'');
  end;
end;

function TFunctions.CallMethod(Instance: TObject; ClassType: TClass;
const MethodName: String;
var Params: Variant): Variant;
begin
  if MethodName = 'MYFUNC' then
    Result := MyFunc(Params[0], Params[1])
  else if MethodName = 'MYPROC' then
    MyProc(Params[0]);
  end;
initialization
 fsRTTIModules.Add(TFunctions);
end.
     

使用.pas扩展名保存文件,然后在中添加对它的引用   Delphiproject表格的“使用”条款。所有自定义功能   然后可以在任何报告组件中使用,没有   需要编写代码将这些函数添加到每个“TfrxReport”和   无需为每个报表组件编写额外的代码   “onUser”函​​数处理程序。

<强> UPDATE2

创建自定义函数FileExists在Delphi中声明函数,例如:

function TForm1.FrFileExists(FileName : string):boolean;
begin
  // required logic
  Result := FileExists(FileName);
end; 

使用报表组件的add方法将其添加到函数列表中(通常在Delphi表单的“onCreate”或“onShow”事件中)。

procedure TForm1.FormCreate(Sender: TObject);
begin
  frxReport1.AddFunction('function FrFileExists(FileName:String):Boolean','My functions',
'This function returns True if file exists');
  frxReport1.DesignReport; //<-- THIS SHOW REPORT DESIGNER RUNTIME
end;

为报告组件创建“onUser”函​​数处理程序。

function TForm1.frxReport1UserFunction(const MethodName: string;var Params: Variant): Variant;
begin
  if MethodName = 'FrFileExists' then
    Result := FrFileExists(Params[0])
end;

您不能期望在快速报告IDE设计时看到这些功能。 要在IDE运行时中查看该功能,请执行以下操作:

在使用条款中包含frxDesgn;

使用此代码显示设计师:

 frxReport1.DesignReport; //see code On create above

运行该项目,将看到Fast Report Ide和我们全新的功能FrFileExists

enter image description here

答案 1 :(得分:0)

我不是为什么,但是MethodName在UpperCase中传递了String, 将功能更正为大写 MethodName ='FRFILEEXISTS'

此后它将起作用(我已经在我的项目中对其进行了测试) 约翰

答案 2 :(得分:-2)

我很高兴找到这个frFileExists函数,并且由于我使用的是C ++ Builder,所以我拥有它 转换为C ++ Builder。成功编译后,该功能不会在FastReport IDE中显示。有人可以帮我指出我的错误,并非常感谢您。我的代码附在下面:

// To create custom function FileExists
boolean __fastcall TForm1::FrFileExists(String FileName)
{
  return (FileExists(FileName.c_str()));
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  frxReport1->AddFunction(L"FrFileExists", L"My Functions",
     L"This function return true if file exists" );
  frxReport1->DesignReport();
}

Variant __fastcall TForm1::frxReport1UserFunction(const UnicodeString MethodName,
      Variant &Params)
{
  if (MethodName == "FrFileExist") {
      return (FrFileExists(Params));
  }
}