Ошибка при динамическом создании более одного кадра во время выполнения (C ++, FMX, IDE: C ++ Builder) - PullRequest
0 голосов
/ 25 марта 2020

Я хотел бы динамически создать серию компонентов 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++;
}

Вот как это выглядит после одного клика.

enter image description here

Сообщение об ошибке после 2-х нажатий.

enter image description here

Вот как я хочу, чтобы оно выглядело после двух нажатий.

enter image description here

Вот как это выглядит, когда я заменяю TFrame2 на TEdit после 3 щелчков.

enter image description here

-

РЕДАКТИРОВАТЬ

Если я пытаюсь жестко запрограммировать создание двух фреймов, я получаю ту же ошибку при первом клике.

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 ++, или следующий объект фрейма, созданный того же типа, попытается получить то же имя как фи первый.

1 Ответ

1 голос
/ 25 марта 2020

Чтобы решить эту проблему, мне нужно было установить имя кадра во время выполнения. Добавление следующего кода в метод Click1 устраняет проблему.

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

Это имя каждого нового кадра "TFrame2 #", где # - созданный номер кадра.

...