FastReports自定义预览问题
Posted
技术标签:
【中文标题】FastReports自定义预览问题【英文标题】:Fastreports custom preview problem 【发布时间】:2010-11-12 02:06:24 【问题描述】:我在 FastReports 上遇到问题,它无法在包含韩文字符的页面上正确打印。它仅在打印机 HP K5300 jet 上发生,使用 rave 对其进行 T 测试并没有问题。我认为这是快速报告的错误。我已经将我所有的报告从 rave 转换为 FastReports,并且不打算搬回来。
我计划将生成的页面作为图像获取,而不将其保存到硬盘驱动器,然后生成新的 preports。这一次,生成的图像将被使用并打印。我知道这个解决方案不好。这是现在可以使用的,等待他们的回应。
有人知道如何从生成的页面中获取图像吗?
【问题讨论】:
通过编辑您的问题,您更难理解了。您已经问过如何在不将其保存到磁盘的情况下创建报告图像,这似乎正是 Jachguate 的回答所做的。韩语字符与它有什么关系?为什么您从 Rave 切换到 Fast Reports 很重要? @Rob Kennedy,是的,我对韩文字符有疑问。打印时只有第一个字符会出现在纸上。很抱歉,如果非常混乱。 【参考方案1】:如果你只是想避免保存大量文件,你可以创建一个新的导出类,在文件创建后立即打印并立即删除。
您可以创建一个全新的导出类,从内存中打印位图(例如,使用 TPrinter 类并直接在打印机画布中绘制位图)...您将学习如何检查 TfrxBMPExport 类的源文件.
以这段未经测试的代码为例,它将指导您如何创建一个新类来保存/打印/删除:
type
TBMPPrintExport = class(TfrxBMPExport)
private
FCurrentPage: Integer;
FFileSuffix: string;
protected
function Start: Boolean; override;
procedure StartPage(Page: TfrxReportPage; Index: Integer); override;
procedure Save; override;
end;
TBMPPrintExport
procedure TBMPPrintExport.Save;
var
SavedFileName: string;
begin
inherited;
if SeparateFiles then
FFileSuffix := '.' + IntToStr(FCurrentPage)
else
FFileSuffix := '';
SavedFileName := ChangeFileExt(FileName, FFileSuffix + '.bmp');
//call your actual printing routine here. Be sure your the control returns here when the bitmap file is not needed anymore.
PrintBitmapFile(SavedFileName);
try
DeleteFile(SavedFileName);
except
//handle exceptions here if you want to continue if the file is not deleted
//or let the exception fly to stop the printing process.
//you may want to add the file to a queue for later deletion
end;
end;
function TBMPPrintExport.Start: Boolean;
begin
inherited;
FCurrentPage := 0;
end;
procedure TBMPPrintExport.StartPage(Page: TfrxReportPage; Index: Integer);
begin
inherited;
Inc(FCurrentPage);
end;
在生产代码中,您需要重写其他方法来初始化和完成打印机作业、清理等。
代码基于 TfrxCustomImageExport 的 FastReport v4.0 实现,专门用于页码和文件命名。它可能需要针对其他 FastReport 版本进行调整。
【讨论】:
【参考方案2】:您可以使用 TfrxBMPExport(frxExportImage 单元)组件将报表另存为 BMP。
例如,此代码将导出报告:
procedure ExportToBMP(AReport: TfrxReport; AFileName: String = '');
var
BMPExport: TfrxBMPExport;
begin
BMPExport := TfrxBMPExport.Create(nil);
try
BMPExport.ShowProgress := True;
if AFileName <> '' then
begin
BMPExport.ShowDialog := False;
BMPExport.FileName := AFileName;
BMPExport.SeparateFiles := True;
end;
AReport.PrepareReport(True);
AReport.Export(BMPExport);
finally
BMPExport.Free;
end;
end;
在这种情况下,导出组件对每个页面使用不同的文件名。如果传递 'c:\path\report.bmp' 作为文件名,则导出组件将生成 c:\path\report.1.bmp、c:\path\report.2.bmp 等。
像往常一样,如果您愿意,可以在任何表单/数据模块上删除并手动配置组件。
【讨论】:
+1 感谢您的回复。我编辑我的问题变得更具体。你的解决方案很棒。但它不必保存在驱动器上。如果它生成 500 页呢? 伙计们,您刚刚完全改变了您的问题的前提......只是使我的答案无效,这对于您的原始问题是准确的。我必须考虑是否要在这里发布不同的答案或只是删除它...我感到很失望,因为我花了(部分或大部分)(宝贵的)时间来尝试帮助您,而您却把它扔掉了!如果你问你不想要的东西,我认为接受我的回答(或不接受)并发布一个非常新的问题会更加尊重。 对此感到抱歉。我发现我们无法直接使用图像。但要先保存。以上是关于FastReports自定义预览问题的主要内容,如果未能解决你的问题,请参考以下文章