電腦語言世代世代從機器語言發展到高階語言,從複雜到簡單(其實也不簡單),體現了電腦科學技術的發展。電腦語言越高級,就越抽象越人性化,與低層硬體的關係就越少,使用起來就越方便。但無論電腦語言如何高級,都是對作業系統層的抽象,因此我們總可以找出理解高級語言背後的規律,那就是:高級語言寫的代碼只是為了描述人們的需求,而這些代碼要通過“翻譯器」翻譯成機器語言形式才能被機算機辨識執行。所謂的翻譯有兩種方式:一是編譯方式,程式碼事先透過編譯器產生機器語言程式碼,再由作業系統調度執行,如Delphi語言、C++語言等;二是解釋方式,該方式在運算內是邊解釋邊執行,並不事先生目標程序,如Basic語言、腳本語言等。解釋方式的特點運轉速度慢,對電腦硬體需求比較高。
電腦語言定義描述人們需求的規則,在語言的背後是編譯器或解釋器。編譯器或解譯器的主要工作就是翻譯程式碼,成為人與電腦溝通的主要通道。這樣在作業系統不變的情況下,各種開發工具各顯神通,但最終都要產生電腦可執行的程式碼。所以無論用哪種電腦語言寫的程式要判斷其好與壞很大程度上依賴於該語言的編譯器或解釋器。 Delphi的編譯器仍是目前世界上最先進、最優秀效率最高的編譯器。
從高階語言的特性來看,它們基本上都是對作業系統提供的服務介面封裝,在此基礎上加入自己的語言特性,如OOP、指標、記憶體管理模式等。
從Delphi語言的整個架構來,我們寫程式要嘛是直接使用VCL,要嘛是呼叫作業系統提供的API,要嘛是使用Com服務,或是直接使用組譯語言完成我們的工作。
Delphi最核心最棒的就是視覺化元件庫(VCL——Visual Component Library)和跨平台元件庫存(CLX——aComponent Library for Cross-Platform),類似Microsoft MFC,但其架構比MFC至少要先進兩到三代。用Delphi程式你可以選擇VCL也可以不用VCL一切從頭開始。假設寫一個建立視窗並顯示「Hello world」的程序,如果不用VCL,那麼你得從呼叫API的CreateWindow開始,這是一件多麼麻煩的事,不過這還得看你的要求。這裡只是說明用Delphi程式離開VCL並不是不行,例如控制台程式。
VCL是一個功能強大的類別庫,它是Delphi語言物件導向特性的精華與結晶,類別圖結構如下:
這是一個縮略的類別圖結構,但很有代表性,從類別圖中我們可以看出,VCL只有一個根-TObjct,它的每一個衍生類別只有一個祖先。這正是Delphi語言的物件導向的特點,所有類別的最原始祖先是TObjcet,繼承方式是單一繼承。需要說明的是:
l 雖然VCL設計很經典也很龐大,但不要被這些嚇倒。說白了他就是一個類別庫,是很多有一定關係的類別放在一起完成一定功能的類別庫,而這些類別要么是封裝Windows的API,要么是呼叫Windws的COM服務,又或是使用彙編直接操作內存。前面說過,我們寫程式可以用VCL也可以不用VCL,表示VCL並不是必須的。如果有必要,我們可以繼承擴展其中任何一個類別使之成為符合自己要求的類別。如我們要擴充TPanal類,讓滑鼠進入和離開時能觸發對應的事件(OnMouseEnter/OnMouseLeave),例如QQ面板的功能。
u 從【File】->【New】->【Unit】新建一個單元。
u 寫程式碼如下,然後儲存該單元為MyPanelUnit。
unit MyPanelUnit;
interface
uses Classes, ExtCtrls, Messages, Controls;
type
TMouseActionEvent = PRocedure(Sender: TObject) of object;
TMyPanel = class(TPanel)
private
FOnMouseEnter, FOnMouseLeave:
FouseActionEvent;
//截獲滑鼠進入訊息
procedure WMMouseEnter (var Message:
TMessage); message CM_MOUSEENTER;
//截獲滑鼠移開訊息
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"一定要大寫,這是Delphi語言中唯一要注意大小的地方
procedure Register;
implementation
{ TMyPanel }
procedure Register;
begin
//在Delphi的IDE中註冊元件,顯示在面板"MyControl"上
RegisterComponents('MyControl', [TMyPanel]);
end;
procedure TMyPanel.WMMouseEnter(var Message: TMessage);
begin
//確定滑鼠進入中是否有程式碼,如果有執行
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self);
end;
procedure TMyPanel.WMMouseLeave(var Message: TMessage);
begin
//確定滑鼠進入中是否有程式碼,如果有執行
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);
end;
end.
u 然後點選【Component】->【Install Component…】,如下圖:
在「Unit file name」中選取我們剛才的單元MyPanelUnit.pas,其他選項預設。然後點選“OK”, 在“Package dclusr.bpk will be build then install, Continue?”選擇“Yes”,待編譯安裝完後儲存,這樣TmyPanel控制就被安裝到Delphi中了。滾動Delphi的控制面板到最後,將會看到如下圖的控制頁MyControl:
u 接著再新建一個工程,點選【File】->【New】->【application】,把MyControl頁中的MyPanel拖曳到Form上,按F11鍵,切換到Events頁,如下:
跟TPanel比較一下,看是不是多了OnMouseEnter和OnMouseLeave事件。雙擊OnMouseEnter,寫程式碼如下:
procedure TForm1.MyPanel1MouseEnter(Sender: TObject);
begin
ShowMessage('滑鼠進入MyPanel1');
end;
然後按F9運行,移動滑鼠到MyPanel1上,看看結果如何。
就這麼簡單,我們擴展了TPanel,使其具有處理滑鼠進入和移開事件的能力,所以VCL並不神秘,任何人都可以重寫裡面的元件(類別),使其成為自己所要的東西。
l Delphi支援介面繼承,從某種意義上說實作了多重繼承,如TComponent的定義如下:
TComponent = class(TPersistent, IInterface,
IInterfaceComponentReference)
l 不要拿抽象類別來建立實例。類別中只要有一個方法是抽象方法,那麼這個類別就是抽象類別。如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;
一個方法的定義只要有abstract關鍵字就是抽象方法。用抽象類別來建立實例沒有任何意義,因為Read和Write並沒有實現,如果呼叫則會出現為例。
(未完,請參考Delphi背後---初學者參考之二(2) )
(如需要轉載,請註明出處及作者http://haitian.myrice.com)