VCL显示不同的表格

时间:2012-09-24 07:09:06

标签: c++ forms vcl

我正在创建一个包含多个表单的VCL表单应用程序。我创建了一个名为formCreateAppointment的新表单。

我正在尝试通过menuItem中的代码加载表单:

formCreateAppointment.Show();

我收到此错误:

E2451未定义的符号'formCreateAppointment'

我是否必须将此表单声明为“全局”对象或类似内容?

由于

更多信息

表单'formCreateAppointment'位于Project-> Options->自动创建表单下。当我使用代码时:

formCreateAppointment->Show();

我的代码无法编译,我收到以下错误:

E2451未定义的符号'formCreateAppointment'

2 个答案:

答案 0 :(得分:2)

在IDE中创建新的Form类时,生成的.hpp文件包含一个全局指针,例如:

#ifndef Unit2H
#define Unit2H

#include <Classes.hpp>
//...

class TformCreateAppointment : public TForm
{
    //...
}; 

extern PACKAGE TformCreateAppointment *formCreateAppointment; // <-- here

#endif

听起来你没有{.1}将.hpp文件放入主代码中,例如:

#include

如果在项目选项中将该表单设置为自动创建,则会在程序启动时为您自动实例化该全局指针(通过在项目的#include "Unit2.hpp" // (or whatever you decided to name that Form's unit as) 函数中插入Application->CreateForm()的调用)。否则,您必须使用WinMain()运算符在代码中手动实例化它。

无论哪种方式,变量都是指针。 VCL对象无法在堆栈上实例化,只能在堆上实例化。您必须使用new运算符来访问Form对象的成员,例如:

->

如果您想使用formCreateAppointment->Show(); 运算符,则必须首先取消引用指针:

.

答案 1 :(得分:0)

显然,您已将表单创建为其他位置的本地变量,这就是为什么您无法从您尝试调用它的位置访问它。

您可以使用三种方法来解决此问题:

  • 在您要显示的确切位置创建表单。但是,这只适用于您要从一个地方调用表单
  • 将其创建为全局变量。
  • 在堆中创建它,并在主窗体中存储指向它的指针。例如:

    class MyMainForm
    {
    public:
        MyMainForm()
        {
            //create the form in the constructor
            formCreateAppointment = new myOtherForm();
        }
        ~MyMainForm()
        {
            delete formCreateAppointment;
        }
        //code
    private:
        myOtherForm * formCreateAppointment;
    }