如何使用表单的全局变量将其放在面板中?

时间:2015-02-24 12:54:27

标签: delphi firemonkey tform tpanel

这是我的问题的延续:How can I display a Delphi form in a panel?

我想使用表单全局变量将其嵌入到面板中以便立即显示它,但它只创建要嵌入的表单,而不是它的按钮。

在可执行文件的代码中,我创建了首先嵌入的表单,以及我希望将其嵌入第二个表单,如下所示:

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.

1 个答案:

答案 0 :(得分:1)

我以前做过这种方式,以避免必须遍历ArgForm的所有孩子,就是在ArgForm上有一个“主容器”,它有你需要的所有孩子。 我如何设置它是

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

    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.
    

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