我正在创建一个包含多个表单的VCL表单应用程序。我创建了一个名为formCreateAppointment的新表单。
我正在尝试通过menuItem中的代码加载表单:
formCreateAppointment.Show();
我收到此错误:
E2451未定义的符号'formCreateAppointment'
我是否必须将此表单声明为“全局”对象或类似内容?
由于
更多信息
表单'formCreateAppointment'位于Project-> Options->自动创建表单下。当我使用代码时:
formCreateAppointment->Show();
我的代码无法编译,我收到以下错误:
E2451未定义的符号'formCreateAppointment'
答案 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;
}