国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

利用INI文件實(shí)現(xiàn)界面無閃爍多語言切換

2019-11-18 18:50:41
字體:
供稿:網(wǎng)友
越來越多的程序使用了多國語言切換,雖然DELPHI自帶多語言包的添加和配置,
但是那種方法在切換語言時界面會出現(xiàn)閃爍,而且實(shí)現(xiàn)起來很麻煩,這里我介紹給大家的是利用INI文件來讀取界面的語種文字,
用這種方法,不但簡單易行,而且在切換的時候不會出現(xiàn)界面的閃爍。
    我們從一個例子出發(fā),看看怎么實(shí)現(xiàn)語言的切換。首先建立一個新工程。放置如上圖的組件

    MainMenu1: TMainMenu;
    File1: TMenuItem;
    Exit1: TMenuItem;
    Label1: TLabel;
    Button1: TButton;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    Button2: TButton;
    Label2: TLabel;
    ComboBox1: TComboBox;
    Label3: TLabel;

由于要讀取Ini文件,所以在USES中加入聲明IniFiles;
然后將Button1和Button2的ShowHint屬性設(shè)置為True;
其中我們用ComboBox1來顯示可供選擇的語言和用來選擇語言。
我們在程序的目錄下編輯如下的Chinese GB.Ini文件:
;///////////////////////////////////////////////////////////////////
;
;  翻譯的一些規(guī)則:
;  翻譯前,拷貝 Chinese GB.ini 改名到 yourlanguage.ini
;  僅僅翻譯符號'='后的文字
;
[Translations]
;
Label1.Caption  =文字1
Label2.Caption  =文字2
Label3.Caption  =語言
Button1.Caption =按鈕1
Button2.Caption =按鈕2
Button1.Hint    =按鈕1_提示
Button2.Hint    =按鈕2_提示
CheckBox1.Caption       =復(fù)選框1
CheckBox2.Caption       =復(fù)選框2
File1.Caption   =文件
Exit1.Caption   =退出
;
[Messages]

M1      =信息框測試
;
;//////////////////////////////////////////////////////////////////
同樣的方法編輯一個名為English.ini的文件,將“=”左邊的文字改為英文。
例如:Label1.Caption    =Label1

程序運(yùn)行時,我們查找當(dāng)前目錄下所有的語言配置文件(*.ini),
為了達(dá)到這個目的,
我編寫了如下的函數(shù)搜索目錄下所有的語言配置文件的文件名,
然后將文件名去掉ini擴(kuò)展名保存返回:
function TForm1.SearchLanguagePack:TStrings;
var
  ResultStrings:TStrings;       
  DosError:integer;
  SearchRec:TsearchRec;
begin
  ResultStrings:=TStringList.Create;
  DosError:=FindFirst(ExtractFilePath(ParamStr(0))+'*.ini', faAnyFile, SearchRec);
  while DosError=0 do
  begin
    { 返回的文件名并去掉末尾的.ini字符 }
    ResultStrings.Add(ChangeFileExt(SearchRec.Name,'));
    DosError:=FindNext(SearchRec);
  end;
  FindClose(SearchRec);
  Result:=ResultStrings;
end;

在Form建立的事件中添加代碼,將目錄下所有的語言文件名加入選擇列表框中。
PRocedure TForm1.FormCreate(Sender: TObject);
begin
  ComboBox1.Items.AddStrings(SearchLanguagePack);
end;

程序的重點(diǎn)在如何切換語言,在ComboBox1的OnChange事件中進(jìn)行切換操作。
這里我寫了SetActiveLanguage過程用于實(shí)現(xiàn)這一操作。
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  SetActiveLanguage(ComboBox1.Text);
end;
其中SetActiveLanguage代碼如下:
procedure TForm1.SetActiveLanguage(LanguageName:string);
const
  Translations='Translations';
  Messages='Messages';
var
  frmComponent:TComponent;
  i:Integer;
begin
  with TInifile.Create(ExtractFilePath(ParamStr(0))+LanguageName+'.ini') do
  begin
    for i:=0 to ComponentCount-1 do { 遍歷Form組件 }
    begin
      frmComponent:=Components[i];
      if frmComponent is TLabel then { 如果組件為TLabel型則當(dāng)作TLabel處理,以下同 }
      begin
        (frmComponent as TLabel).Caption:=
        ReadString(Translations,frmComponent.Name
          +'.Caption',(frmComponent as TLabel).Caption);
      end;
      if frmComponent is TCheckBox then
      begin
        (frmComponent as TCheckBox).Caption:=
        ReadString(Translations,frmComponent.Name
          +'.Caption',(frmComponent as TCheckBox).Caption);        
      end;
      if frmComponent is TButton then
      begin
        (frmComponent as TButton).Caption:=
        ReadString(Translations,frmComponent.Name
          +'.Caption',(frmComponent as TButton).Caption);
        (frmComponent as TButton).Hint:=
        ReadString(Translations,frmComponent.Name
          +'.Hint',(frmComponent as TButton).Hint);
      end;
      if frmComponent is TMenuItem then
      begin
        (frmComponent as TMenuItem).Caption:=
        ReadString(Translations,frmComponent.Name
          +'.Caption',(frmComponent as TMenuItem).Caption);
      end;
    end;
    M1:=ReadString(Messages,'M1',M1);
  end;
end;
在這個過程中,我們遍歷了Form中的所有組件,
根據(jù)他們的類別和組件名動態(tài)的從ini配置文件中讀出應(yīng)該顯示的語言文字。
用遍歷組件的方法比一個一個寫出具體的組件維護(hù)起來要方便很多,代碼的適應(yīng)性也更強(qiáng)。
其中M1為一個字符串變量,這樣提示消息也能切換,比如在Button1的Click事件中
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(M1);
end;
就可以根據(jù)不同的語言給出不同的提示文字。

好了,整個工程就做完了,你可以運(yùn)行測試一下,是不是切換迅速而且無閃爍。

  作者:萬重(www.DelphiBox.com)  2000.6.9

上一篇:隨心所欲取顏色(鼠標(biāo)經(jīng)過的地方顏色值均可取到)

下一篇:如何在注冊表中注冊BDE

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 买车| 军事| 柳河县| 枞阳县| 哈密市| 桑植县| 黄浦区| 绥阳县| 大田县| 扶余县| 望城县| 温宿县| 萝北县| 成都市| 武威市| 买车| 乌恰县| 安泽县| 虹口区| 永登县| 金沙县| 张家界市| 灌阳县| 江永县| 绩溪县| 崇礼县| 健康| 兴仁县| 时尚| 六安市| 延安市| 建瓯市| 彩票| 沁源县| 光泽县| 合肥市| 文成县| 屯门区| 九寨沟县| 廉江市| 横峰县|