0

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

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

formCreateAppointment.Show();

我收到此错误:

E2451 未定义的符号'formCreateAppointment'

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

谢谢

更多信息

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

formCreateAppointment->Show();

我的代码将无法编译,并且出现以下错误:

E2451 未定义的符号'formCreateAppointment'

4

2 回答 2

2

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

#ifndef Unit2H
#define Unit2H

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

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

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

#endif

听起来您还没有#include将 .hpp 文件添加到您的主代码中,例如:

#include "Unit2.hpp" // (or whatever you decided to name that Form's unit as)

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

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

formCreateAppointment->Show(); 

如果要改用.运算符,则必须先取消引用指针:

(*formCreateAppointment).Show(); 
于 2012-09-24T20:14:44.430 回答
0

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

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

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

    class MyMainForm
    {
    public:
        MyMainForm()
        {
            //create the form in the constructor
            formCreateAppointment = new myOtherForm();
        }
        ~MyMainForm()
        {
            delete formCreateAppointment;
        }
        //code
    private:
        myOtherForm * formCreateAppointment;
    }
    
于 2012-09-24T07:18:49.517 回答