在borland c++ builder中转换表单之间的数据



我用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的文本并将其设置为表单的标题,但发生了访问错误!
我还使两个班成为朋友!

处理此问题的最佳方法是将所需的Caption值传递给构造函数本身,而不是编写代码来查找该值,例如:

__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吗?如果没有,并且frmChooseName是指向自动创建表单的全局变量,则可能导致访问冲突。

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

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

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

最新更新