我使用快速报告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);
仍然需要让它发挥作用。
答案 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
答案 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));
}
}