【问题标题】:Error when dynamically creating more than one Frame at runtime (C++, FMX, IDE: C++ Builder)在运行时动态创建多个帧时出错(C++、FMX、IDE:C++ Builder)
【发布时间】:2020-07-06 09:04:04
【问题描述】:

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

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

这里是相关代码。请注意,如果我将 TFrame2 替换为 TEdit,它就可以工作。

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 次后出现错误消息。

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

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

-

编辑

如果我尝试硬编码创建两个框架,我在第一次点击时会收到相同的错误。

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

在这篇文章中

Can FireMonkey frames be created dynamically?

我看到一条评论指出

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

【问题讨论】:

    标签: c++ firemonkey c++builder tframe


    【解决方案1】:

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

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

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

    【讨论】:

    • 另外,您可以指定一个空字符串:temp-&gt;Name = _D(""); 您也可以在设计时清除对象检查器中的Name。如果您从不使用Layout1-&gt;FindComponent() 方法搜索分配的Name,则实际上不需要Name
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多