像ASPack一样从INI文件载入语言包

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

参数一:为一Component,一般为TForm,此过程将循环列举其子Component并查找是否具有相关属性,
有的话则从INI文件读取信息并设置属性
参数二:为INI文件全名

//引用TypInfo单元
//声明的资源,默认的,防止变量出现空值
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   : string  = ''
   );
//设置语言

 function PropertyExists(
     const AObject   : TObject;
     const APropName : String
     ):Boolean;
 //判断一个属性是否存在
 var
   PropInfo:PPropInfo;
 begin
   PropInfo:=GetPropInfo(AObject.ClassInfo,APropName);
   Result:=Assigned(PropInfo);
 end;

 function SetStringPropertyIfExists(
     const AObject   : TObject;
     const APropName : string;
     const AValue    : string
     ):Boolean;
 //给字符串属性赋值,如果存在
 var
   PropInfo:PPropInfo;
 begin
   PropInfo:=GetPropInfo(AObject.ClassInfo,APropName);
   if Assigned(PropInfo) and
       (PropInfo.PropType^.Kind in [tkString, tkLString, tkWString]) then
   begin
     SetStrProp(AObject,PropInfo,AValue);
     Result:=True;
   end else
     Result:=False;
 end;

 function GetStringProperty(
     const AObject   : TObject;
     const APropName : string
     ):String;
 //取得字符串属性值
 var
   PropInfo:PPropInfo;
 begin
   Result  :=  '';
   PropInfo:=GetPropInfo(AObject.ClassInfo,APropName);
   if Assigned(PropInfo) and
       (PropInfo^.PropType^.Kind in [tkString, tkLString, tkWString]) then
     Result  :=  GetStrProp(AObject,PropInfo);
 end;

 function SetIntegerPropertyIfExists(
     const AObject   : TObject;
     const APropName : string;
     const AValue    : integer
     ):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 : string
     ):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         : string;
 sFileName : string;
begin
 if AFileName  = '' then
   sFileName :=  FsLanguage  //FsLanguage为默认语言文件名
 else
   sFileName :=  AFileName;
 if not FileExists(sFileName) then Exit;
 with TIniFile.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;

//示例INI文件Chinese.ini
[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=关闭窗口

posted @ 2006-03-23 02:26  hingman  阅读(379)  评论(0)    收藏  举报