《Mastering Delphi 6》學習筆記之九 (轉)
我曾在許多資料中看到這樣的說法:每一個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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ES6學習筆記(九)【class】筆記
- ReactNative學習筆記九之TabNavigatorReact筆記
- robot framework學習筆記之九-雜記Framework筆記
- hive學習筆記之九:基礎UDFHive筆記
- 前端學習筆記之ES6~~~前端筆記
- ES6學習筆記之Function筆記Function
- HexMap學習筆記(九)——地形特徵筆記特徵
- 彙編學習筆記之轉移指令筆記
- java學習筆記6Java筆記
- vue學習筆記6Vue筆記
- ES6學習筆記之Set和Map筆記
- ES6語法學習筆記之promise筆記Promise
- es6學習筆記筆記
- ES6 學習筆記筆記
- ES6 學習筆記筆記
- JavaWeb學習筆記——第九天JavaWeb筆記
- 飛機的 PHP 學習筆記九:安全PHP筆記
- Delphi TMSMQTT使用筆記MQQT筆記
- .NET 6學習筆記(6)——SSL證書的匯出和格式轉換筆記
- ES6的學習筆記筆記
- ES6 學習筆記一筆記
- ES6 學習筆記二筆記
- ES6 學習筆記三筆記
- ES6 學習筆記四筆記
- Oracle學習筆記(6)——函式Oracle筆記函式
- G01學習筆記-6筆記
- iOS學習筆記49 Swift(九)訪問控制iOS筆記Swift
- Vue學習筆記(九):元件化程式設計Vue筆記元件化程式設計
- ES[7.6.x]學習筆記(九)搜尋筆記
- Python學習隨筆(九)Python
- repuest轉發學習筆記一筆記
- 學習筆記之測試筆記
- JS學習筆記之this指向JS筆記
- flask學習筆記之blueprintFlask筆記
- Swoft 學習筆記之配置筆記
- 學習筆記:DOM之appendChild筆記APP
- node學習筆記之39筆記
- Web之http學習筆記WebHTTP筆記
- Netty學習筆記之ChannelHandlerNetty筆記