0

这是我的问题的延续:如何在面板中显示 Delphi 表单?

我想使用表单全局变量将其嵌入到面板中以现在显示它,但它只创建要嵌入的表单,没有它的按钮。

在可执行文件的代码中,我首先创建要嵌入的表单,然后创建要嵌入的表单,如下所示:

program Project1;

uses
  System.StartUpCopy,
  FMX.Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

主窗体的代码是:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Panel1: TPanel;
    procedure EmbedForm(ArgParent : TControl; ArgForm : TCustomForm);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

uses Unit2;



procedure TForm1.FormCreate(Sender: TObject);
begin
  EmbedForm(Panel1, Form2);
end;

procedure TForm1.EmbedForm(ArgParent: TControl; ArgForm: TCustomForm);
begin
  while ArgForm.ChildrenCount>0 do
  begin
    ArgForm.Children[0].Parent:= ArgParent;
  end;
end;

end.

要嵌入的表单的代码是:

unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls;

type
  TForm2 = class(TForm)
    Button2: TButton;
    Button1: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.fmx}

end.
4

1 回答 1

1

为了避免遍历所有 ArgForm 的孩子,我之前这样做的方法是在 ArgForm 上拥有一个“主容器”,其中包含您需要的所有孩子。我是如何设置的

  1. 首先在 ArgForm 上放置一个与 Client 对齐的 TLayout
  2. 接下来,我将所有子控件添加到 ArgForm 的 TLayout(按钮等)
  3. 接下来将面板添加到我们想要嵌入的表单中
  4. 设置该表单后,我将 ArgForm 的布局分配给 ParentForm 的 OnShow 上的父表单面板,而不是 OnCreate ( ArgForm.Children[0].Parent:=Self.Panel1;)

项目来源:

program Project1;

uses
  System.StartUpCopy,
  FMX.Forms,
  Unit1 in 'Unit1.pas' {ParentForm},
  Unit2 in 'Unit2.pas' {ArgForm};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TParentForm, ParentForm);
  Application.CreateForm(TArgForm, ArgForm);
  Application.Run;
end.

父表格代码:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,unit2,
  FMX.StdCtrls;

type
  TParentForm = class(TForm)
    Panel1: TPanel;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  ParentForm: TParentForm;

implementation

{$R *.fmx}

procedure TParentForm.FormShow(Sender: TObject);
begin
  ArgForm.Children[0].Parent:=Self.Panel1;
end;

end.

ArgForm 代码:

unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Layouts;

type
  TArgForm = class(TForm)
    Layout1: TLayout;
    Button1: TButton;
    Button2: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  ArgForm: TArgForm;

implementation

{$R *.fmx}

end.

也许其他人可以回答,但在我看来,按钮未在创建时显示的原因是当时尚未创建控件?

于 2015-02-24T17:07:44.783 回答