Вопрос о возможности создания многооконного приложения (MDI) с использованием FireMonkey в традиционном понимании, с множеством документов и одной основной формой, является актуальным для разработчиков, использующих технологии Delphi и Pascal. В контексте отсутствия традиционных MDI-контролов в FireMonkey, возникает вопрос о том, были ли они заменены на что-то иное.
Подход к решению проблемы
Для создания многооконного приложения с использованием FireMonkey в стиле MDI, можно использовать следующий метод:
Создайте отдельные формы, как обычно, но используйте в качестве родительского элемента для всех контролов на форме TLayout, например LayoutMain, выровненный по клиенту (alClient).
На основной форме, когда вы хотите включить экземпляр формы для поведения, соответствующего MDI-интерфейсу, создайте TLayout (например, FormContainer), разместите его в качестве дочернего элемента с выравниванием к верху (alTop) иного TLayout (например, FormHeader), содержащего элементы управления для заголовка формы, кнопок минимизации/максимизации/закрытия и другие элементы, которые вы хотели бы видеть в заголовке "рамки". Это называется композитом.
Создайте экземпляр дочерней формы (но не показывайте его), затем сделайте родительским элементом для основного TLayoutLayoutMain вашей дочерней формы основной TLayoutFormContainer основной формы.
Для TLayout с именем FormHeader добавьте события OnMouseDown и OnMouseMove, чтобы обеспечить возможность перемещения его по основной форме.
Когда вы хотите максимально увеличить дочернюю форму внутри основной, просто установите свойство выравнивания внешнего TLayoutFormContainer в alClient, не забыв сохранить его оригинальные значения Top, Left, Width и Height в экземпляре формы для последующего восстановления при нажатии кнопки "Восстановить".
Этот подход является довольно сложным решением, но, насколько мне известно, это единственный способ достижения желаемого результата с использованием FireMonkey в текущей версии (около Update 2).
Следует отметить, что, скорее всего, Embarcadero не предоставит какую-либо эмуляцию MDI в составе FireMonkey "из коробки", так как подход MDI считается устаревшим.
Более современное решение заключается в использовании докинга, как это делается в самой IDE RAD Studio. Это позволяет пользователю выбрать, какие дочерние формы он хочет привязать к основной форме, или отображать их отдельно (или в любом сочетании докированных расположений).
Пример кода
unit Unit1;
interface
uses
Winapi.Windows, System.SysUtils, Vcl.Controls, Vcl.Forms, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
LayoutMain: TLayout;
FormContainer: TLayout;
FormHeader: TLayout;
procedure FormCreate(Sender: TObject);
procedure LayoutMainMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure LayoutMainMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Int32; var Handled: Boolean);
end;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
// Инициализация элементов управления и логика создания композита
end;
procedure TForm1.LayoutMainMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
// Логика начала перемещения композита
end;
procedure TForm1.LayoutMainMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Int32; var Handled: Boolean);
begin
// Логика перемещения композита
end;
end.
Заключение
Разработка многооконных приложений с использованием FireMonkey требует от разработчика креативного подхода и готовности использовать нестандартные решения. Несмотря на отсутствие встроенной поддержки MDI, разработчики могут использовать композиты и докинг для создания функциональных многооконных интерфейсов, соответствующих современным требованиям пользователей.
Вопрос о создании многооконных приложений с использованием FireMonkey и альтернативные подходы к реализации MDI-подобных интерфейсов в отсутствие традиционных MDI-контролов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS