【问题标题】:How to dynamically call a form in C++ Builder XE3?如何在 C++ Builder XE3 中动态调用表单?
【发布时间】:2014-03-16 03:30:47
【问题描述】:

我正在构建一个应用程序,其中我使用 DB 填充菜单。我可以创建菜单项,但我无法将“单击时”事件链接到特定表单。我已经在我的数据库中存储了表单类的名称,并尝试使用 RTTI 在运行时绑定它们。以下是我尝试运行的代码的 sn-p。

__fastcall TfrmMainMDI::TfrmMainMDI(TComponent *Owner)
    : TForm(Owner)
{
    // Register 2 form classes
    RegisterClass(__classid(TfrmSecurity));
    RegisterClass(__classid(TfrmPassword)); 
} 

现在,当我尝试运行以下代码来调用表单时,会出现“访问冲突”错误。

    TForm *frm = (TForm*)TFormClass(FindClass(formName));
    UnicodeString str = frm->Name;
    frm->Show();

【问题讨论】:

  • 试试这个:TForm *frm = 0; Application->CreateForm( TFormClass(FindClass(formName)), &frm); 然后如果frm 不再为空,frm->Show()
  • 完美!有用。谢谢。
  • @MattMcNabb 你应该把你的评论变成一个答案。
  • 其实RegisterClass/FindClass我没用过,是从this page得到的。此外,我不确定如果表单创建失败会发生什么,也不确定是否仍然可以使用Application->CreateForm( FindClass(formName) ), &frm );,如果它确实可以更简单!希望专家能加入。
  • 在过去的 3 个小时里,我一直在尝试使用此 RegisterClass 方法,但没有成功。我也已经检查了该链接,但信息对我来说有点太混乱了。我试图将 delphi 代码逐行“转换”为 C++,但它没有用。您的解决方案非常有效!

标签: c++builder c++builder-xe3


【解决方案1】:

这样做:

TForm *frm = 0;
Application->CreateForm( TFormClass(FindClass(formName)), &frm );

那么如果frm不为空,

frm->Show();

【讨论】:

  • 您不需要类型转换为TFormClass。在 C++ 中,FindClass() 返回一个 TMetaClass*,这与 CreateForm() 期望的输入相同,因此不需要强制转换。 CreateForm() 永远不会返回 NULL 指针,如果发生故障,它将引发异常。
【解决方案2】:
TForm *frm = new TForm(this);

if( frm != NULL )
{
   frm->ShowModal();

   //or

   frm->Show();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多