Как вставить форму firemonkey внутри элемента управления?

Я попытался внедрить форму внутри прокрутки:

procedure TfrmMain.FormCreate(Sender: TObject);
var
  Control:TControlView;
begin
  Control := TControlView.Create(Self);
  Control.BorderIcons := [];
  Control.parent := ListControls;
  Control.width := 800;
  ListControls.AddObject(Control);
  Control.Visible:= True;
end;

Однако форма отображается за tfrmMain и вне ребер формы.

Моя идея поместила форму внутри панели и как внутри scrollbox. Каждая форма представляет собой сложный элемент с несколькими элементами управления и т.д. (Причина не использовать ListBox? Создание управления Firemonkey намного сложнее, чем просто сделать форму и встроить ее).

Ответ 1

Секрет в том, как вы создаете свою дочернюю форму.

Вам нужно создать элемент управления в качестве контейнера, например, TLayout (без стилизации), TRectangle (Basic styling) или TPanel. Я бы пошел с TLayout. Определите имя для своего контейнера, скажем "Контейнер" для аргументации. Теперь создайте дочернюю форму и просто назначьте родительский контейнер контейнера вашему родительскому объекту.

Итак, из вашего кода выше (я предполагаю, что TControlView является вашей дочерней формой):

procedure TfrmMain.FormCreate(Sender: TObject);
var
  Control:TControlView;
begin
  Control := TControlView.Create(Self);
  Control.Container.parent := ListControls;
  Control.Container.width := 800;
end;

Ответ 2

Вам необходимо установить свойство управления контейнером ClipChildren на true.

Ответ 3

Вот пошаговая инструкция:

  • Создайте свою встроенную форму. Поместите TLayout с выравниванием alClient в вашу форму. Поместите все элементы управления внутри этого макета:

    TFormEmbedded = class(TForm)
        LayoutMain: TLayout;
        //....
    end;
    
  • Создайте свою основную форму.

  • Поместите макет в свою основную форму, которая позже будет содержать подформат.

  • Добавьте следующий код в FormCreate вашей основной формы:

    procedure TFormMaster.FormCreate(Sender: TObject);
    var
        SubForm: TFormEmbedded;
    begin
        SubForm := TFormEmbedded.Create(Self);
        SubForm.LayoutMain.Parent := Self.LayoutSubForm;
    end;
    

Благодаря nexial для оригинального описания.