我想把我的程序界面做为可简繁互换!
请问我该如何实现!
谁有好的例子,或者有写好的代码可以给我参考吗!  

解决方案 »

  1.   

    一般都是用ini文件实现的,你可以搜索一下:“多语界面切换”
      

  2.   

    QQ群7568683(delphi专题研讨会)的共享目录上有一个叫GB2Big5.rar和Demo for GB2Bi5.rar的两个文件,一个是组件,另一个是Demo。
    (全部函源码)
    注:为在一定途径上免除病毒的传播,使用前请自行编译后再使用
      

  3.   

    使用GBK的繁体编码,可以同时在2个系统上正常显示。不过要是显示对方保存的BIG5字符,就需要用WINAPI实现了,我以前曾经回复过此类问题。
    代码如下:
    ------------------------------------
    unit UserTypes;interface
    uses
    Windows;
    type
      TLanguageType = (LanguageType_Simplified, LanguageType_Traditional);
    //  TLanguage = (Language_GB, Language_BIG5);
    type
    TVersionInfoItem =
       (viCompanyName, viFileDescription, viFileVersion, viInternalName,
        viLegalCopyright, viLegalTradeMarks, viOriginalFilename, viProductName,
        viProductVersion, viComments);
    implementationend.
    ------------------------------------
    unit BIG5_GB_Convert;interface
    uses
    UserTypes;
    function WinGBToBIG5(Source, Destination: PChar; iLen: integer; LanguageType: TLanguageType): WordBool; export; stdcall;
    function WinBIG5ToGB(Source, Destination: PChar; iLen: integer; LanguageType: TLanguageType): WordBool; export; stdcall;
    function LCMAPConvert(Source, Destination: PChar; iLen: integer; LanguageType: TLanguageType): WordBool; export; stdcall;implementation
    uses
    Windows,
      SysUtils;function LCMAPConvert(Source, Destination: PChar; iLen: integer; LanguageType: TLanguageType): WordBool;
    var
    iSourceLen: integer;  //需要转换的字符数
      sNew: string;
    begin
    result := false;
    if iLen >= Length(Source) then
      begin
    iSourceLen := length(Source);
       //给sGB_New分配内存
      SetLength(sNew, iSourceLen);
       if LanguageType =  LanguageType_Simplified then
         //转换GB码到GB码简体,使用API函数LCMapString
        LCMapString($0804, LCMAP_SIMPLIFIED_CHINESE, Source, -1, PChar(sNew), iSourceLen)
      else
      //转换Gb码简体到Gb码繁体,使用API函数LCMapString
    LCMapString($0804, LCMAP_TRADITIONAL_CHINESE, Source, -1, PChar(sNew), iSourceLen);
      StrCopy(Destination, PChar(snew));
       result := true;
      end;
    end;function Big5ToGB(sBig5: string; LanguageType: TLanguageType): string;
    var
    wsUnicode: WideString; //Unicode编码的字符
    sGB: AnsiString;  //GB编码的字符
    iLen: integer;  //需要转换的字符数
      sGB_New: string;   //根据标志转换的Gb编码
    begin
    //计算转换的字符数
    iLen := MultiByteToWideChar(950, 0, PChar(sBig5), -1, nil, 0);
      //给wszUnicode分配内存
      SetLength(wsUnicode, iLen);
      ZeroMemory(PWideChar(wsUnicode), SizeOf(WideChar) * iLen);
      //转换Big5码到Unicode码,使用了API函数MultiByteToWideChar
      MultiByteToWideChar(950, MB_COMPOSITE, PChar(sBig5), -1, PWideChar(wsUnicode), Length(wsUnicode));  //计算转换的字符数
      iLen := WideCharToMultiByte (936, 0, PWideChar(wsUnicode), -1, nil, 0, nil, nil);
      //给sGB分配内存
      SetLength(sGB, iLen);
      ZeroMemory(PChar(sGB), SizeOf(Char) * iLen);
      //转换Unicode码到Gb码,使用API函数WideCharToMultiByte
      WideCharToMultiByte(936, WC_COMPOSITECHECK, PWideChar(wsUnicode), -1, PAnsiChar(sGB), Length(sGB), '?', PBOOL(false));
      sGB := PChar(sGB); iLen := length(sGB);
      if iLen = 0 then exit;
      //给sGB_New分配内存
      SetLength(sGB_New, iLen);
      ZeroMemory(PChar(sGB_New), SizeOf(Char) * iLen);
      if LanguageType =  LanguageType_Simplified then
      //转换GB码到GB码简体,使用API函数LCMapString
        LCMapString($0804, LCMAP_SIMPLIFIED_CHINESE, PChar(sGB), -1, PChar(sGB_New), iLen)
      else
      //转换Gb码简体到Gb码繁体,使用API函数LCMapString
    LCMapString($0804, LCMAP_TRADITIONAL_CHINESE, PChar(sGB), -1, PChar(sGB_New), iLen);
      sGB_New := PChar(sGB_New);  if Length(sGB_New) > 0 then
        Result := sGB_New
      else
        Result := sGB;
    end;function GBToBig5(sGB: string; LanguageType: TLanguageType): string;
    var
    wsUnicode: WideString; //Unicode编码的字符
    sBig5: AnsiString;  //Big5编码的字符
    iLen: integer;  //需要转换的字符数
      sGB_New: string;   //根据标志转换的Gb编码
    begin
    iLen := length(sGB);
      //给sGB_New分配内存
      SetLength(sGB_New, iLen);
      ZeroMemory(PChar(sGB_New), SizeOf(Char) * iLen);
      if LanguageType =  LanguageType_Simplified then
      //转换GB码到GB码简体,使用API函数LCMapString
    LCMapString($0804, LCMAP_SIMPLIFIED_CHINESE, PChar(sGB), -1, PChar(sGB_New), iLen)
      else
      //转换GB码到GB码繁体,使用API函数LCMapString
    LCMapString($0804, LCMAP_TRADITIONAL_CHINESE, PChar(sGB), -1, PChar(sGB_New), iLen);  sGB_New := PChar(sGB_New);
      if Length(sGB_New) = 0 then //转换不成功
        sGB_New:= sGB; //计算转换的字符数
    iLen := MultiByteToWideChar (936, 0, PChar(sGB_New), -1, nil, 0);
      //给wszUnicode分配内存
      SetLength(wsUnicode, iLen);
      ZeroMemory(PWideChar(wsUnicode), SizeOf(WideChar) * iLen);
      //转换Gb码到Unicode码,使用了API函数MultiByteToWideChar
      MultiByteToWideChar(936, MB_COMPOSITE, PChar(sGB_New), -1, PWideChar(wsUnicode), Length(wsUnicode)); //计算转换的字符数
      iLen := WideCharToMultiByte (950, 0, PWideChar(wsUnicode), -1, nil, 0, nil, nil);
      //给sBig5分配内存
      SetLength(sBig5, iLen);
      ZeroMemory(PChar(sBig5), SizeOf(Char) * iLen);
      //转换Unicode码到Big5码,使用API函数WideCharToMultiByte
      WideCharToMultiByte(950, WC_COMPOSITECHECK, PWideChar(wsUnicode), -1, PAnsiChar(sBig5), Length(sBig5), '?', PBOOL(false));  Result := sBig5;
    end;function WinGBToBIG5(Source, Destination: PChar; iLen: integer; LanguageType: TLanguageType): WordBool;
    var
      sConvert : string;
    begin
    if (iLen >= Length(Source)) and (Length(Source) > 0) then
      begin
    sConvert := GBToBIG5(Source, LanguageType);
        StrCopy(Destination, PChar(sConvert));
       result := true;
      end
      else
        result := false;
    end;function WinBIG5ToGB(Source, Destination: PChar; iLen: integer; LanguageType: TLanguageType): WordBool;
    var
      sConvert : string;
    begin
    if (iLen >= Length(Source)) and (Length(Source) > 0) then
      begin
    sConvert := BIG5ToGB(Source, LanguageType);
        StrCopy(Destination, PChar(sConvert));
       result := true;
      end
      else
        result := false;
    end;
    end.
      

  4.   

    回复人: 快乐老猫(无米下炊) ( ) 信誉:99  2005-03-07 22:23:00  得分: 0 
    使用GBK的繁体编码,可以同时在2个系统上正常显示。不过要是显示对方保存的BIG5字符,就需要用WINAPI实现了,我以前曾经回复过此类问题。在繁体系统下我试了好久了,就是不行.
    唉,这个问题已经困扰我n久了,
    我有个converZ的小工具,
    可以实现GB->BIG5,BIG5->GB,还有统一码的简繁互换.
    看他界面上几个bitmap,都是delphi里面的,估计八成是delphi写的.
    就是不知道它源码...
      

  5.   

    到http://www.delphibox.com
    看看,找个繁简转换的,有个big52gb的pas文件可以使用;
    不过在繁体系统看简体字总是有问题的;