杂记
 


FastReport 4.12 VCL for Delphi XE2 中文乱码问题解决方法

作者:  2013-03-10 09:48:00     分类:Delphi     标签:

FastReport 4.12 VCL for Delphi XE2,按默认方法安装,将语言切换为中文简体后,不管是设计时还是运行时,设计器的菜单项部分中文乱码,从盒子搜索到了解决方法,摘录如下:

方法一:

第1步:将Source目录内的frxRes.pas修改:

	procedureTfrxResources.AddXML(constStr:AnsiString);
	var
	  Stream:TStringStream;
	begin
	  Stream:= TStringStream.Create(UTF8Encode(String(str)));
	  LoadFromStream(Stream);
	  Stream.Free;
	end;
	

第二步:将ResChinese目录内的xml文件用文本文件打开,将其另存为ASCII格式,然后运行mk.bat

第三,重新用recompile.exe编译

方法二:

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

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

	program frcc;
	
	{$APPTYPECONSOLE}
	
	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('noinput');
	      Exit;
	    end;
		
	    xml:=  ParamStr(1);
	    fileName:= ExtractFileName(xml);
	    fileName:= Copy(fileName, 1, Length(fileName)-4); //deleteext.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('{$Ifrx.inc}');
	    list.Add('implementation');
	    list.Add('usesfrxRes;');
	    list.Add('constresXML=');
		
	    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.
	
更多
阅读(828)     评论(0)