Вот один из подходов, который вы можете использовать:
1) Создайте ваши отдельные формы как обычно, за исключением использования TLayout, назовите его «LayoutMain», (выровненный alClient) как родительский элемент всех элементов управления в этой форме.
2) В вашей «главной форме», когда вы хотите, чтобы экземпляр формы работал так, как если бы он был в качестве интерфейса MDI, создайте TLayout (назовите его «FormContainer» или что-то в этом роде), поместите какпотомок этого (выровненного по верху) другого TLayout (назовите его «FormHeader»), содержащего отдельные элементы управления для заголовка формы, кнопки «Свернуть», «Развернуть» / «Закрыть» и все, что вы хотели бы добавить в заголовок «фрейм». Это называется Составной .
3) Создайте экземпляр своей дочерней формы (, но не показывайте его ), затем укажите родительский TLayout этого экземпляра "LayoutMain" в TLayout "FormContainer" вашей главной формы.
4) В ранее упомянутом TLayout (с именем "FormHeader") дайте ему OnMouseDown
иOnMouseMove
событий, обеспечивающих возможность перетаскивания ее по мастер-форме.
Когда вы хотите максимизировать дочернюю форму внутри мастер-формы, вам просто нужно установить внешнее свойство выравнивания TLayout "FormContainer" в alClientне забывая сохранять свои исходные значения Top, Left, Width и Height в экземпляре формы, чтобы их можно было вызывать при нажатии кнопки Restore.
Да, это довольно сложное решение, но в лучшем случаенасколько мне известно, это единственный способ добиться того, что вы пытаетесь сделать с FireMonkey, как он существует сегодня ( около 2 ).
Я бы не ожидалEmbarcadero, чтобы обеспечить любую форму эмуляции MDI как части FireMonkey "из коробки", так как MDI считается старомодным подходом.
Более современным решением было бы использование Docking в качестве RAD Studio IDEсам делает.Это обеспечивает лучшее из обоих миров, предоставляя пользователю свободу выбора дочерних форм, которые он хочет связать с главной формой, или отображать их отдельно от них (или любую комбинацию закрепленных схем).