delphi 从INI文件载入语言包

下面是一个通用过程,根据INI文件中的资源改变界面语言(仅Caption和Hint属性)

参数一:为一Component,一般为TForm,此过程将循环列举其子Component并查找是否具有相关属性,

有的话则从INI文件读取信息并设置属性

参数二:为INI文件全名

//引用TypInfo,IniFiles/TntInifiles单元

//声明的资源,默认的,防止变量出现空值

resourcestring

S_Menu = 'Menu';

S_AppName = 'Window View Tool';

S_Null = '(Null)';

S_About = '&About...';

S_Warning = 'Warning';

S_Confirm = 'Confirm';

S_Error = 'Error';

S_Information = 'Information';

//声明的常量

const

SCaption = 'Caption';

SHint = 'Hint';

SIniAppName = 'Window View Tools';

SIniLanguage = 'Language';

SLanguageName = 'LanguageName';

{-----------------------------------------------------------------------------

Procedure: LoadLanguage

Author: ysai

Date: 2003-7-20

Arguments: AComponent:TComponent;AFileName:string=''

-----------------------------------------------------------------------------}

procedure LoadLanguage(

const AComponent : TComponent;

const AFileName : widestring = ''

);

//设置语言

function PropertyExists(

const AObject : TObject;

const APropName : wideString

):Boolean;

//判断一个属性是否存在

var

PropInfo:PPropInfo;

begin

PropInfo:=GetPropInfo(AObject.ClassInfo,APropName);

Result:=Assigned(PropInfo);

end;

function SetStringPropertyIfExists(

const AObject : TObject;

const APropName : widestring;

const AValue : widestring

):Boolean;

//给字符串属性赋值,如果存在

var

PropInfo:PPropInfo;

begin

PropInfo:=GetPropInfo(AObject.ClassInfo,APropName);

if Assigned(PropInfo) and

(PropInfo.PropType^.Kind in [tkString, tkLString, tkWString]) then

begin

SetWideStrProp(AObject,PropInfo,AValue);

Result:=True;

end else

Result:=False;

end;

function GetStringProperty(

const AObject : TObject;

const APropName : widestring

):wideString;

//取得字符串属性值

var

PropInfo:PPropInfo;

begin

Result := '';

PropInfo:=GetPropInfo(AObject.ClassInfo,APropName);

if Assigned(PropInfo) and

(PropInfo^.PropType^.Kind in [tkString, tkLString, tkWString]) then

Result := GetWideStrProp(AObject,PropInfo);

end;

function SetIntegerPropertyIfExists(

const AObject : TObject;

const APropName : widestring;

const AValue : Longint

):Boolean;

//给整型属性赋值,如果存在

var

PropInfo:PPropInfo;

begin

PropInfo:=GetPropInfo(AObject.ClassInfo,APropName);

if Assigned(PropInfo) and

(PropInfo^.PropType^.Kind = tkInteger) then

begin

SetOrdProp(AObject,PropInfo,AValue);

Result:=True;

end else

Result:=False;

end;

function GetObjectProperty(

const AObject : TObject;

const APropName : widestring

):TObject;

var

PropInfo:PPropInfo;

begin

Result := nil;

PropInfo:=GetPropInfo(AObject.ClassInfo,APropName);

if Assigned(PropInfo) and

(PropInfo^.PropType^.Kind = tkClass) then

Result := GetObjectProp(AObject,PropInfo);

end;

var

i : Integer;

s : widestring;

FsLanguage,sFileName : widestring;

SAppName: widestring;

SMenu : widestring;

SNull : widestring;

SAbout: widestring;

SWarning : widestring;

SConfirm : widestring;

SError : widestring;

SInformation: widestring;

begin

if AFileName = '' then

sFileName :=FsLanguage //FsLanguage为默认语言文件名

else

sFileName :=AFileName;

if not FileExists(sFileName) then Exit;

with TTntIniFile.Create(sFileName) do

try

//下面为读取变量

SAppName := ReadString(SIniLanguage,'AppName',S_AppName);

SMenu := ReadString(SIniLanguage,'Menu',S_Menu);

SNull := ReadString(SIniLanguage,'Null',S_Null);

SAbout := ReadString(SIniLanguage,'About',S_About);

SWarning := ReadString(SIniLanguage,'Warning',S_Warning);

SConfirm := ReadString(SIniLanguage,'Confirm',S_Confirm);

SError := ReadString(SIniLanguage,'Error',S_Error);

SInformation := ReadString(SIniLanguage,'Information',S_Information);

//设置组件Caption

if PropertyExists(AComponent,SCaption) then

begin

s := ReadString(SIniLanguage,AComponent.Name+'.'+SCaption,'');

if s<>'' then

SetStringPropertyIfExists(AComponent,SCaption,s);

end;

//读取字体

if PropertyExists(AComponent,'Font') then

begin

s := ReadString(SIniLanguage,'FontName','');

i := ReadInteger(SIniLanguage,'FontSize',0);

if s<>'' then

SetStringPropertyIfExists(

GetObjectProperty(AComponent,'Font'),'Name',s);

if i > 0 then

SetIntegerPropertyIfExists(

GetObjectProperty(AComponent,'Font'),'Size',i);

end;

//列举所有子组件并设置属性

for i := 0 to AComponent.ComponentCount - 1 do

begin

//设置Caption

if PropertyExists(AComponent.Components[i],SCaption) then

begin

s := ReadString(SIniLanguage,AComponent.Name+'.'+

AComponent.Components[i].Name+'.'+SCaption,'');

if s<>'' then

SetStringPropertyIfExists(AComponent.Components[i],SCaption,s);

end;

//设置Hint

if PropertyExists(AComponent.Components[i],SHint) then

begin

s := ReadString(SIniLanguage,AComponent.Name+'.'+

AComponent.Components[i].Name+'.'+SHint,'');

if s = '' then //如果Hint为空,则改Hint同Caption

s := GetStringProperty(AComponent.Components[i],SCaption);

if s<>'' then

SetStringPropertyIfExists(AComponent.Components[i],SHint,s);

end;

end;

//更改默认语言文件为当前文件

FsLanguage := sFileName;

finally

Free;

end;

end;

procedure TFrmWindowView.FormShow(Sender: TObject);

begin //加载语言文件

if FileExists(ExtractFilePath(Application.exename)+'\Chinese.ini') then

LoadLanguage(FrmWindowView,ExtractFilePath(Application.exename)+'\Chinese.ini');

end;

//示例INI文件Chinese.ini 用记事本编辑ini,保存为unicode编码格式 窗口及所有控件用TntWare2.3,以方便显示Unicode字符.

[Language]

LanguageName=中文

AppName=窗口查看器

Menu=菜单

Null=(空)

About=关于(&A)...

Warning=警告

Confirm=确认

Error=错误

Information=信息

FontName=宋体

FontSize=9

FrmWindowView.Caption=窗口查看器

FrmWindowView.tbFile.Caption=文件(&F)

FrmWindowView.tbFile.Hint=文件菜单

FrmWindowView.tbOption.Caption=选项(&O)

FrmWindowView.tbOption.Hint=选项菜单

FrmWindowView.tbTools.Caption=工具(&T)

FrmWindowView.tbTools.Hint=工具菜单

FrmWindowView.tbHelp.Caption=帮助(&H)

FrmWindowView.tbHelp.Hint=帮助菜单

FrmWindowView.panSearch.Caption=搜索文本:

FrmWindowView.panSearch.Hint=搜索文本

FrmWindowView.edtSearch.Hint=在此键入搜索文本

FrmWindowView.btnSearch.Caption=搜索

FrmWindowView.btnSearch.Hint=开始搜索

FrmWindowView.tv.Hint=捕获结果,按鼠标右键弹出动作菜单

FrmWindowView.acExit.Caption=退出(&X)

FrmWindowView.acExit.Hint=退出程序

FrmWindowView.acLockCapture.Caption=锁定捕获

FrmWindowView.acLockCapture.Hint=选定后将鼠标移动到目标对象上

FrmWindowView.acCapture.Caption=捕获

FrmWindowView.acCapture.Hint=按住鼠标然后拖曳到目标对象上

FrmWindowView.acCaptureAll.Caption=捕获所有

FrmWindowView.acCaptureAll.Hint=捕获所有可列举出的窗口

FrmWindowView.acAutoHide.Caption=自动隐藏

FrmWindowView.acAutoHide.Hint=在捕获时自动隐藏程序

FrmWindowView.acStayOnTop.Caption=总在最前

FrmWindowView.acStayOnTop.Caption=窗口总在最前

FrmWindowView.acLanguage.Caption=语言(&L)

FrmWindowView.acLanguage.Hint=选择语言

FrmWindowView.acProcessManage.Caption=进程管理

FrmWindowView.acProcessManage.Hint=打开进程管理工具

FrmWindowView.acAbout.Caption=关于(&A)...

FrmWindowView.acAbout.Hint=显示关于窗口

FrmWindowView.acCopy.Caption=复制(&C)

FrmWindowView.acCopy.Hint=复制所选节点内容

FrmWindowView.acEnable.Caption=使用(&E)

FrmWindowView.acEnable.Hint=使选中的对象可用

FrmWindowView.acDisable.Caption=禁用(&D)

FrmWindowView.acDisable.Hint=使选中的对象不可用

FrmWindowView.acShow.Caption=显示(&S)

FrmWindowView.acShow.Hint=显示选中的对象

FrmWindowView.acHide.Caption=隐藏(&H)

FrmWindowView.acHide.Hint=隐藏选中的对象

FrmWindowView.acDelete.Caption=删除(&L)

FrmWindowView.acDelete.Hint=删除选中的对象(不能恢复)

FrmWindowView.acExport.Caption=导出(&X)...

FrmWindowView.acExport.Hint=导出选中的节点及子节点树到文件

FrmProcessManage.Caption=进程管理

FrmProcessManage.labProcessList.Caption=进程列表(&L)

FrmProcessManage.labProcessList.Hint=当前进程列表

FrmProcessManage.lbProcessList.Hint=当前进程列表

FrmProcessManage.btnRefresh.Caption=刷新(&R)

FrmProcessManage.btnRefresh.Hint=刷新进程列表

FrmProcessManage.btnEndProcess.Caption=结束进程(&C)

FrmProcessManage.btnEndProcess.Hint=结束选择的多个进程(小心使用)

FrmProcessManage.btnClose.Caption=关闭(&X)

FrmProcessManage.btnClose.Hint=关闭窗口