Object Pascal:從物件指標談起 (轉)

worldblog發表於2007-12-09
Object Pascal:從物件指標談起 (轉)[@more@]

 

 

 

 

 

Pascal:從指標談起:namespace prefix = o ns = "urn:schemas--com::office" />

作者: Musicwind®

建立時間: 2001-08-27

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

歷史:No.1

更新時間:2001-08-27 19:47

更新人員:Musicwind®

更新備註:建立。

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

1.  物件指標無處不在

有人說指標是C語言的靈魂,但在Object Pascal中又何嘗不是如此呢!你看中最常見的“Form1: TForm1;”的宣告,還有“procedure TForm1.Button1Click(Sender: TObject);”這樣的語句,其中的Form1不正是一個物件指標麼?Sender,不也是的麼?在Object Pascal中,透過一個物件指標來訪問一個物件例項是最直接、最有效的方式。

 

2.  物件指標的

當你宣告一個TObject(或者TObject的派生類)型別的變數的時候,你便獲得了一個物件指標,但是那只是一個指標而已,除了給你四個位元組的儲存空間外,並沒有給你更多。並且,最初那四個位元組的值是不確定的,這意味著你不能認為它一定是一個nil或者別的什麼值。

 

3.  物件指標只有一種

物件指標無論怎麼千變萬化,都可以歸為一種,那就是TObject型別的物件指標。因為所有其它類,都是TObject派生,因此TObject型別的指標到處適用。比如這樣的程式碼:

var

  Obj: TObject;

  Form: TForm;

begin

  //….

  Obj := Form; //可以有這樣的程式碼,這裡的型別轉換是自動完成的。

  …

end;

也許你會問,那麼反過來可不可以呢?當然可以,但是沒有那麼方便。比如:

begin

Fo:= TForm(Obj);  // ß 這裡需要經過強制轉換

//…

end;

正如你所知道的,不同型別的變數是否可以互相轉換,取決於它們對於儲存空間的需求如何。正因為同是物件指標,對儲存空間的要求完全一致,所以強制轉換不成問題。

物件指標只有一種,似乎也可以總結為“天下指標皆一家”這句話。

 

4.  靈活運用

有沒有嘗試過這樣的程式碼呢?

var

  i: Integer;

  dw: D;

begin

  I := Integer(Button1);

  ShowMessage(TButton(I).Caption);

  dw := DWORD(Button1);

  ShowMessage(TButton(dw).ClassName);

end;

你會發現,原來Integer,DWORD也可以作為物件指標來使用。原因自然是因為它們的儲存空間與TObject型別的指標所要求的相同。

推而廣之,只要有四個位元組……(後面就不用我說了吧?),或者套用阿基米德的一句名言“只要給我四個位元組,我就可以……”。

 

Object Pascal的世界其實也很精彩,只要你肯發現!

/develop/my_article.?author=Musicwind">更多文章

 

[文終]


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990258/,如需轉載,請註明出處,否則將追究法律責任。

相關文章