在FastReport 4.2的barcode组件不包含QRCode(听说高版本的Delphi内置的FastReport已经包含QRCode功能),这篇文章简单讲下如何用自定义函数解决QRCode的显示问题。
首选QRCode的编码->图形采用了DelphiZXingQRCode组件,下载地址:http://www.debenu.com/open-source/delphizxingqrcode/
本文的思路是这样的,首选显示QRCode的组件是tfrxpictureview,在tfrxpictureview的OnBeforePrint脚本中动态调用自定义函数,由自定义函数给tfrxpictureview加载QRCode。
FastReport的自定义函数流程本文分3部分,自定义函数公共入口CallMethod,给tfrxpictureview赋值的updateQRCode,还有注册自定义函数regMethod。下面我们来看代码
procedure TForm1.regMethod;
const
g='User Functions/Procedures';
begin
// frGlobalUnit contains standard types and functions
frxReport1.Script.Parent := fsGlobalUnit;
frxReport1.Script.AddMethod('procedure updateQRCode(qrCodeStr: String; qrCodePicObjectname:String);',
CallMethod,g,'Assigned QRCode to PictureView');
end;
procedure TForm1.updateQRCode(qrCodeStr: String; qrCodePic: TfrxPictureView);
var
stream: TMemoryStream;
begin
stream := TMemoryStream.Create;
try
CreateQRCode(qrCodeStr, stream);
qrCodePic.LoadPictureFromStream(stream);
finally
FreeAndNil(stream);
end;
end;
function TForm1.CallMethod(Instance: TObject; ClassType: TClass;
const MethodName: string; var Params: Variant): Variant;
var obj:TfrxComponent;
begin
// dispatch the method call
if MethodName = 'UPDATEQRCODE' then begin
//result := up(Params[0]);
obj:=frxreport1.FindObject( Params[1]);
if obj<>nil then begin
updateQRCode(Params[0],obj as TfrxPictureView);
end;
end;
end;
TForm.onCreate的时候应该第一时间调用regMethod注册自定义函数。好了,自定义函数的Delphi代码已经完成,下面来看看如何在FastReport里面的脚本调用它。双击fastreport组件的打开design界面,在MasterData Bar里面增加一个Picture Object,调整好大小后然后F11,选择OnBeforePrint Event,双击进入脚本的编写,在procedure主体里面添加一行代码调用自定义函数:
updateQRCode( ADOQuery1.FieldByName('barcode').AsString,'Picture1');
updateQRCode的第一个参数为QRCode值,第二个参数为Picture Object的Component name,保存退出后,Run一下看看是不是成功了?