窗體的建構函式和OnCreate事件

2021-08-22 01:42:48 字數 1676 閱讀 6250

窗體的建構函式和建立事件和oldcreateorder屬性有很大的關係。

情況1:

如果窗體繼承自tform,且有如下形式:

1.constructor tform1.create(aowner: tcomponent);

2.begin

3.inherited;

4.button1.caption := '1';

5.end;

6.7.

procedure tform1.formcreate(sender: tobject);

8.begin

9.button1.caption := '2';

10.end;

此時,設tform1的oldcreateorder(預設就是為false)屬性為false,則執行順序是349行。

如果設oldcreateorder為true,則執行順序為394,即先執行inherited然後執行button1.caption := '2'再執行button1.caption := '1'。

看幫助,解釋是如果oldcreateorder為false,則oncreate將在所有建構函式執行完之後才執行。如果oldcreateorder為true,則oncreate在tcustomform的建構函式執行完就執行。

這樣就很容易理解上面的執行順序了,oldcreateorder為true時,執行到第3行時,便會呼叫tcustomform的create函式,該函式執行完後就呼叫oncreate了,當然也就執行了第9行,最後才回來執行第4行。而oldcreateorder為false時則等所有建構函式執行才呼叫oncreate事件。

為什麼有這樣的行為呢,還是看源**:

事實上oncreate會在兩處地方被呼叫,一是tcustomform的create函式,一是afterconstructor函式。

在tcustomform的create函式中,是這樣的:

if oldcreateorder then docreate;

在afterconstruction函式中,是這樣的:

if not oldcreateorder then docreate;

這樣就一清二楚了,同時也了解了afterconstruction的執行時機,即所有的建構函式執行完畢後才由編譯器呼叫。

情況2:

如果視窗繼承自乙個已經存在的視窗模擬如tform1,同時有像下面這樣的**:

1.constructor tform2.create(aowner: tcomponent);

2.begin

3.inherited;

4.button1.caption := '1';

5.end;

6.7.

procedure tform2.formcreate(sender: tobject);

8.begin

9.button1.caption := '2';

10.end;

無論怎麼設oldcreateorder,都只是執行394原因就是最後oldcreateorder都是等於true。為什麼會一直等於true呢,找不出原因,大概是讀取窗體資源檔案時作了些什麼處理吧。

窗體的建構函式和OnCreate事件

窗體的建構函式和建立事件和 oldcreateorder 屬性有很大的關係。情況1 如果窗體繼承自 tform 且有如下形式 1.constructor tform1.create aowner tcomponent 2.begin 3.inherited 4.button1.caption 1 5...

建構函式和拷貝建構函式

建構函式 簡單地說建構函式是類函式,函式名與類名完全相同,無返回值 建構函式屬於類的成員函式,除了具有一般成員函式的特點外,還具有自己的特點 1 是類的乙個特殊的成員函式,函式名與類名相同 2 訪問屬性應該是public 3 功能是初始化物件,在建構函式中一般不作初始化以外的事情 4 可以在類內定義...

C 的建構函式和拷貝建構函式

編譯器自動生成的構造僅僅做讓編譯能通過的事情,它不會初始化成員變數。編譯器並不會自動生成預設的建構函式和拷貝建構函式,僅僅在它需要的時候。沒錯!對於下面的類 class test 編譯器不會自動生成建構函式,因為沒有字段需要初始化。很多時候都需要深拷貝,這時需要自己定義copy constructo...