DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tkzcol
今日帖子: 1
在线用户: 6
导航: 论坛 -> 发布控件 斑竹:liumazi,ruralboy  
作者:
男 zjttpzg (pzg) ★☆☆☆☆ -
普通会员
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 的包文件
搜索路径中不能有不同的同名包,否则会引发各种莫明的问题.
此帖子包含附件:zjttpzg_2008101514835.rar 大小:19.3K
----------------------------------------------
-
作者:
男 zjttpzg (pzg) ★☆☆☆☆ -
普通会员
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));
----------------------------------------------
-
作者:
男 zjttpzg (pzg) ★☆☆☆☆ -
普通会员
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}
----------------------------------------------
-
作者:
男 zjttpzg (pzg) ★☆☆☆☆ -
普通会员
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
----------------------------------------------
-
作者:
男 zjttpzg (pzg) ★☆☆☆☆ -
普通会员
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 各版本的源码.只是提取码无
  效时,只能生成对应说明的演示版,无源码(全用空格' '填充了)而且不能重建包.
  但从试用版的功能测试中发现,涉及多语言界面处理部分,接口及结果完全相同,没有修改.
----------------------------------------------
-
作者:
男 zjttpzg (pzg) ★☆☆☆☆ -
普通会员
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 的包文件搜索路径中不能有不同的同名包,否则会引发各种莫明的问题.
----------------------------------------------
-
作者:
男 zjttpzg (pzg) ★☆☆☆☆ -
普通会员
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楼: 好帖,不知官方何時出修正版。
----------------------------------------------
-
作者:
男 zjttpzg (pzg) ★☆☆☆☆ -
普通会员
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种不同的编码来持久化各字符串,易引起一些人为的错误发生.
我公布的修改方法是不改动内部字符编码格式来进行的.我们自己使用的是统一内码格式的方法.修改比较大,可以消除一些潜在的错误.各位有兴趣可以自行研读源代码,是比较有益的.
----------------------------------------------
-
作者:
男 townch (townch) ★☆☆☆☆ -
普通会员
2008/10/15 16:51:22
8楼: 感谢分享!
----------------------------------------------
-
作者:
男 ditouhu (地头狐) ★☆☆☆☆ -
盒子活跃会员
2008/10/15 18:58:03
9楼: 高人,新开贴了
----------------------------------------------
-
作者:
男 leijuchao (ljc_ljc) ★☆☆☆☆ -
普通会员
2008/10/15 22:46:47
10楼: 非常好
----------------------------------------------
-
作者:
男 zjttpzg (pzg) ★☆☆☆☆ -
普通会员
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;
----------------------------------------------
-
作者:
男 zjttpzg (pzg) ★☆☆☆☆ -
普通会员
2008/10/15 23:24:26
12楼: 刚看到的 dlp和 whshen  发布的 4.7.5 版本中已经对上面的 第7点作了修改
----------------------------------------------
-
作者:
男 sammy (谭) ★☆☆☆☆ -
盒子活跃会员
2008/10/16 13:10:50
13楼: 汉化解决不了,我把附件的文件放到我目录下,重新编译,但还是乱码
----------------------------------------------
(无语了)
作者:
男 zjttpzg (pzg) ★☆☆☆☆ -
普通会员
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;
----------------------------------------------
-
作者:
男 sammy (谭) ★☆☆☆☆ -
盒子活跃会员
2008/10/16 23:25:09
15楼: 搞了一下午,可以了,用的是FR4.7.5,但在FR4.7.2里处理就是不得,没得办法
----------------------------------------------
(无语了)
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行89.84375毫秒 RSS