如何在控件中嵌入 firemonkey 表单?

发布于 2024-12-29 07:20:01 字数 473 浏览 1 评论 0原文

我尝试在 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;

但是该表单显示在 tfrmMain 后面和表单边界之外。

我的想法是将一个表单放在面板内,并放在滚动框中。每个表单代表一个包含多个控件和内容的复杂项目(不使用 ListBox 的原因?Firemonkey 控件创建比简单地创建一个表单并嵌入它要困难得多)

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

青瓷清茶倾城歌 2025-01-05 07:20:01

秘密在于如何设计子表单。

您需要创建一个控件作为容器,例如 TLayout(无样式)、TRectangle(基本样式)或 TPanel。我会选择 TLayout。为您的容器确定一个名称,为了便于讨论,请使用“Container”。现在创建您的子窗体,并将容器的父级分配给您的父对象。

因此,从上面的代码(我假设 TControlView 是您的子窗体):

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

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;
吹泡泡o 2025-01-05 07:20:01

您必须将容器控件的 ClipChildren 属性设置为 true

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

若能看破又如何 2025-01-05 07:20:01

以下是分步说明:

  1. 设计您的嵌入式表单。将对齐 alClient 的 TLayout 放置到表单上。将所有控件放置在此布局中:

    TFormEmbedded = 类(TForm)
        布局主:TLayout;
        //....
    结尾;
    
  2. 设计您的主窗体。

  3. 将布局放置到主窗体上,稍后将包含子窗体。

  4. 将以下代码添加到主表单的 FormCreate 中:

    过程 TFormMaster.FormCreate(Sender: TObject);
    变量
        子窗体:TFormEmbedded;
    开始
        子窗体 := TFormEmbedded.Create(Self);
        SubForm.LayoutMain.Parent := Self.LayoutSubForm;
    结尾;
    

感谢 nexial 提供的原始说明

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文