由于我在开发软件过程中,将软件分成了多个动态库,现在需要开发多语言版本.
经过测试发现EXE文件中,用DELPHI本身提供的多语言方式实现没有问题,
但动态库中无法实现多语言,
请高手指教,
如果可以实现我可以加分

解决方案 »

  1.   

    我自己用过一个很笨的方法
    就是在DLL中的所有Form都继承自一个基类(假设为FBase:TfBase),在TfBase中,写一个方法去读取所有控件的标题信息(信息放在 INi文件中,根据语言需要,选择不同的标题Ini文件)
      

  2.   

    procedure TfBase.pdReadCaptions(Sender:TControl;Const aHeader:String);
    var
       lnComp,i:Integer;
       Inifile:Tinifile;
    begin
      try
        Inifile:=Tinifile.Create(g_strIniFileName);
        if Sender=Self then
        begin
          Caption:=Inifile.ReadString(aHeader,'Caption',Caption);
          Font.Size:=s_nFontSize;
          Font.Name:=s_StrFontName;
          ParentFont:=false;
          lst.Add('Caption');
        end;    //
        with TControl(Sender) do
        for lnComp:=0 to ComponentCount-1 do
        begin 
           if (Components[lnComp] is TCommonDialog)  then
            Continue;      //Edit
          if  (Components[lnComp] is TEdit) then
          begin
            TEdit(Components[lnComp]).ParentFont:=false;
            TEdit(Components[lnComp]).Font.Size:=s_nFontSize;
            TEdit(Components[lnComp]).Font.Name:=s_StrFontName;  
            Continue;
          end;
          //DbEdit
          if (Components[lnComp] is TDbEdit) then
          begin
            TDbEdit(Components[lnComp]).ParentFont:=false;
            TDbEdit(Components[lnComp]).Font.Size:=s_nFontSize;
            TDbEdit(Components[lnComp]).Font.Name:=s_StrFontName;
            Continue;
          end;      //Panel
          if  (Components[lnComp] is TPanel) then
          begin
            TPanel(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TPanel(Components[lnComp]).Name,'');
            TPanel(Components[lnComp]).ParentFont :=False;
            TPanel(Components[lnComp]).Font.Size:=s_nFontSize;
            TPanel(Components[lnComp]).Font.Name:=s_StrFontName;        Continue;
          end;      //DbCheckBox
          if (Components[lnComp] is TDbCheckBox) then
          begin
            TDbCheckBox(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TDbCheckBox(Components[lnComp]).Name,'');
            TDbCheckBox(Components[lnComp]).ParentFont :=False;
            TDbCheckBox(Components[lnComp]).Font.Size:=s_nFontSize;
            TDbCheckBox(Components[lnComp]).Font.Name:=s_StrFontName;        Continue;
          end;      //Button
          if (Components[lnComp] is TButton)  then
          begin
            TButton(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
            TButton(Components[lnComp]).ParentFont:=False;
            TButton(Components[lnComp]).Font.Size:=s_nFontSize;
            TButton(Components[lnComp]).Font.Name:=s_StrFontName;        Continue;
          end;
          //CheckBox
          if  (Components[lnComp] is TCheckBox) then
          begin
            TCheckBox(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
            TCheckBox(Components[lnComp]).ParentFont :=False;
            TCheckBox(Components[lnComp]).Font.Size:=s_nFontSize;
            TCheckBox(Components[lnComp]).Font.Name:=s_StrFontName;
            Continue;
          end;
          //GroupBox
          if  (Components[lnComp] is TGroupBox) then
          begin
             TGroupBox(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
             TGroupBox(Components[lnComp]).ParentFont :=False;
             TGroupBox(Components[lnComp]).Font.Size:=s_nFontSize;
             TGroupBox(Components[lnComp]).Font.Name:=s_StrFontName;
             continue;
          end;
          //RadioButton
          if  (Components[lnComp] is TRadioGroup) then
          begin
            TRadioGroup(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
            Continue;
          end;
          //SpeedButton
          if  (Components[lnComp] is TSpeedButton) then
          begin
            TSpeedButton(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
            TSpeedButton(Components[lnComp]).ParentFont :=False;
            TSpeedButton(Components[lnComp]).Font.Size:=s_nFontSize;
            TSpeedButton(Components[lnComp]).Font.Name:=s_StrFontName;
            Continue;
          end;
          //StaticText
          if  (Components[lnComp] is TStaticText) then
          begin
            TStaticText(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
            TStaticText(Components[lnComp]).ParentFont :=false;
            TStaticText(Components[lnComp]).Font.Size:=s_nFontSize;
            TStaticText(Components[lnComp]).Font.Name:=s_StrFontName;
            Continue;
          end;
          //LabeledEdit
          if  (Components[lnComp] is TLabeledEdit ) then
          begin
            TLabeledEdit(Components[lnComp]).EditLabel.Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
            
            Continue;
          end;
          //MenuItem
          if  (Components[lnComp] is TMenuItem) then
          begin
            TMenuItem(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
            Continue;
          end;
          //Label
          if  (Components[lnComp] is TLabel )  then
          begin
            TLabel(Components[lnComp]).Caption:=inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
            TLabel(Components[lnComp]).ParentFont :=False;
            TLabel(Components[lnComp]).Font.Size:=s_nFontSize;
            TLabel(Components[lnComp]).Font.Name:=s_StrFontName;
            Continue;
          end;
          //Label
          if  (Components[lnComp] is TMemo )  then
          begin
            TMemo(Components[lnComp]).ParentFont :=False;
            TMemo(Components[lnComp]).Font.Size:=s_nFontSize;
            TMemo(Components[lnComp]).Font.Name:=s_StrFontName;
            Continue;
          end;
          //Label
          if  (Components[lnComp] is TTreeView )  then
          begin
            TTreeView(Components[lnComp]).ParentFont :=False;
            TTreeView(Components[lnComp]).Font.Size:=s_nFontSize;
            TTreeView(Components[lnComp]).Font.Name:=s_StrFontName;
            Continue;
          end;
          //Label
          if  (Components[lnComp] is TRichEdit )  then
          begin
            TRichEdit(Components[lnComp]).ParentFont :=False;
            TRichEdit(Components[lnComp]).Font.Size:=s_nFontSize;
            TRichEdit(Components[lnComp]).Font.Name:=s_StrFontName;
            Continue;
          end;      //TabSheet
          if (Components[lnComp] is TTabSheet) then
          begin
            TTabSheet(Components[lnComp]).Caption:=inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
            TTabSheet(Components[lnComp]).ParentFont :=False;
            TTabSheet(Components[lnComp]).Font.Size:=s_nFontSize;
            TTabSheet(Components[lnComp]).Font.Name:=s_StrFontName;
            Continue;
          end;
          //RadioButton
          if (Components[lnComp] is TRadioButton) then
          begin
            TRadioButton(Components[lnComp]).Caption:=inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
            TRadioButton(Components[lnComp]).ParentFont :=False;
            TRadioButton(Components[lnComp]).Font.Size:=s_nFontSize;
            TRadioButton(Components[lnComp]).Font.Name:=s_StrFontName;
            Continue;
          end;      if Sender=Self then
            lst.Add(Components[lnComp].Name);      //Frame 框架里的东西
          if (Components[lnComp]) is TFrame then
          for i:=0 to  TFrame(Components[lnComp]).ComponentCount-1 do
            pdReadCaptions(TFrame(Components[lnComp]),Copy(TFrame(Components[lnComp]).ClassName,2,length(TFrame(Components[lnComp]).ClassName)));
          //
        end;
      finally
        Inifile.Free;
      end;
    end;
      

  3.   

    如果使用了,DBGRIDEH,ListView等列表类型的控件怎么处理呢.
      

  4.   

    ===============================================
    如果使用了,DBGRIDEH,ListView等列表类型的控件怎么处理呢================================================
    加入对这两个类的判断
      

  5.   

    wycg_cnh20(发奋图强中) 其实没有必要那么做,建议你找一些
    RTTI方法资料看看,你可以编历窗体上的所有控件的查找是不是有
    Caption属性. 用函数 GetPropInfo(Instance: TObject; const PropName: string; AKinds: TTypeKinds): PPropInfo;例如我要得到一个btn的是不是有Caption属性;
    var
      PropInfo:PPropInfo;
    begin
      PropInfo:=GetPropInfo(btn1,'Caption',tkProperties);
      if PropInfo=nil then
        ShowMessage('Not found')
      else
        ShowMessage('Found'); 如果要得到btn1的属性
     ShowMessage(GetPropValue(btn1,'Caption')); 如果要设定btn1的属性
    SetPropValue(btn2,'Caption','Hello Delphi');不知道这是不是很优化.另外你还可以用第三方控件 DevExpress cxPropertiesStore.