gpt4 book ai didi

delphi - 如何验证 FastReport 4 中是否存在文件

转载 作者:行者123 更新时间:2023-12-01 22:37:42 39 4
gpt4 key购买 nike

我有一份使用 FastReport 4DelphiXE 中编写的报告

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

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);

仍然需要让它工作。

最佳答案

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

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

第 37、38、39 页的“在报表中使用自定义函数”一章

我希望这会有所帮助。

更新

Using Custom Functions in a Report

FastReport has a large number of built-in standard functions for use in report designs. FastReport also allows custom functions to be written and used. Functions are added using the “FastScript” library interface, which is included in FastReport (to learn more about FastScript refer to it’s library manual).

Let's look at how procedures and/or functions can be added to FastReport. The number and types of parameters vary from function to function. Parameters of “Set” and “Record" type are not supported by FastScript, so they must be implemented using simpler types, for instance a TRect can be passed as four integers : X0, Y0, X1, Y1. There is more about the use of functions with various parameters in the FastScript documentation.

In the Delphi form declare the function or procedure and its code.

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

Create the “onUser” function handler for the report component.

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;

Use the report component’s add method to add it to the function list (usually in the “onCreate”or “onShow” event of the Delphi form).

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

The added function can now be used in a report script and can be referenced by objects of the“TfrxMemoView” type. The function is also displayed on the "Data tree" functions tab. On this tab functions are divided into categories and when selected a hint about the function appears in the bottom pane of the tab. Modify the code sample above to register functions in separate categories, and to display descriptive hints:

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');

The added functions will appear under the category “My functions”. To register functions in an existing categories use one of the following category names:

  • 'ctString' string function
  • 'ctDate' date/time functions
  • 'ctConv' conversion functions
  • 'ctFormat' formatting
  • 'ctMath' mathematical functions
  • 'ctOther' other functions

If the category name is left blank the function is placed under the functions tree root. To add a large number of functions it is recommended that all logic is placed in a separate library unit. Here is an example:

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.

Save the file with a .pas extension then add a reference to it in the “uses” clause of your Delphiproject’s form. All your custom functions will then be available for use in any report component, without the need to write code to add these functions to each “TfrxReport” and without the need to write additional code for each report component’s “onUser” function handler.

更新2

要创建自定义函数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;

您不能指望在Fast report IDE 设计时看到这些功能。要在 IDE 运行时查看该函数,请执行以下操作:

在uses子句中包含frxDesgn

使用此代码来显示设计器:

 frxReport1.DesignReport; //see code On create above

运行项目,将看到 Fast Report Ide 和我们的全新函数 FrFileExists

enter image description here

关于delphi - 如何验证 FastReport 4 中是否存在文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31813438/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com