为什么在firemonkey中的form.create之前调用form.show?

时间:2016-09-23 18:29:48

标签: delphi firemonkey delphi-10-seattle

每个人都知道为什么在Form.shate之前调用Form.show,如果属性Form.visible = true。

我在Delphi XE7和Delphi 10 Seattle(为Windows编译的Fmx表单)中进行了测试

例:


    procedure TForm1.FormCreate(Sender: TObject);
    var
      i : integer;
    begin
      //break point here is called before if form.visible = false
      i := 0;
    end;

procedure TForm1.FormShow(Sender: TObject);
var
  i : integer;
begin
  //break point here is called before if form.visible = true
  i := 0;
end;

1 个答案:

答案 0 :(得分:10)

如果主窗体未设置为在设计器中可见,那么调用CreateMainForm()将强制窗体在构造完成后显示(因此之后 OnCreate已经解雇了。

procedure TApplication.CreateMainForm;
var
  I: Integer;
begin
  if FMainForm = nil then
  begin
     // here creating form...
  end;

  if FMainForm <> nil then
    FMainForm.Visible := True;  //** force visible here
end;

否则,表单的Visible属性在调用TCommonCustomForm.Loaded()期间设置,在表单构造期间由DFM流系统调用,因此当表单变得可见时触发OnShow 构建完成后,流式传输之后才会调用OnCreate

最重要的是,你不应该假设这些事件何时会被执行。如果您需要控制事情发生的顺序,您需要明确地执行此操作。