2016-09-23 58 views
4

每个人都知道告诉我为什么Form.show在Form.create之前被调用,如果属性Form.visible = true。 为什么在firemonkey的form.create之前调用form.show?


    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; 

+6

可能因为OnCreate在构造窗体后调用,并且窗体在可见时构造为可见为真。 –

回答

10

如果主窗体未设置为在设计师可见:

我在Delphi XE7和Delphi 10西雅图(FMX形式编译为窗口)

防爆测试那么致电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直到建设完成后 DFM流。

底线是,你不应该对这些事件何时执行做出假设。如果你需要控制事情发生的顺序,你需要明确地做到这一点。

+1

我创建的表单不是mainForm,是辅助表单。 所以,这个构造被TCommonCustomForm.Create(AOwner:TComponent)调用。 我认为这个问题发生在这个构造函数中的“NotifyGlobalLoading” –

+0

@MaycollTrevezani如果表单不是主窗体,那么'Visible = true'的情况仍然是一样的。 –

+0

是的,我现在明白了,非常感谢。 –

相关问题