4

我在 c++ builder 中设计了两种形式:

  • 主函数
  • 选择名称

在 TfrmMain 类中,我有一个名为 btnNext 的按钮。单击 btnNext 时,下面的代码将运行并创建新的 TfrmChooseName。

frmChooseName = new TfrmChooseName(this);
this->Hide();
frmChooseName->ShowModal();
this->Show();
delete frmChooseName;
frmChooseName = NULL;

同样在 TfrmMain 我有名为 txtInput 的 TEdit 控件。
在 TfrmChooseName 的构造函数中,我想获取 txtInput 的文本并将其设置为表单的标题,但发生访问波动错误!
我也让这两个班级成为朋友!

4

2 回答 2

3

处理此问题的最佳方法是将所需的 Caption 值传递给构造函数本身,而不是对其进行编码以寻找该值,例如:

__fastcall TfrmChooseName(TComponent *Owner, const String &ACaption)
    : TForm(Owner)
{
    Caption = ACaption;
}

.

frmChooseName = new TfrmChooseName(this, txtInput->Text);

或者,您可以在构造函数退出后设置 Caption,例如:

frmChooseName = new TfrmChooseName(this);
frmChooseName->Caption = txtInput->Text;
于 2012-12-25T23:51:13.937 回答
2

我认为如果不查看更多代码就不可能检测到确切的问题。不需要让类成为朋友,因为使用表单设计器添加的组件无论如何都具有公共访问权限。

您是否已从TfrmChooseName自动创建表单中删除?如果不是,并且如果frmChooseName是指向自动创建表单的全局变量,则可能会导致访问冲突。

RADStudio 文档文章动态创建表单说:

注意:如果您使用其构造函数创建表单,请务必检查该表单是否不在“项目”>“选项”>“表单”页面上的“自动创建表单”列表中。具体来说,如果您创建新表单而不从列表中删除同名表单,Delphi 在启动时创建表单,并且此事件处理程序创建表单的新实例,覆盖对自动创建的实例的引用。自动创建的实例仍然存在,但应用程序无法再访问它。事件处理程序终止后,全局变量不再指向有效表单。任何使用全局变量的尝试都可能使应用程序崩溃。

您可能还想看看使用局部变量创建表单实例

于 2012-12-25T23:50:42.800 回答