6
votes

I have tried to embed a form inside a Scrollbox:

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;

However the form is displayed behind tfrmMain and outside the bouns of the form.

My idea is put a form inside a panel, and both inside scrollbox. Each form represent a complex item with several controls and stuff (the reason to not use ListBox? Firemonkey control creation is far harder than simply do a form and embed it)

3
Embed a form in side a scrollbar. Are you sure that's what you mean?David Heffernan
Yep, sorry for the confusions. Was a scrollbox instead.mamcx

3 Answers

5
votes

The secret is in how you design your child form.

You need to create a control as a container, say a TLayout (no styling), TRectangle (Basic styling) or TPanel. I'd go with the TLayout. Decide on a name for your container, say 'Container' for the sake of argument. Now create you child form and simply assign the Parent of Container to your parent object.

So, from your code above (I'm assuming TControlView is your child form):

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

You have to set the container control's ClipChildren property to true.

0
votes

Here is a step by step instruction:

  1. Design your embedded form. Place a TLayout with alignment alClient onto your form. Place all controls inside this layout:

    TFormEmbedded = class(TForm)
        LayoutMain: TLayout;
        //....
    end;
    
  2. Design your master form.

  3. Place a Layout onto your master form, that shall later contain the subform.

  4. Add the following code to FormCreate of your master form:

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

Thanks to nexial for the original description.