日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

delphi self 的使用

發(fā)布時(shí)間:2025/4/14 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 delphi self 的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

delphi self 的使用

delphi之self

在使用delphi的對象技術(shù)的時(shí)候,經(jīng)常會看到一個(gè)詞匯:self,它到底指的是什么呢?

我們還要從對象與類的關(guān)系談起。 類是對將要?jiǎng)?chuàng)建的對象的性質(zhì)的描述,是一種文檔。這很重要:

類只是一段描述性的文字,它并不會真去分配內(nèi)存,無論在其中定義多少變量。 如果打個(gè)比方,

類就是圖紙,而對象就是根據(jù)圖紙蓋的房子。對象是真正在 內(nèi)存中存在的東西,是運(yùn)行“實(shí)體”。

根據(jù)一份圖紙可以蓋多個(gè)相似的房子,同 樣道理,根據(jù)一個(gè)類,可以創(chuàng)建多個(gè)類似的對象,

這個(gè)過程叫做“實(shí)例化”。在delphi中使用對象技術(shù),要遵循以下的步驟:

1。定義一個(gè)類

2。用該類聲明一個(gè)名字(實(shí)質(zhì)是一個(gè)指針)

3。用該類實(shí)例化一個(gè)對象,并使它與先前的名字聯(lián)系起來

4。調(diào)用對象的方法或?qū)傩?/p>

5。釋放對象

下面我們寫一個(gè)最簡單的表達(dá)累加器功能的類

type

TCount = class

private

FNum: integer; // 記錄有多少個(gè)數(shù)字被累加

FSum: integer; // 當(dāng)前的累加和

pubic

procedure Add(n: integer) // 把整數(shù)n累加進(jìn)去

procedure clear; // 清零

procedure show; // 顯示當(dāng)前信息

constructor create; // 構(gòu)造函數(shù)

end;

....

使用的過程是這樣的:

var a: TCount; // 這里只是聲明了一個(gè)名字,并非真正地分配了一個(gè)對象

...... // a這個(gè)變量只占用4字節(jié)地內(nèi)存

a := TCount.create; // 在堆空間中分配內(nèi)存,并把首地址拷貝到a中。

a.add(5);

a.add(7);

a.show(); // 以上是調(diào)用a對象的有關(guān)方法

a.free; // free會去調(diào)用析構(gòu)函數(shù),完成堆空間的釋放。

我們看這樣一個(gè)問題:一個(gè)對象到底占用多大的內(nèi)存空間?

答案是很小!因?yàn)樵诜峙湟粋€(gè)對象地時(shí)候,實(shí)際上只分配了類中定義的數(shù)據(jù),

而沒有分配其中的函數(shù)所需要的空間。這些類中定義的函數(shù)(稱為成員函數(shù)),

與普通函數(shù)一樣被存放在靜態(tài)地址空間中。

這樣就引出了第二個(gè)問題:既然對象的數(shù)據(jù)和操作這些數(shù)據(jù)的方法不是存在一起,

那么這些函數(shù)如何才能知道到底要操作哪個(gè)數(shù)據(jù)塊呢?(類可生成多個(gè)實(shí)例)

顯然,最容易想到的解決辦法就是讓這些特殊函數(shù)帶一個(gè)參數(shù),是個(gè)指針類型,

該指針指示要操作的數(shù)據(jù)塊的首地址。

事實(shí)上,成員函數(shù)正是這樣做的,它們有一個(gè)缺省的參數(shù)self,這是個(gè)指針類型,

對于上邊的例子,它的定義就是:TCount self。編譯器在遇到調(diào)用a.add(5)的時(shí)候,

把它解釋為:TCount.add(a,5);把代表對象的數(shù)據(jù)塊的地址送給add函數(shù)作為第一個(gè)參數(shù)--隱含的參數(shù)。

說得本質(zhì)一些就是:self是當(dāng)前正在執(zhí)行本函數(shù)的那個(gè)對象的數(shù)據(jù)塊的首地址。

self既然代表對象自己,那么難道自己還用定義嗎?看下邊的代碼:

procedure TForm1.button1click(sender: TObject);

var

a: TButton;

begin

a := Tbutton.create(self);

....

end;

在創(chuàng)建Tbutton類的對象的時(shí)候,需要給出一個(gè)內(nèi)存管理者。

self就表示了正在運(yùn)行button1click這個(gè)過程的那個(gè)對象(的數(shù)據(jù)塊的首地址)。其實(shí)大多數(shù)情況下就是form1。//這里的理解有點(diǎn)問題應(yīng)該是OWER管理者

?

Delphi之覆蓋和隱藏

如果一個(gè)子類方法聲明指定的標(biāo)識符與繼承得到的方法具有相同的名稱,

但是未包含override,那么新的聲明只是隱藏(hides)了父類方法。也就是說子類和父類方法同樣存在,

父類方法是靜態(tài)的,并未被覆蓋,例如:

type

T1=class(TObject)

???? procedure Act;virtual;//virtual也好,或則dynamic也好,只是說明此方法可被覆蓋

end;

T2=class(T1)

???? procedure Act;//Act再次被聲明,但是因?yàn)闆]有被聲明為overriden,所以沒有覆蓋父類T1的相應(yīng)方法

end;

var

???? SomeObject:T1;

begin

????? SomeObject:T2.Create;

????? SomeObject.Act;//這里實(shí)際調(diào)用的是T1.Act

end;

關(guān)于Sender,Self,Owner和parent

?

Sender--意義:指本對象。

Sender在什么對象相關(guān)代碼里,那么Sender就是什么。

Self--意義:指本類,也就是Self被引用的類。比如若在類TMyClass內(nèi)引用了Self,

那么Self=TMyClass.

Owner--意義:哪個(gè)對象釋放我的內(nèi)存啊?

如:Pan:=TPanel.Create(Self);其中Create的參數(shù)是:AOwner:TComponent。

Owner釋放Pan的內(nèi)存。因?yàn)榇翱卺尫臥an的內(nèi)存,

但窗口類的對象是Self.一般給Owner傳Self就可以。

比如:

代碼段一:

pan:=TPanel.Create(Self);

with Pan do begin

try

Left:=20;

Top:=20;

parent:=Self; //Parent:=Form1也可以。

Visible:=true;

ShowMessage('Created');

finally

Pan.free;

end;

end;

-----------------------------------------------------

Parent--

意義:此對象包括在哪個(gè)對象里那?

說明:若組件不是從TControl繼承來的,那么在創(chuàng)建組件后不必聲明此屬性。

?

?

轉(zhuǎn)自:http://hi.baidu.com/xingfupingguo/item/79e2291647c768f686ad4e47

轉(zhuǎn)載于:https://www.cnblogs.com/linguoqiu/archive/2013/01/11/2855893.html

總結(jié)

以上是生活随笔為你收集整理的delphi self 的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。