zoukankan      html  css  js  c++  java
  • 利用INI文件实现界面无闪烁多语言切换

    {  For example :
    procedure TForm1.ComboBox1Change(Sender: TObject);
    begin
      SetActiveLanguage(ComboBox1.Text);
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ComboBox1.Items.AddStrings(SearchLanguagePack);
    end;
    }

    unit uLanguage;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Menus, IniFiles, ComCtrls
      ,AdvGlowButton, AdvNavBar, AdvOfficePager
      ;
    //搜索ini文件生成语言列表
    function SearchLanguagePack: TStrings;
    //根据当前选择的语言设置指定窗体及其子控件的属性
    procedure SetActiveLanguage(owner: TForm; const LanguageName: string);
    //将指定窗体及其子控件的属性写入INI文件
    procedure Writeproperty(owner: TForm; const LanguageName: string);

    implementation

    function SearchLanguagePack:TStrings;
    var
      ResultStrings:TStrings;
      DosError:integer;
      SearchRec:TsearchRec;
    begin
      ResultStrings:=TStringList.Create;
      DosError:=FindFirst(ExtractFilePath(Application.ExeName)+'language/'+'*.ini', faAnyFile, SearchRec);
      while DosError=0 do
      begin
        { 返回的文件名并去掉末尾的.ini字符 }
        ResultStrings.Add(ChangeFileExt(SearchRec.Name,''));
        DosError:=FindNext(SearchRec);
      end;
      FindClose(SearchRec);
      Result:=ResultStrings;
    end;

    procedure Writeproperty(owner: TForm; const LanguageName: string);
    var
      c:TComponent;
      i:Integer;
    begin
      if owner = nil then exit;
      with TInifile.Create(ExtractFilePath(Application.ExeName)+'language/'+LanguageName+'.ini') do
      begin
        WriteString(owner.Name, owner.Name+'.Caption', owner.Caption);
        for i:=0 to owner.ComponentCount-1 do
        begin
          c:=owner.Components[i];
          if c is TLabel then
          begin
            writeString(owner.Name, c.Name+'.Caption', (c as TLabel).Caption);
          end else
          if c is TCheckBox then
          begin
            writeString(owner.Name,c.Name+'.Caption',(c as TCheckBox).Caption);
          end else
          if c is TButton then
          begin
            writeString(owner.Name,c.Name+'.Caption',(c as TButton).Caption);
            writeString(owner.Name,c.Name+'.Hint',(c as TButton).Hint);
          end else
          if c is TMenuItem then
          begin
            writeString(owner.Name,c.Name+'.Caption',(c as TMenuItem).Caption);
          end else
          if c is TToolButton then
          begin
            writeString(owner.Name,c.Name+'.Caption',(c as TToolButton).Caption);
            writeString(owner.Name,c.Name+'.Hint',(c as TToolButton).Hint);
          end else
          if c is TAdvGlowButton then
          begin
            writeString(owner.Name,c.Name+'.Caption',(c as TAdvGlowButton).Caption);
            writeString(owner.Name,c.Name+'.Hint',(c as TAdvGlowButton).Hint);
          end else
          if c is TAdvOfficePage then
          begin
            writeString(owner.Name,c.Name+'.Caption',(c as TAdvOfficePage).Caption);
            writeString(owner.Name,c.Name+'.Hint',(c as TAdvOfficePage).Hint);
          end else
          if c is TAdvNavBarPanel then
          begin
            writeString(owner.Name,c.Name+'.Caption',(c as TAdvNavBarPanel).Caption);
          end;
        end;
        //处理字符串变量
      //  M1:=ReadString(Messages,'M1',M1);
      end;
    end;

    procedure SetActiveLanguage(owner: TForm; const LanguageName:string);
    const
      Messages='Messages';    //字符串变量小节
    var
      c:TComponent;
      i:Integer;
    begin
      if owner = nil then exit;
      with TInifile.Create(ExtractFilePath(Application.ExeName)+'language/'+LanguageName+'.ini') do
      begin
         owner.Caption := readstring(owner.Name, owner.Name+'.Caption', owner.Caption);
        for i:=0 to owner.ComponentCount-1 do
        begin
          c:=owner.Components[i];
          if c is TLabel then
          begin
            (c as TLabel).Caption:=ReadString(owner.Name,c.Name+'.Caption',(c as TLabel).Caption);
          end else
          if c is TCheckBox then
          begin
            (c as TCheckBox).Caption:=ReadString(owner.Name,c.Name+'.Caption',(c as TCheckBox).Caption);
          end else
          if c is TButton then
          begin
            (c as TButton).Caption:=ReadString(owner.Name,c.Name+'.Caption',(c as TButton).Caption);
            (c as TButton).Hint:=ReadString(owner.Name,c.Name+'.Hint',(c as TButton).Hint);
          end else
          if c is TMenuItem then
          begin
            (c as TMenuItem).Caption:=ReadString(owner.Name,c.Name+'.Caption',(c as TMenuItem).Caption);
          end else
          if c is TToolButton then
          begin
            (c as TToolButton).Caption:=ReadString(owner.Name,c.Name+'.Caption',(c as TToolButton).Caption);
            (c as TToolButton).Hint:=ReadString(owner.Name,c.Name+'.Hint',(c as TToolButton).Hint);
          end else
          if c is TAdvGlowButton then
          begin
            (c as TAdvGlowButton).Caption:=ReadString(owner.Name,c.Name+'.Caption',(c as TAdvGlowButton).Caption);
            (c as TAdvGlowButton).Hint:=ReadString(owner.Name,c.Name+'.Hint',(c as TAdvGlowButton).Hint);
          end else
          if c is TAdvOfficePage then
          begin
            (c as TAdvOfficePage).Caption:=ReadString(owner.Name,c.Name+'.Caption',(c as TAdvOfficePage).Caption);
            (c as TAdvOfficePage).Hint:=ReadString(owner.Name,c.Name+'.Hint',(c as TAdvOfficePage).Hint);
          end else
          if c is TAdvNavBarPanel then
          begin
            (c as TAdvNavBarPanel).Caption:=ReadString(owner.Name,c.Name+'.Caption',(c as TAdvNavBarPanel).Caption);
          end;
        end;
        //处理字符串变量
      //  M1:=ReadString(Messages,'M1',M1);
      end;
    end;

    end.

  • 相关阅读:
    Linux学习笔记(6)磁盘分区(LVM)
    Linux学习笔记(5)磁盘分区(parted)
    sql server升级打补丁
    sql server中index的REBUILD和REORGANIZE的区别及工作方式
    【sql server邮件】sql server如何把查询结果发邮件出去
    学习系列
    EasySQLMAIL使用实践系列
    利用EasySQLMAIL实现自动填写Excel表格并发送邮件(2)
    需求分析Point
    实现Word的列表样式
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2940938.html
Copyright © 2011-2022 走看看