0

これは私の質問の続きです:パネルに Delphi フォームを表示するにはどうすればよいですか?

フォームのグローバル変数を使用してパネルに埋め込んで表示したいのですが、ボタンなしで埋め込むフォームのみを作成します。

実行可能ファイルのコードでは、次のように、最初に埋め込むフォームと、2 番目に埋め込むフォームを作成しています。

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. 最初に TLayout を配置し、ArgForm の Client に合わせます
  2. 次に、すべての子コントロールを ArgForm (ボタンなど) の TLayout に追加しました。
  3. 次に、これを埋め込むフォームにパネルを追加します
  4. そのフォームをセットアップした後、ArgForm のレイアウトを、OnCreate ( ArgForm.Children[0].Parent:=Self.Panel1;) ではなく、ParentForm の OnShow の親フォームのパネルに割り当てます。

プロジェクトのソース:

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 に答える