0

我正在本地化 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 异常?

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

谢谢你的帮助,德尔

4

1 回答 1

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";
        }
    }
}
于 2014-03-28T08:19:46.910 回答