2015-02-24 10 views
0

Это продолжение моего вопроса: 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

Ваши обращения к CreateForm назад. Первый вызов CreateForm определяет, какая форма является основной формой приложения, поэтому вы пытаетесь встроить свою основную форму в дочернюю форму, и это не поможет вам. Есть ли причина, по которой вы не используете фреймы, стыковки или вкладки для того, что вы пытаетесь сделать? –

+0

Если я делаю это в этом порядке, я получаю сообщение об исключении класса $ c00000005. Я просто пытаюсь разобраться сейчас, поэтому нет особых причин. – Friso

+0

@ Ken Это потому, что ассер придерживался совета примера Embarcadero. Это кажется странным. Link is in prev Q. –

ответ

1

Как я уже делал это раньше, чтобы избежать необходимости перебирать все, что у вас есть дети ArgForm, - это иметь «главный контейнер» в ArgForm, в котором есть все необходимые вам дети. Как установить это является

  1. сначала наложив TLayout, выровненной Клиенту на ArgForm
  2. Далее я добавил все мои дети контролирует до TLayout из ArgForm (кнопки и т.д ..)
  3. Затем добавьте панель в форму, которую мы хотим встроить в
  4. После того, как эта форма была настроена, я назначил макет ArgForm на панель родительской формы на OnShow ParentForm, а не на 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. 

Может быть кто-то может ответить, но это только казалось мне причину, почему кнопки не показывали на создание, было ли то, что элементы управления не были созданы в то время?

+0

Ну, теперь у вас есть 'ArgForm' как приложения MainForm (первая созданная форма от' Application') –

+0

@SirRufo, спасибо, что указали это.Я изменил его в своем тестовом приложении, перекомпилировал, и все работает отлично. Я редактировал свой пост, чтобы отразить новый источник проекта. – SmeTheWiz

+1

Вы должны вызвать Application.CreateForm ровно один раз. Для основной формы. В остальное время вызовите конструктор. –