导航:
论坛 -> 发布控件
斑竹:liumazi,ruralboy
作者:
2008/10/15 14:08:35
标题:
Fastreport 4.7.x 修改及相关问题解答小结
浏览:5683
加入我的收藏
楼主:
FastReport 4.7.x 版本错误及修改小结 1.Unicode 代码集语言的界面字符处理错误: 从 FastReport 4.5.X 开始为实现多国语言处理,改用 UTF8格式 XML 文件保存界面字符资源, Delphi2009 因能支持 Unicode 在内部编译和识别处理 UTF8 格式文件上的变化,造成了一些 涉及字符串及流处理与以前版本的不同. 首先,一个常数字符串在编译流化成 .dcu 文件时,会根据文件的格式和程序中对该常数字符串 的引用产生不同的编译结果. 如:文件格式是 UTF8,串的引用申明是 AnsiString 流化成: 原串=UTF8格式,引用=AnsiString + 语言代码页 格式 具体各位可以自行实验观察在不同的文件格式和引用申明下,编译产生的 .dcu 文件的内容. 但资源编译程序frcc.exe 有问题: A:编译后的文件是每行定长的,这造成多字节内码的语言资源文件被拆乱编码 B:编译后的上述资源文件是按 UTF8 格式,但没有 UTF8 BOM 标识头 这在 Delphi2009 的版本中会造成错误的识别文件类型,编译后的文件 .dcu中没有按指定 的 UTF8 格式流化,所以在装载进来的资源串出现了乱码和空白串. 解决办法: A:修改资源文件:frxrcClass.pas,frxrcDesgn.pas,frxrcExports.pas,frxrcInsp.pas B:在 Delphi2009 中指定该文件的格式为 UTF8 并保存,使之产生 UTF8 BOM 标识. 附件是修改后的frxrcClass.pas,frxrcDesgn.pas,frxrcExports.pas,frxrcInsp.pas文件 (这是允许用户修改及发布的,其它的只能提供修改方法,不能发布源代码了,我不想收到律师函) C:修改代码 frxRes.pas procedure TfrxResources.AddXML(const Str: AnsiString); var Stream: TStringStream; begin //PZG UTF8 BOM 格式保存并编译,为兼容,先进行格式转换 // Stream := TStringStream.Create(str); // LoadFromStream(Stream); // Stream.Free; Stream := TStringStream.Create(UTF8Encode(String(str))); try LoadFromStream(Stream); finally Stream.Free; end; end; 2.双击报表控件报异常: A:当系统中没有安装物理打印机,会引发运行时报异常不能进入报表设计,设计时双击报表控件报异常 这也是 vista 下不能正常进入报表设计,挂死IDE的原因 B:报表设置对话中的打印机型号识别错误,当系统中安装的打印机多于3种时识别为乱码。 解决方法: A:暂时解决办法:添加一台打印机,随便选择一个型号的即可. B:修改代码 frxPrint.pas: procedure TfrxPrinters.FillPrinters; var i, j: Integer; Buf, prnInfo: PAnsiChar;//todo -oPZG: PChar;当系统中安装的打印机多于3种时识别为乱码 以上严重的错误修改后,经测试在delphi2007,2009,Windows xp,2003,vista,均能正常使用了. 还有要注意:修改编译生成新的 .BPL 包文件,要拷贝到 Windows\system32\ 下,在Delphi 的包文件 搜索路径中不能有不同的同名包,否则会引发各种莫明的问题.
----------------------------------------------
-
作者:
2008/10/15 14:09:51
1楼:
下面是一些非致命的错误及修改: 3.报表页面设置: 当系统中没有安装打印机,内建一个"虚拟打印机"时,纸张选择列表中为空白: 解决方法: 修改代码:frxPrint.pas: const PAPERCOUNT = 66; PaperInfo: array[0..PAPERCOUNT - 1] of TPaperInfo = ( (Typ:1; Name: 'Letter, 8 1/2 x 11'; X:2159; Y:2794), (Typ:2; Name: 'Letter small, 8 1/2 x 11'; X:2159; Y:2794), (Typ:3; Name: 'Tabloid, 11 x 17'; X:2794; Y:4318), (Typ:4; Name: 'Ledger, 17 x 11'; X:4318; Y:2794), (Typ:5; Name: 'Legal, 8 1/2 x 14'; X:2159; Y:3556), (Typ:6; Name: 'Statement, 5 1/2 x 8 1/2'; X:1397; Y:2159), (Typ:7; Name: 'Executive, 7 1/4 x 10 1/2'; X:1842; Y:2667), (Typ:8; Name: 'A3 297 x 420 mm'; X:2970; Y:4200), (Typ:9; Name: 'A4 210 x 297 mm'; X:2100; Y:2970), (Typ:10; Name: 'A4 small sheet, 210 x 297 mm'; X:2100; Y:2970), (Typ:11; Name: 'A5 148 x 210 mm'; X:1480; Y:2100), (Typ:12; Name: 'B4 250 x 354 mm'; X:2500; Y:3540), (Typ:13; Name: 'B5 182 x 257 mm'; X:1820; Y:2570), (Typ:14; Name: 'Folio, 8 1/2 x 13'; X:2159; Y:3302), (Typ:15; Name: 'Quarto Sheet, 215 x 275 mm'; X:2150; Y:2750), (Typ:16; Name: '10 x 14'; X:2540; Y:3556), (Typ:17; Name: '11 x 17'; X:2794; Y:4318), (Typ:18; Name: 'Note, 8 1/2 x 11'; X:2159; Y:2794), (Typ:19; Name: '9 Envelope, 3 7/8 x 8 7/8'; X:984; Y:2254), (Typ:20; Name: '#10 Envelope, 4 1/8 x 9 1/2'; X:1048; Y:2413), (Typ:21; Name: '#11 Envelope, 4 1/2 x 10 3/8'; X:1143; Y:2635), (Typ:22; Name: '#12 Envelope, 4 3/4 x 11'; X:1207; Y:2794), (Typ:23; Name: '#14 Envelope, 5 x 11 1/2'; X:1270; Y:2921), (Typ:24; Name: 'C Sheet, 17 x 22'; X:4318; Y:5588), (Typ:25; Name: 'D Sheet, 22 x 34'; X:5588; Y:8636), (Typ:26; Name: 'E Sheet, 34 x 44'; X:8636; Y:11176), (Typ:27; Name: 'DL Envelope, 110 x 220 mm'; X:1100; Y:2200), (Typ:28; Name: 'C5 Envelope, 162 x 229 mm'; X:1620; Y:2290), (Typ:29; Name: 'C3 Envelope, 324 x 458 mm'; X:3240; Y:4580), (Typ:30; Name: 'C4 Envelope, 229 x 324 mm'; X:2290; Y:3240), (Typ:31; Name: 'C6 Envelope, 114 x 162 mm'; X:1140; Y:1620), (Typ:32; Name: 'C65 Envelope, 114 x 229 mm'; X:1140; Y:2290), (Typ:33; Name: 'B4 Envelope, 250 x 353 mm'; X:2500; Y:3530), (Typ:34; Name: 'B5 Envelope, 176 x 250 mm'; X:1760; Y:2500), (Typ:35; Name: 'B6 Envelope, 176 x 125 mm'; X:1760; Y:1250), (Typ:36; Name: 'Italy Envelope, 110 x 230 mm'; X:1100; Y:2300), (Typ:37; Name: 'Monarch Envelope, 3 7/8 x 7 1/2'; X:984; Y:1905), (Typ:38; Name: '6 3/4 Envelope, 3 5/8 x 6 1/2'; X:920; Y:1651), (Typ:39; Name: 'US Std Fanfold, 14 7/8 x 11'; X:3778; Y:2794), (Typ:40; Name: 'German Std Fanfold, 8 1/2 x 12'; X:2159; Y:3048), (Typ:41; Name: 'German Legal Fanfold, 8 1/2 x 13'; X:2159; Y:3302), (Typ:42; Name: 'B4 (ISO) 250 x 353 mm'; X:2500; Y:3530), (Typ:43; Name: 'Japanese Postcard 100 x 148 mm'; X:1000; Y:1480), (Typ:44; Name: '9 x 11'; X:2286; Y:2794), (Typ:45; Name: '10 x 11'; X:2540; Y:2794), (Typ:46; Name: '15 x 11'; X:3810; Y:2794), (Typ:47; Name: 'Envelope Invite 220 x 220 mm'; X:2200; Y:2200), (Typ:50; Name: 'Letter Extra 9/275 x 12'; X:2355; Y:3048), (Typ:51; Name: 'Legal Extra 9/275 x 15'; X:2355; Y:3810), (Typ:52; Name: 'Tabloid Extra 11.69 x 18'; X:2969; Y:4572), (Typ:53; Name: 'A4 Extra 9.27 x 12.69'; X:2354; Y:3223), (Typ:54; Name: 'Letter Transverse 8/275 x 11'; X:2101; Y:2794), (Typ:55; Name: 'A4 Transverse 210 x 297 mm'; X:2100; Y:2970), (Typ:56; Name: 'Letter Extra Transverse 9/275 x 12'; X:2355; Y:3048), (Typ:57; Name: 'SuperASuperAA4 227 x 356 mm'; X:2270; Y:3560), (Typ:58; Name: 'SuperBSuperBA3 305 x 487 mm'; X:3050; Y:4870), (Typ:59; Name: 'Letter Plus 8.5 x 12.69'; X:2159; Y:3223), (Typ:60; Name: 'A4 Plus 210 x 330 mm'; X:2100; Y:3300), (Typ:61; Name: 'A5 Transverse 148 x 210 mm'; X:1480; Y:2100), (Typ:62; Name: 'B5 (JIS) Transverse 182 x 257 mm'; X:1820; Y:2570), (Typ:63; Name: 'A3 Extra 322 x 445 mm'; X:3220; Y:4450), (Typ:64; Name: 'A5 Extra 174 x 235 mm'; X:1740; Y:2350), (Typ:65; Name: 'B5 (ISO) Extra 201 x 276 mm'; X:2010; Y:2760), (Typ:66; Name: 'A2 420 x 594 mm'; X:4200; Y:5940), (Typ:67; Name: 'A3 Transverse 297 x 420 mm'; X:2970; Y:4200), (Typ:68; Name: 'A3 Extra Transverse 322 x 445 mm'; X:3220; Y:4450));
----------------------------------------------
-
作者:
2008/10/15 14:10:08
2楼:
4: PNG 图像格式支持 解决方法: A:修改代码:frxClass.pas 中三处 A.1: {$IFDEF PNG} {$IFDEF Delphi12} //PZG 开放Delphi2009 PNG支持 , pngimage {$ELSE} , frxpngimage {$ENDIF} {$ENDIF} A.2: const OriginalPngHeader: array[0..7] of AnsiChar = (#137, #80, #78, #71, #13, #10, #26, #10); //PZG Char->AnsiChar,开放Delphi2009 PNG支持 A.3: {$IFDEF PNG} PNGHeader: array[0..7] of AnsiChar; //PZG Char->AnsiChar,开放Delphi2009 PNG支持 {$ENDIF} B:修改代码:frxClassRTTI.pas 中 {$IFDEF PNG} {$IFDEF Delphi12} //PZG 开放Delphi2009 PNG支持 , pngimage {$ELSE} , frxpngimage {$ENDIF} C:修改代码:frx.inc 中 //---------- PNG images ---------- // PNG images. If you want to show png images in "Picture" object, uncomment // the following line: {$DEFINE PNG} //{$IFDEF DElphi12} //PZG 开放Delphi2009 PNG支持 //{$UNDEF PNG} //{$ENDIF}
----------------------------------------------
-
作者:
2008/10/15 14:11:19
3楼:
5.还有一些小修改,避免编译报错 A.修改:frxGraphictils.pas const glasn: String = '琅ㄈ斡圯捱'; soglasn: String = '谅媚魄墒颂拖醒以罩棕佘'+#$DA; //?; //PZG 防止编译错误 znaks: String = '苴'; znaks1: String = #$00C9; //'?; //PZG 防止编译错误 function CountSpaces: Integer; var i: Integer; begin Result := 0; for i := 0 to n - 1 do begin spaceAr[i] := 0; if (s[i + 1] = ' ') or (s[i + 1] = #$00A0) then //PZG 防止编译错误 begin Inc(Result); spaceAr[i] := 1; end; end; end; B.修改:frxAbout.pas procedure TfrxAboutForm.FormCreate(Sender: TObject); {$IFDEF FR_COM} var r: TRegistry; s: String; {$ENDIF} begin Caption := frxGet(2600); Label4.Caption := frxGet(2601); Label6.Caption := frxGet(2602); Label8.Caption := frxGet(2603); Label2.Caption := 'Version ' + FR_VERSION; Label10.Caption := #$00AE; //#174; //PZG 正确显示版权符号 以上修改,适用于 FastReport 4.7.1,4.7.2,4.7.3 for Delphi2009 最后祝各位用得愉快! PZG 2008.10.13
----------------------------------------------
-
作者:
2008/10/15 14:11:42
4楼:
相关问答: 1.Fastreport 4.7.x 版本问题: 答:Fastreport 4.7.1 中就已经实现了for Delphi2009 的核心技术和修改的方法 从版本的源码可以看出,作者为了解决该问题,把4.6.8版中的关于条件编译{$IFDEF FR_COM}相关的代码 全部去掉,进行修改. 我发现在4.7.1之前还发出过一个4.6.103试用测试版,其中的修改基本完成,只等待 Delphi2009 up1 升级包发布后,又修改了对应的数据集处理. 4.7.2 =4.7.1 + 条件编译{$IFDEF FR_COM}相关的代码; 如果不使用(FR_COM)的部分,与4.7.1完全相同. 4.7.3 安装时,提取码如果有效的话,各个版本都能生成 for DelphiXXXX 各版本的源码.只是提取码无 效时,只能生成对应说明的演示版,无源码(全用空格' '填充了)而且不能重建包. 但从试用版的功能测试中发现,涉及多语言界面处理部分,接口及结果完全相同,没有修改.
----------------------------------------------
-
作者:
2008/10/15 14:12:16
5楼:
2. 多语言界面处理的解决 从 FastReport 4.5.X 开始为实现多国语言处理,改用 UTF8格式 XML 文件保存界面字符资源, Delphi2009 因能支持 Unicode 在内部编译和识别处理 UTF8 格式文件上的变化,造成了一些 涉及字符串及流处理与以前版本的不同. 首先,一个常数字符串在编译流化成 .dcu 文件时,会根据文件的格式和程序中对该常数字符串 的引用产生不同的编译结果. 如:文件格式是 UTF8,串的引用申明是 AnsiString 流化成: 原串=UTF8格式,引用=AnsiString + 语言代码页 格式 具体各位可以自行实验观察在不同的文件格式和引用申明下,编译产生的 .dcu 文件的内容. Fastreport 作者没有意识到问题真正的原因是什么,所以4.7.2,4.7.3 中修改的都与中文显示 (多字节内码显示)技术无关,都没有修订该 Beg,主要是在本地代码页下(俄罗斯,单字节内码)进行测试了与 Delphi2009 的兼容性从 Frcc.exe 资源编译程序上看,修订于 2008.8.25 ,这个问题实际存在于 4.5版中到 现在都没有修订. 3. frxReport1.DesignReport运行时全是中文,但是在设计时页面还是E文 这是 Fastreport 安装程序留下的麻烦,在安装时注册 Fastreport 的相关 .BPL 包文件的搜索路径为 Windows\System32\; Program Files\Fastreports\Fastreport 4\LibD12\ 并把相关的 .BPL 包文件拷贝到其中 如果不修改代码的话不会有问题,但如果修改后重新编译,产生的新的 .BPL 在 Delphi2009 的缺省包保存路 径对应 Windows XP,2003 为: Documents and Setting\All Users\Documents\RAD Studio\6.0\BPL\ 对应 vista 为: Users\Public\Documents\RAD Studio\6.0\Bpl\ Delphi2009 在启动时是按注册Fastreport 的相关 .BPL 包文件的搜索路径,检查各个包的相关依赖包是否 存在,并装载各个设计时包到 Package Cache 堆中.如果发现相关依赖包缺少,就发出是否后续装载的对话框. 因此:设计时包是优先从 Windows\System32\ 装入的. 对控件包进行开发或修改时要注意:修改编译生成新的 .BPL 包文件,要拷贝到 Windows\system32\ 下, 在Delphi 的包文件搜索路径中不能有不同的同名包,否则会引发各种莫明的问题.
----------------------------------------------
-
作者:
2008/10/15 14:12:33
6楼:
4.重新编译,是在delphi2009中逐个打开各个包进行编译,不能用 Fsatreport 的recompile.exe. 因为包有依赖顺序,所以必须按下列顺序进行: 先编译运行时包: 第一组:fqb120,fs12,fsDB12,fsADO12,fsBDE12,fsIBX12,fsTee12, 第二组:frx12,frxDB12,frxADO12,frxBDE12,frxDBX12,frxIBX12,frxTee12,frxE12 再编译设计时包: 第一组:dclfqb120,dclfs12,dclfsDB12,dclfsADO12,dclfsBDE12, dclfsIBX12,dclfsTee12, 第二组:dclfrx12,dclfrxDB12,dclfrxADO12,dclfrxBDE12, dclfrxDBX12,dclfrxIBX12,dclfrxTee12,dclfrxE12 也可以按以上顺序生成包组,便于全部重建,避免引起误导我们的分析思路. 当程序在修改过程中,会改变一些数据类型和引用申明,如果只重建了一个包,其它包没有作对应重建,也会发生一些问题. 如:一个常数字符串在编译流化成 .dcu 文件时,会根据文件的格式和程序中对该常数字符串的引用产生不同的编译结果. 如:文件格式是 UTF8,串的引用申明是 AnsiString 流化成: 原串=UTF8格式,引用=AnsiString + 语言代码页 格式 如:文件格式是 UTF8,串的引用申明是 String 流化成: 原串=UTF8格式,引用=UTF8 格式 5.另外提请注意的是: delphi2009 中打开过的带有窗体的程序,会在delphi2007 中会引起运行异常或设计时异常,这个问题会出现多种不同的表现,诸如: 控件注册时出错,程序引导时出错,单元初始化出错,运行时报某属性不存在...
----------------------------------------------
-
作者:
ljljlj (ljljlj)
★☆☆☆☆
-
盒子活跃会员
2008/10/15 14:21:48
7楼:
好帖,不知官方何時出修正版。
----------------------------------------------
-
作者:
2008/10/15 14:31:33
7楼:
6.FastReport 4.7.x 的XML 版本问题 XML 的标准见: http://www.w3.org/TR/2006/REC-xml-20060816/ 为了保持与 Delphi2009 及与以前版本的兼容问题,内部使用了 1.1 非标准的版本,并且内部采用了2种不同的编码来持久化各字符串,易引起一些人为的错误发生. 我公布的修改方法是不改动内部字符编码格式来进行的.我们自己使用的是统一内码格式的方法.修改比较大,可以消除一些潜在的错误.各位有兴趣可以自行研读源代码,是比较有益的.
----------------------------------------------
-
作者:
2008/10/15 16:51:22
8楼:
感谢分享!
----------------------------------------------
-
作者:
2008/10/15 18:58:03
9楼:
高人,新开贴了
----------------------------------------------
-
作者:
2008/10/15 22:46:47
10楼:
非常好
----------------------------------------------
-
作者:
2008/10/15 23:01:10
11楼:
7.没有打印机引起的双击报表设计时错误的修改: 修改代码:frxPrinter.pas 中 procedure FillPapers; var i, PaperSizesCount: Integer; PaperSizes: array[0..255] of Word; PaperNames: PChar; begin FillChar(PaperSizes, SizeOf(PaperSizes), 0); PaperSizesCount := DeviceCapabilities(PChar(FName), PChar(FPort), DC_PAPERS, @PaperSizes, FMode); GetMem(PaperNames, PaperSizesCount * 64 * sizeof(char)); //PZG // GetMem(PaperNames, PaperSizesCount * 64); DeviceCapabilities(PChar(FName), PChar(FPort), DC_PAPERNAMES, PaperNames, FMode); for i := 0 to PaperSizesCount - 1 do if PaperSizes[i] <> 256 then FPapers.AddObject(StrPas(PChar(PaperNames + i * 64)), Pointer(PaperSizes[i])); FreeMem(PaperNames, PaperSizesCount * 64 * sizeof(char)); //PZG // FreeMem(PaperNames, PaperSizesCount * 64); end;
----------------------------------------------
-
作者:
2008/10/15 23:24:26
12楼:
刚看到的 dlp和 whshen 发布的 4.7.5 版本中已经对上面的 第7点作了修改
----------------------------------------------
-
作者:
2008/10/16 13:10:50
13楼:
汉化解决不了,我把附件的文件放到我目录下,重新编译,但还是乱码
----------------------------------------------
(无语了)
作者:
2008/10/16 20:16:06
14楼:
还有要做的是: C:修改代码 frxRes.pas procedure TfrxResources.AddXML(const Str: AnsiString); var Stream: TStringStream; begin //PZG UTF8 BOM 格式保存并编译,为兼容,先进行格式转换 // Stream := TStringStream.Create(str); // LoadFromStream(Stream); // Stream.Free; Stream := TStringStream.Create(UTF8Encode(String(str))); try LoadFromStream(Stream); finally Stream.Free; end; end;
----------------------------------------------
-
作者:
2008/10/16 23:25:09
15楼:
搞了一下午,可以了,用的是FR4.7.5,但在FR4.7.2里处理就是不得,没得办法
----------------------------------------------
(无语了)