Delphi 10.3 Ошибка создания форм FMX внутри другой формы FMX - PullRequest
0 голосов
/ 13 февраля 2020

Я следовал этому: http://docwiki.embarcadero.com/CodeExamples/XE5/en/FMXEmbeddedForm_ (Delphi)

и это: { ссылка }

и это: { ссылка }

Я использую Delphi 10.3

Мой окончательный результат: я создал родительскую форму с TLayout внутри нее, где я хочу ребенок формируется, чтобы появиться. Далее, все мои дочерние формы имеют TLayout, содержащий все остальные компоненты формы. Все формы динамически создаются во время выполнения, а также их содержимое.

Для целей тестирования я создал дочернюю форму внутри кнопки на главной форме:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.CreateForm(TfChild, fChild);
  fChild.Layout1.Parent := self.Layout1;
end;

Пока все хорошо все компоненты дочерней формы отображаются в родительской форме. Проблема в том, как их потом «очистить». Отправка self.Close на кнопку дочерней формы не удаляет компоненты Layout из основной формы, но закрывает дочернюю форму. Выполнение Layout1.Destroy на кнопке дочерней формы очищает макет, но я теряю доступ к кнопкам управления окном моей основной формы (максимизировать, минимизировать, выходить), и единственный способ вернуть этот доступ - воссоздать макет дочерней формы. Эту встроенную функцию я хочу использовать только для windows и macos OS ', для android в этом нет необходимости, поэтому для настройки я использую defs.

Мне кажется, что я этого не делаю это правильный путь: '(есть ли решение? Я просто хочу динамически создавать компоненты дочерней формы внутри назначенной области главной формы и иметь безопасный способ очистки этих компонентов после того, как эта дочерняя форма больше не нужна

1 Ответ

0 голосов
/ 13 февраля 2020

Я сам сделал MRE, так как вы чувствовали, что вам не нужно его предоставлять. Далее Form1 является основной формой, а Form2 - дочерней формой

. Когда вы закрываете форму (например, Form2.Close;), которая НЕ является основной формой, она не обязательно уничтожается. Действие закрытия по умолчанию для формы - caHide, которое устанавливает только ее свойство Visible = False, которое оставляет его существующим в памяти и готовым к повторному вызову.

Компоненты в вашей дочерней форме все еще являются родительскими до TLayout в основной форме, поэтому скрытие дочерней формы не влияет на видимость компонентов. Чтобы исправить это, вы можете переместить компоненты обратно из основной формы в дочернюю форму:

procedure TForm2.Button1Click(Sender: TObject);
begin
  Layout1.Parent := Self; // add this
  Self.Close;
end;

или , вы можете уничтожить дочернюю форму в ее OnClose() событии:

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caFree;
end;

Это работает без переопределения компонентов, поскольку Form2 по-прежнему является владельцем компонентов, даже если родительский объект - Form1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...