窗體的建構函式和建立事件和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,則執行順序是3-4-9行。
如果設oldcreateorder為true,則執行順序為3-9-4,即先執行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,都只是執行3-9-4,原因就是最後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...