Delphi自定義類

2021-09-06 05:26:08 字數 3475 閱讀 1243

類的宣告

有兩種宣告辦法

一、自定義類的父類delphi內建類

type 類名 = class(父類)

成員表示式

end;

(1)保留字class說明該類是dephi內建類,將繼承父類的屬性和方法

(2)「父類」預設是delphi的祖先類tobject

二、完全自定義的類

type 類名 = object(父類)

成員表示式

end;

(1) 保留字object說明該類是完全自定義的類

(2) 自類也必須是完全自義的類

注意:用class自定義的類必須遵循delphi內建類的tobject的特定的構造方法和析構方法,而用object自定義類的方法無此限制(記憶體管理方式),所以用第一種方法生成物件時必須呼叫create建構函式,

第二種就不需要,可直接生成物件,它將做為一般變數,和記錄(record)變數相同,用到

時立即分配記憶體,用完時自動釋放記憶體

自定義delphi內建類的構造和析構

建構函式

constructor create(aowner :tcomponent) ;override ;

(1)可以根據實際情況改變引數資訊(引數個類,型別,順序,預設值)

(2)若要繼承父類的建構函式,可新增inherited create;

析構函式

destructor destroy ; override ;

(1) 若在自定類中新增了其它類,一定要記得釋放這些物件

(2) 若要繼承父類

(3)值得注意的中destroy中刪除物件的變數,即物件的參考,未真正刪除物件實體,也就沒有釋放物件所佔的記憶體,另外,若在沒有呼叫create 的情況下,該物件參考的值為nil,這種情況下呼叫destroy,會產生錯誤

用free可解決上面的問題(真正釋放記憶體;在沒有建立的物件的情況下呼叫free也不會報錯)

還有乙個更實用的freeandnil(物件),它不僅釋放記憶體,而且將物件的參考(變數)賦nil值

完全自定義類的構造和析構

自定類也完全可以自己編碼自己的構造和析構函式,為其分配記憶體、釋放記憶體,不免要用到指標,是複雜度很高的工程,此時還是用的自定義的class比較方便。

類的封裝

封裝的含義:把個別單元(物件和類)的所有資料和功能(成員變數、成員函式、屬性)全部包括它的內部。

封裝的目的:防止外界去破壞物件內部結構和資料。只有通過物件對外的介面,才能訪問物件內部的資料,物件之間也無法直接訪問彼此的資料,必須通過某些資訊的傳遞,而這些資訊對呼叫、執行物件內部的方法,或訪問物件內部的屬性或字段。

封裝的方式:delphi中用類(class)的宣告技術。介面部分(inte***ce)用來定義物件外觀及物件對外表現的行為,而實現部分(implementation)則用來處理物件內部執行,其內容包括不公開的字段、方法,甚至屬性。

objectpascal封裝的級別

五個級別

private

(1)這裡宣告的類成員(包括字段、方法(類方法))只能在類宣告的單元內使用。

(2)子類可以繼續父類的private成員,但無法使用這些成員

該部分宣告的方法為類方法,也就是說物件無法直接呼叫

protected

(1)這裡宣告的類成員(包括字段、方法(類方法))只能在類宣告的單元內使用

(2)子類可以繼承父類的protected成員,也可以使用,但也只限於類定義的單元

該部分宣告的方法同樣為類方法,類的物件也無法直接呼叫

public

(1)這裡宣告的類成員(包括字段、方法(物件方法))可見度最大,可以在類單元及類物件所在的任何單元使用。

published

(1) 可見度與public一樣,

(2) 與public的區別是本區域的成員可以在delphi物件檢查器中出現,而此差別來自rtti機制

rtti(run time type information)是為published製作它允許應用程式動態查詢該類的published的字段、屬性(包括屬性和事件),並且載入類的方法

rtti啟動條件是有條件的——使「」編譯指令的狀態下才能啟動rtti或它的祖先類以上述狀態編譯,也可以啟動rtti,然後該類檢查器才能顯示在檢查器中。

(3) 除了rtti條件限制後,published的屬性也有型別限制

a.序數、字串(string)、class、inte***ce以及mothod—pointer類,都可以做published的屬性

b. 範圍在0-31之間的集合,該集合值必須滿足byte、word或double word類才能做published屬性

c. 除了real類外的所有實數類,都可以做為published屬性

d.陣列類不可以做published屬性

e. 所有的成員函式都可以作為published的事件,然而過載override的函式不可以作為published事件

f. 欄位fieled不能作為published的屬性,除非它屬於class或inte***ce類

automated

(1) 可見度與public成員一樣

(2) 與public差別和public與published差別相似,當我們使用自動化伺服器(automation server)時,「automation type information」是為auomated成員設定。而所有的automatic成員只能出現在oleauto單元,繼承自tautoobject的類裡面,且oleauto單元原本就有預設的automated區,至於comobj單元,則無法具有automated

開頭不加保留字的類成員

這裡講的開頭不加保留的類成員兩種情況

一、 在private 、protected 、public 、published所屬區域,非第乙個類成員可以不加這些保留字(省略)

二、 若類的成員不些這個上述四個範圍之內,像在類的開頭部分有幾個沒有保留字的類成員,它的所屬情況分兩種:

a. 該類或你類使用了「」編譯指令的情況下,預設為published成員

b. 該類或你類未使用「」編譯指令的情況下,預設為public成員

成員封閉等級的變更法則

變更方法:只需要在子類成員的宣告區重新宣告即可

遵循法則:可擴大該成員的可見度,但不要縮小成員的可見度。

因為縮小某些成員可見度使某些成員可見度降低,有可能困這些成員無法訪問而導致編譯錯誤

類成員的定義和實現

類成員字段、方法、屬性

欄位與物件引用的實現

字段:指狹義上的字段——指物件還擁有的成員變數。

(1) 成員變數的封裝通常在private這個等級

(2) 成員變數的定義必須早於任何屬性或方法的定義

(3) 成員變數的型別沒有限制

倘若成員變數屬於class類,則此種情況我們稱該成員變數為「物件引用」 方法

(1) 類名.方法名 屬性

與字段的區別;

(1) 字段只是乙個保留資料的空間,屬性可以被訪問,進行一些讀寫操作

(2) 屬性需要加上保留字property,且要提供一些相關的讀寫方法

Delphi自定義類筆記 二

delphi 自定義類筆記 二 開頭不加保留字的類成員 這裡講的開頭不加保留的類成員兩種情況一 在 private protected public published 所屬區域,非第乙個類成員可以不加這些保留字 省略 二 若類的成員不些這個上述四個範圍之內,像在類的開頭部分有幾個沒有保留字的類成員...

delphi自定義事件

為什麼我們點選按鈕,就會執行按鈕的onclick事件?這個事件是怎麼和我們自己的 關聯起來的。相信很多人都有這個疑問。那麼我們就通過乙個自定義事件來了解這裡面得執行原理。以乘法運算來顯示,如果乘數大於100,就提示使用者,太大了。這個事件用自定義事件定義。我新增了三個文字框,乙個按鈕,當第一或者第二...

delphi 自定義記憶體管理

1.主要通過getmemorymanager來hook原來的記憶體管理。2.通過setmemorymanager來設定你自己的新的記憶體管理,可以用乙個記憶體池來優化和管理程式的記憶體呼叫情況。procedure registermemmgr varamgr tmemorymanagerex beg...