程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi背後---初學者參考之二(1)

Delphi背後---初學者參考之二(1)

編輯:Delphi

計算機語言一代一代地從機器語言發展到高級語言,從復雜到簡單(其實也不簡單),體現了計算機科學技術的發展。計算機語言越高級,就越抽象越人性化,與低層硬件的關系就越少,使用起來就越方便。但無論計算機語言如何高級,都是對操作系統層的抽象,因此我們總可以找出理解高級語言背後的規律,那就是:高級語言寫的代碼只是為了描述人們的需求,而這些代碼要通過“翻譯器”翻譯成機器語言形式才能被機算機識別執行。所謂的翻譯有兩種方式:一是編譯方式,代碼事先通過編譯器生成機器語言代碼,再由操作系統調度執行,如Delphi語言、C++語言等;二是解釋方式,該方式在計算內是邊解釋邊執行,並不事先生目標程序,如Basic語言、腳本語言等。解釋方式的特點運行速度慢,對計算機硬件要求比較高。

計算機語言定義描述人們需求的規則,在語言的背後是編譯器或解釋器。編譯器或解釋器的主要工作就是翻譯代碼,成為人與計算機交流的主要通道。這樣在操作系統不變的情況下,各種開發工具各顯神通,但最終都要生成計算機可執行的代碼。所以無論用哪種計算機語言寫的程序要判斷其好與壞很大程度上依賴於該語言的編譯器或解釋器。Delphi的編譯器仍然是目前世界上最先進最優秀效率最高的編譯器。

從高級語言的特點來看,它們基本上都是對操作系統提供的服務接口封裝,在此基礎上加入自己的語言特性,如OOP、指針、內存管理模式等。

從Delphi語言的整個架構來,我們寫程序要麼是直接使用VCL,要麼是調用操作系統提供的API,要麼是使用Com服務,又或是直接使用匯編語言完成我們的工作。

1. VCL

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語言面向對象特性的精華與結晶,類圖結構如下:

<?XML:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?XML:namespace prefix = o ns = "urn:schemas-microsoft-com:office:Office" />

這是一個縮略的類圖結構,但很具有代表性,從類圖中我們可以看出,VCL只有一個根——TObjct,它的每一個派生類只有一個祖先。這正是Delphi語言的面向對象的特點,所有類的最原始祖先是TObjcet,繼承方式是單一繼承。需要說明的是:

l         雖然VCL設計很經典也很龐大,但不要被這些所嚇倒。說白了他就是一個類庫,是很多有一定關系的類放在一起完成一定功能的類庫,而這些類要麼是封裝Windows的API,要麼是調用Windws的COM服務,又或是使用匯編直接操作內存。前面說過,我們寫程序可以用VCL也可以不用VCL,說明VCL並不是必須的。如果有必要,我們可以繼承擴展其中任何一個類使之成為符合自己要求的類。如我們要擴展TPanal類,使鼠標進入和離開時能觸發相應的事件(OnMouseEnterOnMouseLeave),如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) )

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved