FastReport 4.9.20 中文菜单显示不全或者乱码解决方法:

可以自己编译一个frcc.exe,替换Res目录下的,然后再recompile即可。   delphi 2010(update5)测试界面都正常。

用delphi 2010建立一个console工程,名称为frcc,代码如下:

program frcc; 
{$APPTYPE CONSOLE}
uses
SysUtils,
Classes,
StrUtils;
var
xml: string;
list: TStringList;
i: Integer;
fileName : string;
lineWidth: integer;
line: string;
begin
try
if ParamCount < 1 then
begin
Writeln('no input');
Exit;
end;
xml := ParamStr(1);
fileName := ExtractFileName(xml);
fileName := Copy(fileName, 1, Length(fileName) - 4); //delete ext .xml
list := TStringList.Create();
list.LoadFromFile(xml, TEncoding.UTF8);
xml := list.Text;
list.Clear;
list.Add('unit ' + fileName + ';');
list.Add('');
list.Add('interface');
list.Add('{$I frx.inc}');
list.Add('implementation');
list.Add('uses frxRes;');
list.Add('const resXML =');
xml := ReplaceText(xml, #13, '');
xml := ReplaceText(xml, #10, '');
i := 1;
while True do
begin
if (i + 80) < (Length(xml) + 1) then
lineWidth := 80
else
lineWidth := Length(xml) + 1 - i;
if lineWidth = 0 then
break;
line := Copy(xml, i, lineWidth);
list.Add(QuotedStr(line) + '+');
i := i + lineWidth;
end;
list.Add(''''';');
list.Add('initialization');
list.Add('frxResources.AddXML(Utf8Encode(resXML));');
list.Add('');
list.Add('end.');
list.SaveToFile(ChangeFileExt(ParamStr(1), '.pas'), TEncoding.Default);
list.Free;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.

 

中文菜单不能正确显示是由于它自带的资源编译器太老,和Delphi2010自带的TEncoding.UTF8不匹配造成的.此资源编译器frcc主要就是将资源文件*.xml中的资源编码后生成相应的.pas文件,没干啥高深的活。
以下是网友自建的Frcc程序,可以正常显示中文了.

乱码 情况 如下图

 

 

=========================================================

2012.09.24-----补充

把上面的代码用delphi xe2 格式化了一下,以后用下面这个就可以了

 

program frcc;

{$APPTYPE CONSOLE}

{$R *.res}

uses System.SysUtils, System.Classes, System.StrUtils;

var
  xml: string;
  list: TStringList;
  i: Integer;
  fileName : string;
  lineWidth: integer;
  line: string;
begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    if ParamCount < 1 then
    begin
      Writeln('no input');
      Exit;
    end;
    xml := ParamStr(1);
    fileName := ExtractFileName(xml);
    fileName := Copy(fileName, 1, Length(fileName) - 4); //delete ext .xml
    list := TStringList.Create();
    list.LoadFromFile(xml, TEncoding.UTF8);
    xml := list.Text;
    list.Clear;
    list.Add('unit ' + fileName + ';');
    list.Add('');
    list.Add('interface');
    list.Add('{$I frx.inc}');
    list.Add('implementation');
    list.Add('uses frxRes;');
    list.Add('const resXML =');
    xml := ReplaceText(xml, #13, '');
    xml := ReplaceText(xml, #10, '');
    i := 1;
    while True do
    begin
      if (i + 80) < (Length(xml) + 1) then
        lineWidth := 80
      else
        lineWidth := Length(xml) + 1 - i;
      if lineWidth = 0 then
        break;
      line := Copy(xml, i, lineWidth);
      list.Add(QuotedStr(line) + '+');
      i := i + lineWidth;
    end;
    list.Add(''''';');
    list.Add('initialization');
    list.Add('frxResources.AddXML(Utf8Encode(resXML));');
    list.Add('');
    list.Add('end.');
    list.SaveToFile(ChangeFileExt(ParamStr(1), '.pas'), TEncoding.Default);
    list.Free;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

 


要是没有时间做用下面就可以了,我用delphi xe2 作好后上传了

https://files.cnblogs.com/del88/frcc.zip

2013.04.04补充xe3-update2版本生成出来的要frcc.exe要比原来的大4倍,上传了保留下,以后可以直接用

https://files.cnblogs.com/del88/frcc_xe3up2.7z

2013.09.01补充xe4-update1版本生成出来的要frcc.exe,上传了保留下,以后可以直接用

https://files.cnblogs.com/del88/frcc_xe4_1.zip

2014-10-04 xe7下

https://files.cnblogs.com/del88/frcc_xe7.zip

2014-12-03-xe7up1下

https://files.cnblogs.com/del88/Xe7Up1_frcc.zip

posted on 2011-12-16 11:43  del88  阅读(175)  评论(0编辑  收藏  举报