在borland c ++ builder中的表单之间传输数据

时间:2012-12-24 06:06:23

标签: c++builder c++builder-2010 c++builder-xe2

我在c ++ builder中设计了两个表单:

  • TfrmMain
  • TfrmChooseName

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

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

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

2 个答案:

答案 0 :(得分:2)

我认为如果不看到更多代码,就无法检测出确切的问题。由于使用表单设计器添加的组件无论如何都必须具有公共访问权限,因此不必将类成为朋友。

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

RADStudio文档文章Creating Forms Dynamically说:

  

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

您可能还想查看Creating a Form Instance Using a Local Variable

答案 1 :(得分:2)

处理此问题的最佳方法是将所需的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;