窗體的建構函式和OnCreate事件

2021-04-01 20:36:02 字數 2156 閱讀 9039

窗體的建構函式和建立事件和

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.en...

建構函式和拷貝建構函式

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

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

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