使用 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 - IndySystem120.bpl - 未找到入口点
Borland C++ Builder 中的 Windows 子类化