在 Borland C++ Builder 中如何在窗体之间传递数据

4

我在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的构造函数中,我想获取txtInput的文本并将其设置为窗体标题,但是出现了访问冲突错误!
我还使这两个类成为友元关系!


请展示TfrmChooseName构造函数的代码。 - Remy Lebeau
2个回答

2
最好的处理方法是将所需的标题值直接传递给构造函数,而不是编写代码来查找该值,例如:
__fastcall TfrmChooseName(TComponent *Owner, const String &ACaption)
    : TForm(Owner)
{
    Caption = ACaption;
}

.

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

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

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

谢谢!你说得对。 在创建了TfrmChooseName类的新对象之后,我按照你的建议做了,并且问题解决了! 非常感谢! - ioio

2

我认为没有看到更多的代码是不可能准确地检测出问题的。由于使用表单设计器添加的组件已经具有公共访问权限,因此不需要使类成为友元。

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

RADStudio文档文章Creating Forms Dynamically中写道:

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

您还可以查看使用本地变量创建表单实例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接