日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Delphi用ini文档实现界面无闪烁多语言转换

發布時間:2025/3/8 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delphi用ini文档实现界面无闪烁多语言转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

越來越多的程序使用了多國語言切換,雖然DELPHI自帶多語言包的添加和配置,??
但是那種方法在切換語言時界面會出現閃爍,而且實現起來很麻煩,這里我介紹給大家的是利用INI文件來讀取界面的語種文字,??
用這種方法,不但簡單易行,而且在切換的時候不會出現界面的閃爍。??
??????? 我們從一個例子出發,看看怎么實現語言的切換。首先建立一個新工程。放置如上圖的組件:??

??????? 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屬性設置為True;??
其中我們用ComboBox1來顯示可供選擇的語言和用來選擇語言。??
我們在程序的目錄下編輯如下的Chinese?? GB.Ini文件:??
;///??
;??
;???? 翻譯的一些規則:??
;???? 翻譯前,拷貝?? 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?????????????? =復選框1??
CheckBox2.Caption?????????????? =復選框2??
File1.Caption?????? =文件??
Exit1.Caption?????? =退出??
;??
[Messages]??
;????
M1???????????? =信息框測試??
;??
;//??
同樣的方法編輯一個名為English.ini的文件,將“=”左邊的文字改為英文。??
例如:Label1.Caption???????? =Label1??

程序運行時,我們查找當前目錄下所有的語言配置文件(*.ini),??
為了達到這個目的,??
我編寫了如下的函數搜索目錄下所有的語言配置文件的文件名,??
然后將文件名去掉ini擴展名保存返回:??
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;??

程序的重點在如何切換語言,在ComboBox1的OnChange事件中進行切換操作。??
這里我寫了SetActiveLanguage過程用于實現這一操作。??
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型則當作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中的所有組件,??
根據他們的類別和組件名動態的從ini配置文件中讀出應該顯示的語言文字。??
用遍歷組件的方法比一個一個寫出具體的組件維護起來要方便很多,代碼的適應性也更強。??
其中M1為一個字符串變量,這樣提示消息也能切換,比如在Button1的Click事件中??
procedure?? TForm1.Button1Click(Sender:?? TObject);??
begin??
??? ShowMessage(M1);??
end;??
就可以根據不同的語言給出不同的提示文字。??

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

總結

以上是生活随笔為你收集整理的Delphi用ini文档实现界面无闪烁多语言转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。