2016-09-23 57 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

是的,我現在明白了,非常感謝。 –

相關問題