Owner 與Parent 的區別

        很多時候會將一個Panel1放在Form1上,然後再將一個Button1放在Panel1上,這樣的話,這個Button1的Owner就是Form1而Parent則是Panel1。

        所有的Delphi的Component都有Owner 屬性,Owner屬性表示這個Component的所有者是誰,比如上面的例子,Button1的所有者(Owner )就是Form1,當Form1析構時,會先將Button1釋放掉。也就是說,Owner會自動地控制Component的生命週期,它負責構件的創建和釋放。如在上例中,系統默認Form上所有Component的所有者是Form1。順便指出,Create方法應帶有表示Component的Owner的參數.,如果Owner設置的爲Nil值,那這個Component必須創建者編碼析構它,Owner屬性是隻讀的,並且在運行期是無法修改它的值。

         類似,但不同於Owner屬性,Parent 屬性則表示Component從屬於另一個Component,簡單的說自身是其他Component的Child Component,例如 TForm,TGroupBox ,TPanel等。Parent是用來控制 在它的客戶區範圍內的Child Component,Parent決定如何展示包含的Child Component,例如:Left,Top等屬性都是相對於Parent的位置。

         Parent屬性可以在運行期被修改。並非所有的Component都有Parent,Parent屬性可以爲Nil值,可以用HasParent 方法返回的Boolean值來判斷Component是否擁有Parent。 我們可以設置Parent屬性來做一些控制,例如:我們可以在Form1上置Panel1和Panel2,然後再放一個Button1在Panel1上,在Button1的OnClick事件中寫上:Button1.Parent := Panel2;  運行這段代碼你會發現,開始Button1是在Panel1上,然後按下Button1觸發OnClick事件後,Button1‘跳’到了Panel2上。我們要在運行期間創建一個Button的話,就一定要注意指定它的Parent屬性,否則Button不會顯示出來,因爲它必須擁有一個Parent的容器來顯示自己。如果你在設計這個Button時察看下屬性編輯器,你會看到ParentFont和ParentShowHint等屬性,類似於這樣的屬性設置爲True的話,就會使Button的Font以及ShowHint屬性按Parent的Font和ShowHint的值來設置,保持一致的風格。比如Parent的Font是紅色,那麼Button的字體也將是紅色。

        ControlCount和ComponentCount的區別也就取決於Parent與Owner的區別,還是拿上面的例子解釋下Panel1的ControlCount爲1而ComponentCount卻爲0,是因爲Button1的Parent屬性指向的是Panel1而Owner屬性則還是Form1,所以Form1的ComponentCount值纔是1。我們可以利用Controls屬性與Components屬性去遍歷Parent所包含的Child Component和Owner所管理的Child Component。

        這是一個初學者比較容易混淆的概念,希望此文能幫助剛剛接觸Delphi的朋友瞭解些基本的知識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章