窗體的建構函式和建立事件和
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.en...
建構函式和拷貝建構函式
建構函式 簡單地說建構函式是類函式,函式名與類名完全相同,無返回值 建構函式屬於類的成員函式,除了具有一般成員函式的特點外,還具有自己的特點 1 是類的乙個特殊的成員函式,函式名與類名相同 2 訪問屬性應該是public 3 功能是初始化物件,在建構函式中一般不作初始化以外的事情 4 可以在類內定義...
C 的建構函式和拷貝建構函式
編譯器自動生成的構造僅僅做讓編譯能通過的事情,它不會初始化成員變數。編譯器並不會自動生成預設的建構函式和拷貝建構函式,僅僅在它需要的時候。沒錯!對於下面的類 class test 編譯器不會自動生成建構函式,因為沒有字段需要初始化。很多時候都需要深拷貝,這時需要自己定義copy constructo...