《Mastering Delphi 6》學習筆記之九 (轉)

worldblog發表於2007-12-09
《Mastering Delphi 6》學習筆記之九 (轉)[@more@]無名稱構件的使用

 

我曾在許多資料中看到這樣的說法:每一個Component都必須有一個不為空的Name,用於和其他Component相區分。過去我也對這種說法深信不疑。但是看過《Mastering Delphi 6》後,我知道我錯了。Component的Name屬性可以是空的,特別是對於Menu Separator,Static Label,Bevel,Shape和Panel等等。雖然會給所有的構件起一個預設的名稱,不過你可以在 Inspector中把它的Name清空,這樣的後果是::namespace prefix = o ns = "urn:schemas--com::office" />

1.構件在Object Inspector和Object TreeView中將變成Unnamed或者Component<0>這樣的表示方法;

2.該構件的宣告將從Form的宣告中完全刪除;

3.如果用View As Text看看.DFM的定義,發現無名稱的Component定義為這樣的形式:

object : TMenuItem

  caption = ‘-’

end

而一般的宣告為:

object File1: TMenuItem

  caption = ‘File’

end

這個特點的真正好處在於,可以讓Form的宣告簡潔許多,再也不會充斥大量無用的N1,N2之類識別符號,從而混淆你的視線。當然,可檔案的大小也會稍有減少。

不過,假如將Form上面所有Label的Name都設為空,那麼執行該將產生一個錯誤,因為看到宣告中沒有Label,所以不會將TLabel的有關TLabel的庫連線進來。(編譯器在絕大多數時候都很聰明,不過這個時候只能說它是自作聰明。)解決辦法是至少保留一個有名字的Label。

我們甚至可以手動將Form中某個Component的宣告刪除。不用擔心,在Form建立起來的時候這個Component不會消失,只是不能夠用通常的辦法來引用它了。真的有需要的時候,可以用Form1.FindComponent(‘Button1’)這樣的方法找到特定的構件。如果Form中的構件實在太多,可以用這個技巧來刪除一部分不太重要的宣告,保持單元的簡潔。

其實,要減少Label宣告的數量,用Delphi 6中新增的LabledEdit是一個行之有效的辦法,而且LabeledEdit可以簡化窗體的佈局管理。不過,LabeledEdit只對Edit有效。要減少其他不需要響應事件和處理輸入的構件(如Menu Separator,Panel和Bevel等等)的宣告,就只能用這種方法。

 

 

 

不同於一般的procedure或者function,在Delphi中屬於某個類的方法稱為method,它們的宣告一般為

AProcMethod:procedure(Sender:TObject) of object;

為什麼一定要加上of object呢?實際上,Object Pascal中一般的函式指標就相當於普通的指標,而AProcMethod則是一個對指標,它在Delphi中有一個對應的型別:TMethod。

TMethod=record

  Data, Code:Pointer;

end;

所以,我們在單元中可以這樣:

procedure TForm1.Button1Click2(Sender:TObject);

begin

  ShowMessage(‘Click2!’);

end;

 

procedure TForm1.FormCreate(Sender:TObject);

var

  Method:TMethod;

begin

  Method.Data := Self;

  Method.Code := MethodAddress(‘Button1Click2’);

  Button1.OnClick := TNotifyEvent(Method);

end;

當然,實際上只需要Button1.OnClick=Button1Click2即可;不過,這樣可以讓你明白在幕後發生的事情。值得注意的一點是,Button1Click2應該宣告在published段(或者和其他構件的宣告放在一起,因為預設作用域就是published),以便編譯器為它產生RTTI資訊,否則程式可能達不到預期的效果。

 

 


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

相關文章