C++ 显示不同形式的VCL

C++ 显示不同形式的VCL,c++,forms,vcl,C++,Forms,Vcl,我正在创建一个包含多个表单的VCL表单应用程序。我创建了一个名为formCreateAppointment的新表单 我正试图通过菜单项中的以下代码加载表单: formCreateAppointment.Show(); 我得到这个错误: E2451未定义符号“formCreateAppointment” 我是否必须将此表单声明为“全局”对象或类似对象 谢谢 更多信息 表单“formCreateAppointment”位于项目->选项->自动创建表单下。当我使用代码时: formCreateApp

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

我正试图通过菜单项中的以下代码加载表单:

formCreateAppointment.Show();
我得到这个错误:

E2451未定义符号“formCreateAppointment”

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

谢谢

更多信息

表单“formCreateAppointment”位于项目->选项->自动创建表单下。当我使用代码时:

formCreateAppointment->Show();
我的代码将无法编译,出现以下错误:


E2451未定义的符号“formCreateAppointment”

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

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

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

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

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

#ifndef Unit2H
#define Unit2H

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

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

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

#endif
如果在项目选项中将该表单设置为自动创建,则该全局指针将在程序启动时为您自动实例化(通过在项目的
WinMain()
函数中插入对
Application->CreateForm()
的调用)。否则,您必须使用
new
操作符在代码中手动实例化它

无论哪种方式,变量都是指针。VCL对象不能在堆栈上实例化,只能在堆上实例化。您必须使用
->
操作符来访问表单对象的成员,例如:

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

(*formCreateAppointment).Show(); 

表单不是一个变量。它是一个具有控件和其他关联对象的窗体。它的名字是formCreateAppointment。我不是只使用简单的.show方法来显示它吗?@user,表单不是变量,而是对象。就像任何其他对象一样,应该首先创建它,然后才能调用它的方法。
(*formCreateAppointment).Show();