1

我想动态创建一系列 Frame 组件,然后将指针保存到向量中。

我能够毫无问题地动态创建 TEdit 组件,但是如果我将 TEdit 替换为框架组件的名称(包含编辑框),程序将出错。将创建第一帧,但在创建第二帧时出错,说明“外部异常 EEFFACE”

这是相关的代码。请注意,如果我用 TEdit 替换 TFrame2,它可以工作。

class TForm1 : public TForm
{
...
public:     // User declarations
    std::vector<TFrame2*> fields;
...
};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TFrame2* temp = new TFrame2 (Layout1);
    temp->Parent = Layout1;
    temp->Align = TAlignLayout::Top;
    fields.push_back(temp);
    count++;
}

这是单击后的样子。

在此处输入图像描述

单击 2 次后出现错误消息。

在此处输入图像描述

这就是我希望它在两次点击后的样子。

在此处输入图像描述

这就是我在点击 3 次后用 TEdit 替换 TFrame2 时的样子。

在此处输入图像描述

-

编辑

如果我尝试对两个框架的创建进行硬编码,第一次单击时会出现相同的错误。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TFrame2* temp = new TFrame2 (Layout1);
    temp->Parent = Layout1;
    temp->Align = TAlignLayout::Top;
    fields.push_back(temp);
    count++;

    TFrame2* temp1 = new TFrame2 (Layout1);
    temp1->Parent = Layout1;
    temp1->Align = TAlignLayout::Top;
    fields.push_back(temp1);
    count++;

}

-

编辑 2

在这篇文章中

FireMonkey 框架可以动态创建吗?

我看到一条评论说

我应该在这里注意,似乎框架对象需要在创建后立即手动分配一个唯一的 Name 属性,至少在使用 C++ 时,否则创建的下一个相同类型的框架对象将尝试使用与第一个相同的名称.

4

1 回答 1

3

为了解决这个问题,我需要在运行时设置 Frame 的名称。在 Button1 单击方法中添加以下代码可解决此问题。

temp->Name = std::strcat("TFrame2", std::to_string(count).c_str());

这将每个新框架命名为“TFrame2#”,其中# 是已创建的编号框架。

于 2020-03-25T19:24:43.130 回答