通过另一个表单按钮的点击事件更新表单中状态栏的文本 属性

update statusbar's text property in the form by another form's button's click event

您好,我无法通过单击另一个表单的按钮来更新表单中状态栏的文本 属性。它已成功编译并能够 运行 直到我单击 我得到的错误是 "Access violation at address: XXXXXXXX....."

使用 Win 7 中的 C++ Builder XE7。

表格 1:

#include "Main.h"
#include "minor.h"
....
TForm1 *Form1;
TForm2 *Form2;
....

表格 2:

#include "minor.h"
#include "Main.h"
....
TForm2 *Form2;
TForm1 *Form1;
....
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
TButton* btnTest2 = new TButton(this);
btnTest2->Height = 50;
btnTest2->Width = 200;
btnTest2->Left = 220;
btnTest2->Top = 50;
btnTest2->Caption = "Updated Statusbar Button";
btnTest2->Visible = true;
btnTest2->Enabled = true;
btnTest2->Parent = this;
btnTest2->OnClick = &ButtonClicked2; // Create your own event here manually!
}
//---------------------------------------------------------------------------

void __fastcall TForm2::ButtonClicked2(TObject *Sender)
{
Form1->statusbarMain->Panels->Items[0]->Text = "Hello2";   // PROBLEM!!!
}

知道为什么会出现问题吗? 请指教.. 谢谢

您的 Form2 单元正在声明其自己的 Form1 变量,该变量与 Form1 单元中的 Form1 变量分开,并且第二个变量未被初始化为任何有意义的值。这就是您的代码崩溃的原因 - 您正在访问错误的 Form1 变量。

您需要删除 Form2 单元中的 Form1 变量,取而代之的是 #include Form1 的头文件(它应该已经有 Form1 的 [=14= 的 extern 声明] 多变的)。这也是必要的,因为 Form2 需要 TForm1 class 的完整声明才能访问其成员,例如 statusbarMain.

与您在 Form1 单元中声明的 Form2 变量相同。您需要删除它并改用 #include "Form2.hpp"(应该有合适的 extern 声明)。

Form1.h:

...
class TForm1 : public TForm
{
__published:
    TStatusBar *statusbarMain;
    ...
};
extern TForm1 *Form1;
...

Form1.cpp:

#include "Main.h"
#include "minor.h"
#include "Form2.hpp" // <-- add this
....
TForm1 *Form1;
//TForm2 *Form2; // <-- get rid of this
....

Form2.h:

...
class TForm2 : public TForm
{
    ...
};
extern TForm2 *Form2;
...

Form2.cpp:

#include "minor.h"
#include "Main.h"
#include "Form1.hpp" // <-- add this
....
TForm2 *Form2;
//TForm1 *Form1; // <-- get rid of this
...
void __fastcall TForm2::ButtonClicked2(TObject *Sender)
{
    Form1->statusbarMain->Panels->Items[0]->Text = "Hello2";
}