計(jì)算機(jī)語(yǔ)言一代一代地從機(jī)器語(yǔ)言發(fā)展到高級(jí)語(yǔ)言,從復(fù)雜到簡(jiǎn)單(其實(shí)也不簡(jiǎn)單),體現(xiàn)了計(jì)算機(jī)科學(xué)技術(shù)的發(fā)展。計(jì)算機(jī)語(yǔ)言越高級(jí),就越抽象越人性化,與低層硬件的關(guān)系就越少,使用起來(lái)就越方便。但無(wú)論計(jì)算機(jī)語(yǔ)言如何高級(jí),都是對(duì)操作系統(tǒng)層的抽象,因此我們總可以找出理解高級(jí)語(yǔ)言背后的規(guī)律,那就是:高級(jí)語(yǔ)言寫(xiě)的代碼只是為了描述人們的需求,而這些代碼要通過(guò)“翻譯器”翻譯成機(jī)器語(yǔ)言形式才能被機(jī)算機(jī)識(shí)別執(zhí)行。所謂的翻譯有兩種方式:一是編譯方式,代碼事先通過(guò)編譯器生成機(jī)器語(yǔ)言代碼,再由操作系統(tǒng)調(diào)度執(zhí)行,如Delphi語(yǔ)言、C++語(yǔ)言等;二是解釋方式,該方式在計(jì)算內(nèi)是邊解釋邊執(zhí)行,并不事先生目標(biāo)程序,如Basic語(yǔ)言、腳本語(yǔ)言等。解釋方式的特點(diǎn)運(yùn)行速度慢,對(duì)計(jì)算機(jī)硬件要求比較高。
計(jì)算機(jī)語(yǔ)言定義描述人們需求的規(guī)則,在語(yǔ)言的背后是編譯器或解釋器。編譯器或解釋器的主要工作就是翻譯代碼,成為人與計(jì)算機(jī)交流的主要通道。這樣在操作系統(tǒng)不變的情況下,各種開(kāi)發(fā)工具各顯神通,但最終都要生成計(jì)算機(jī)可執(zhí)行的代碼。所以無(wú)論用哪種計(jì)算機(jī)語(yǔ)言寫(xiě)的程序要判斷其好與壞很大程度上依賴于該語(yǔ)言的編譯器或解釋器。Delphi的編譯器仍然是目前世界上最先進(jìn)最優(yōu)秀效率最高的編譯器。
從高級(jí)語(yǔ)言的特點(diǎn)來(lái)看,它們基本上都是對(duì)操作系統(tǒng)提供的服務(wù)接口封裝,在此基礎(chǔ)上加入自己的語(yǔ)言特性,如OOP、指針、內(nèi)存管理模式等。
從Delphi語(yǔ)言的整個(gè)架構(gòu)來(lái),我們寫(xiě)程序要么是直接使用VCL,要么是調(diào)用操作系統(tǒng)提供的API,要么是使用Com服務(wù),又或是直接使用匯編語(yǔ)言完成我們的工作。
Delphi最核心最偉大的就是可視化組件庫(kù)(VCL——Visual Component Library)和跨平臺(tái)組件庫(kù)存(CLX——aComponent Library for Cross-Platform),類(lèi)似于Microsoft MFC,但其架構(gòu)比MFC至少要先進(jìn)兩到三代。用Delphi編程你可以選擇VCL也可以不用VCL一切從頭開(kāi)始。假設(shè)寫(xiě)一個(gè)建窗口并顯示“Hello world”的程序,如果不用VCL,那么你得從調(diào)用API的CreateWindow開(kāi)始,這是一件多么麻煩的事,不過(guò)這還得看你的要求。這里只是說(shuō)明用Delphi編程離開(kāi)VCL并不是不行,如控制臺(tái)程序。
VCL是一個(gè)功能強(qiáng)大的類(lèi)庫(kù),它是Delphi語(yǔ)言面向?qū)ο筇匦缘木A與結(jié)晶,類(lèi)圖結(jié)構(gòu)如下:
這是一個(gè)縮略的類(lèi)圖結(jié)構(gòu),但很具有代表性,從類(lèi)圖中我們可以看出,VCL只有一個(gè)根——TObjct,它的每一個(gè)派生類(lèi)只有一個(gè)祖先。這正是Delphi語(yǔ)言的面向?qū)ο蟮奶攸c(diǎn),所有類(lèi)的最原始祖先是TObjcet,繼承方式是單一繼承。需要說(shuō)明的是:
l 雖然VCL設(shè)計(jì)很經(jīng)典也很龐大,但不要被這些所嚇倒。說(shuō)白了他就是一個(gè)類(lèi)庫(kù),是很多有一定關(guān)系的類(lèi)放在一起完成一定功能的類(lèi)庫(kù),而這些類(lèi)要么是封裝Windows的API,要么是調(diào)用Windws的COM服務(wù),又或是使用匯編直接操作內(nèi)存。前面說(shuō)過(guò),我們寫(xiě)程序可以用VCL也可以不用VCL,說(shuō)明VCL并不是必須的。如果有必要,我們可以繼承擴(kuò)展其中任何一個(gè)類(lèi)使之成為符合自己要求的類(lèi)。如我們要擴(kuò)展TPanal類(lèi),使鼠標(biāo)進(jìn)入和離開(kāi)時(shí)能觸發(fā)相應(yīng)的事件(OnMouseEnter/OnMouseLeave),如QQ面板的功能。
u 從【File】->【New】->【Unit】新建一個(gè)單元。
u 寫(xiě)代碼如下,然后保存該單元為MyPanelUnit。
unit MyPanelUnit;
interface
uses Classes, ExtCtrls, Messages, Controls;
type
TMouseActionEvent = PRocedure(Sender: TObject) of object;
TMyPanel = class(TPanel)
private
FOnMouseEnter, FOnMouseLeave:
FouseActionEvent;
//截獲鼠標(biāo)進(jìn)入消息
procedure WMMouseEnter (var Message:
TMessage); message CM_MOUSEENTER;
//截獲鼠標(biāo)移開(kāi)消息
procedure WMMouseLeave (var Message:
TMessage); message CM_MOUSELEAVE;
published
property OnMouseEnter: TMouseActionEvent read
FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TMouseActionEvent read
FOnMouseLeave write FOnMouseLeave;
end;
//注意"Register"中的"R"一定要大寫(xiě),這是Delphi語(yǔ)言中唯一要注意大小的地方
procedure Register;
implementation
{ TMyPanel }
procedure Register;
begin
//在Delphi的IDE中注冊(cè)組件,顯示在面板"MyControl"上
RegisterComponents('MyControl', [TMyPanel]);
end;
procedure TMyPanel.WMMouseEnter(var Message: TMessage);
begin
//確定鼠標(biāo)進(jìn)入中是否有代碼,如果有執(zhí)行
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self);
end;
procedure TMyPanel.WMMouseLeave(var Message: TMessage);
begin
//確定鼠標(biāo)進(jìn)入中是否有代碼,如果有執(zhí)行
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);
end;
end.
u 然后點(diǎn)擊【Component】->【Install Component…】,如下圖:
在“Unit file name”中選中我們剛才的單元MyPanelUnit.pas,其他選項(xiàng)默認(rèn)。然后點(diǎn)擊“OK”, 在“Package dclusr.bpk will be build then install, Continue?”選擇“Yes”,待編譯安裝完后保存,這樣TmyPanel控件就被安裝到Delphi中了。滾動(dòng)Delphi的控件面板到最后,將會(huì)看到如下圖的控件頁(yè)MyControl:
u 然后再新建一個(gè)工程,單擊【File】->【New】->【application】,把MyControl頁(yè)中的MyPanel拖到Form上,按F11鍵,切換到Events頁(yè),如下:
和TPanel比較一下,看是不是多了OnMouseEnter和OnMouseLeave事件。雙擊OnMouseEnter,寫(xiě)代碼如下:
procedure TForm1.MyPanel1MouseEnter(Sender: TObject);
begin
ShowMessage('鼠標(biāo)進(jìn)入MyPanel1');
end;
然后按F9運(yùn)行,移動(dòng)鼠標(biāo)到MyPanel1上,看一下結(jié)果如何。
就這么簡(jiǎn)單,我們擴(kuò)展了TPanel,使其具有處理鼠標(biāo)進(jìn)入和移開(kāi)事件的能力,所以VCL并不神秘,任何人都可以重寫(xiě)里面的組件(類(lèi)),使之成為自己所要的東西。
l Delphi支持接口繼承,從某種意義上說(shuō)實(shí)現(xiàn)了多重繼承,如TComponent的定義如下:
TComponent = class(TPersistent, IInterface,
IInterfaceComponentReference)
l 不要拿抽象類(lèi)創(chuàng)建實(shí)例。類(lèi)中只要有一個(gè)方法是抽象方法,那么這個(gè)類(lèi)就是抽象類(lèi)。如TStrings定義如下:
TStream = class(TObject)
private
…
protected
…
public
function Read(var Buffer; Count: Longint): Longint; virtual; abstract;
function Write(const Buffer; Count: Longint): Longint; virtual; abstract;
…
end;
一個(gè)方法的定義中只要有abstract關(guān)鍵字就是抽象方法。用抽象類(lèi)來(lái)創(chuàng)建實(shí)例沒(méi)有任何意義,因?yàn)?/SPAN>Read和Write并沒(méi)有實(shí)現(xiàn),如果調(diào)用則會(huì)出現(xiàn)為例。
(未完,請(qǐng)參看Delphi背后---初學(xué)者參考之二(2) )
(如需要轉(zhuǎn)載,請(qǐng)注明出處及作者http://haitian.myrice.com)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注