【问题标题】:Transfer data between forms in borland c++ builder在borland c ++ builder中的表单之间传输数据
【发布时间】:2012-12-10 15:49:26
【问题描述】:

我在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 构造函数代码。

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


【解决方案1】:

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

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

RADStudio 文档文章Creating Forms Dynamically 说:

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

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

【讨论】:

    【解决方案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;
    

    【讨论】:

    • 谢谢!你说得对。从 TfrmChooseName 类创建新对象后,我按照您所说的做了,问题解决了!非常感谢!
    猜你喜欢
    • 2012-07-11
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2010-09-25
    • 2011-01-08
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多