使用 c++ builder 2009 reinit.pas 进行本地化

Posted

技术标签:

【中文标题】使用 c++ builder 2009 reinit.pas 进行本地化【英文标题】:localization with c++ builder 2009 reinit.pas 【发布时间】:2013-07-08 06:57:15 【问题描述】:

我正在本地化一个 RAD Studio 2009 C++ Builder 项目。在 IDE 中,我可以使用 Project/Language/Ativate 在程序启动之前选择一种语言。这很好用。 现在我想在运行时更改语言。为了做到这一点,我需要 Delphi 单元 reinit.pas,奇怪的是,它不包含在我的安装中。我在网上的某个地方找到了两个版本。其日期为 2002 年 8 月 9 日。另一个日期为 2013 年 3 月 9 日。表单上有两个按钮,它们调用下面的相应方法以切换到适当的语言。

void __fastcall TFormMonitor::ButtonEnglishClick(TObject *Sender)

const cEnglish = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
if(LoadNewResourceModule(cEnglish))

ReinitializeForms();



//---------------------------------------------------------------------------
void __fastcall TFormMonitor::ButtonDeutschClick(TObject *Sender)

const cGerman = (SUBLANG_GERMAN | LANG_GERMAN);
if(LoadNewResourceModule(cGerman))

ReinitializeForms();


两个版本的 reinit.pas 具有相同的行为。 ReinitialzeForms() 抛出类 EReadError 异常,并带有注释“未找到祖先”。

我在哪里可以获得与 C++ Builder 2009 匹配的 reinit.pas 版本?

或者是某些问题导致的EReadError异常?

我已经在网上进行了数小时的研究,但没有提出解决方案。

感谢您的帮助, 德尔

【问题讨论】:

【参考方案1】:

引发此错误是因为有一个或多个组件的 Name 属性为空 ("")。为了解决这个问题,应该找到空名称组件并设置一个名称。在应用程序中查找空名组件的代码是:

TComponent *pform, *pcomponent;
AnsiString NoNameComponent;

for( int ff=0; ff< Application->ComponentCount; ff++)    
    pform = Application->Components[ff];  // get a form
    for( int i=0; i< pform->ComponentCount; i++ )         
        pcomponent = pform->Components[i];  // get a component
        if( pcomponent->Name == "" )  
          NoNameComponent = pcomponent->ClassName()
                  +" at "+pform->Name + "has no name";
        
    

【讨论】:

您应该发布一些代码来帮助解释,而不是留下链接(在某些时候可能会失效)。

以上是关于使用 c++ builder 2009 reinit.pas 进行本地化的主要内容,如果未能解决你的问题,请参考以下文章

使用 c++ builder 2009 reinit.pas 进行本地化

C++ Builder 2009 同步

C++ Builder 2009 - IndySystem120.bpl - 未找到入口点

Borland C++ Builder 中的 Windows 子类化

如何从命令行为 Borland C++ Builder 5 构建项目文件和包?

Borland C++ Builder 6 上的奇怪链接器错误