麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Delphi > 正文

Delphi背后---初學者參考之二(2)

2019-11-18 18:22:45
字體:
來源:轉載
供稿:網友

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

2 Windows API

APIapplication PRogramming Interface)應用編程接口,所有的計算機語言都要用到它。API是什么?API是程序使用操作系統提供的服務的一個途徑,我們大多數的編程都不直接操作硬件,而是調用這些API,再由操作系統直接操作硬件,這樣的好處是我們編程時不必考濾與硬件兼容的問題,更重要的是從操作系統層實現了代碼共享。所以,在編程時如果能用API實現的功能,我們盡量用它。

l         Delphi如何使用Windows API

在日常開發工作中,我們經常要使用Windows API函數,那么API函存在在哪里呢?我們可以這樣理解,API函數就是封裝在Windows系統提供的DLL系統文件中。如我們經常使用的Beep過程(響鈴),就是調用Windwos系統目錄下的user32.dll中的MessageBeep實現的;SendMessage(發消息)就是直接調用user32.dllSendMessageADelphi使用頻率最多的Dll是:advapi32.dllkernel32.dllmpr.dllversion.dllcomctl32.dllgdi32.dllopengl32.dlluser32.dllwintrust.dllmsimg32.dll

那么Delphi是如何使用這API函數的呢?既然API函數存在于系統的DLL中,那么我們就可以像調用自己寫的DLL一樣調用API函數啦。調用DLL函數有兩種方式,一種是靜態方式,一種是動態方式。調用WindowsAPI都是采用靜態方式,為什么呢?這是因為這些DLL是操作系統提供的最基本服務,操作系統在啟動時就已經加載到內存中了,并且操作系統也大量的使用他們。

 

l         API與日常編程

Delphi封裝了Windows的大部分API函數(主要在Windows.pas單元中),應該說可以完成我們的大部分工作,我們一般不直接調用API函數。但有時有特別要求時,我們可能就要調用一些Delphi沒封裝過的API,有時甚至會調用Windows沒公布的API函數。那么如何調用這些API函數呢?就像前面說的,使用靜態方法調用就好了。更詳細的調用請參看相關的資料。

調用這些Delphi沒封裝的API函數關鍵是要知道參數。可以查閱看最新的MSDN或相關的資料。

l         API與VCL

MicrosoftMFC大量的封裝地Windows APIVCL也不例外。VCL功能的實現大部分都離不開Windows API,要么是直接調用,要么是經過簡單的封裝再調用。如TControlRepaint的實現(Control單元中):

procedure TControl.Repaint;

var

  DC: HDC;

begin

  if (Visible or (csDesigning in ComponentState) and not (

csNoDesignVisible in ControlStyle)) and (Parent <> nil) and

    Parent.HandleAllocated then

    if csOpaque in ControlStyle then

    begin

//直接調用user32.DllGetDC

      DC := GetDC(Parent.Handle);

      Try

        //直接調用gdi32.DllIntersectClipRect

        IntersectClipRect(DC, Left, Top, Left + Width, Top +

Height);

                // Parent.PaintControls調用大量的API

        Parent.PaintControls(DC, Self);

      Finally

// 直接調用user32.DllReleaseDC

        ReleaseDC(Parent.Handle, DC);

      end;

    end else

    begin

      //以下兩個經過封裝調用

      Invalidate;

      Update;

    end;

end;

可見VCL中處處都有API,我們從另外一個面來理解VCL就是:VCL就是大量封裝API函數的類庫,這樣的結果就是使我們更容易使用API,不必關心那些煩人的API參數。

 

3 DelphiWindwos COM服務

COM是什么東西?COMComponent Object Model),組件對象模型,它是基于Windows平臺的讓不同的獨立對象能相互通訊的不受任何計算語言約束的軟件組件模型,它定義一組API和一個二進制標準。這個定義比較抽象,首先它是一種組件模型,定義了一種組件對象規范,實現這個COM模型的對象就是COM對象。COM對象是通過接口(Interface)來實現訪問的,一個COM對象可以包含一個或多個接口,這些接口構成了COM對象的功能,你可以像訪問VCL對象方法一樣訪問COM對象的接口方法。COM對象的目的是實現資源共享,它在二進制代碼級別實現了共享,所以它可以用不同的編程語言來實現,也可以由不同的編程語言來調用,這類似于DLL(其實COM的思想來源來DLL)

l         VCL與COM

COMMicrosoft以前極力推崇的東西,所以在Windows操作系統中無處不在,同樣DelphiVCL也有調用Windows COM服務的,最明顯例子就是組件欄ADO頁的所有ADO組件,如TADOQuery,它是從TCustomADODataSet繼承下來的,而TCustomADODataSet的定義如下:

TCustomADODataSet = class(TDataSet, IUnknown,

RecordsetEventsVt)

  private

    FRecordsetObject: _Recordset;

    FFindCursor: _Recordset;

    FLookupCursor: _Recordset;

    FLockCursor: _Recordset;

    FRowset: IRowset;

    Faccessor: IAccessor;

    FRowsetFind: IRowsetFind;

    FHAccessor: HACCESSOR;

    FOleRecBufSize: Integer;

end;

ADO(Microsoft ActiveX Data Objects),它是一組通過Microsoft OLE DB 提供者訪問數據庫COM對象的集合。如我們研究一下TADOQueryFirst方法的實現過程:

TADOQuery.First->TDataSet.First->TdataSet.InternalFirst-> TCustomADODataSet. InternalFirst ->Recordset15. MoveFirst

TADOQueryTCustomADODataSet繼承,而TCustomADODataSetTdataSet繼承,TdataSet.InternalFirst定義的是虛方法,而子類TCustomADODataSet. InternalFirst覆蓋了它。TCustomADODataSet. InternalFirs調用接口Recordset15 MoveFirst方法。

不難發現,TADOQuery.First最終是通過接口調用COM對象實現的。

 

l         Delphi與Windows 外殼

什么是Windows外殼呢?Windows外殼是Windows界面操作的環境,它還為我們編程提供了強大的可擴展性。我們利用Windows外殼實現某些功能的編程,稱為外殼擴展。例如,如果你的機器上已經裝了WinRAR,在文件夾的右鍵菜單就會看到WinRAR的壓縮菜單。這些功能就是通過Windows的外殼擴展實現的。

Windows外殼是基于COM的,所以所有的外殼擴展都要通過接口實現。Delphi也定義了很多外殼擴展接口,在Delphi7的安裝目錄下的Source/rtl/Win/ShlObj.pas單元中。

DelphiDemo目錄下的有一個Virtual Listview的例子,就是通過Windows外殼擴展實現磁盤瀏覽的,有興趣的讀者可以研究一下。

4 嵌入式匯編語言

在代碼中嵌入匯編語言也是Delphi的一大特色,如VCL的根類Tobjce的實現就大量嵌入了匯編語句。

匯編語言是一種比較低級的計算機語言,與硬件的關系比較密切。所以我們在平時編程中盡量不要使用它,但是在某些特殊場合(如性能要求比較高、需要直接操縱硬件)下,使用它還是能發揮很大的作用的。

      

 

                                                            The end.

 

(如需要轉載,請注明出處及作者http://haitian.myrice.com)


上一篇:delphi連接數據庫淺談

下一篇:在Delphi7中調試COM+

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 亚洲一区中文字幕 | 七首小情歌泰剧在线播放 | 销魂美女一区二区 | 欧美精品久久久久久久久久 | 视频一区 日韩 | 欧美日韩一区,二区,三区,久久精品 | 九九看片 | 小视频在线看 | 免费在线观看亚洲 | 91久久一区| 欧美中文字幕一区二区三区亚洲 | 国产精品视频一区二区三区综合 | 日韩 综合 | 成人不卡一区二区 | 精品中文字幕在线观看 | 啊~用cao嗯力cao烂我视频 | 久久精品一区二区三区不卡牛牛 | 天天躁狠狠躁夜躁2020挡不住 | 欧美久久一区二区 | 毛片a片 | 久久久久久久久91 | 精品一区二区三区免费视频 | 精品国产亚洲人成在线 | 黄色男女视频 | 亚洲卡通动漫在线观看 | 性片网站| 欧美成人精品欧美一级 | 一级黄色免费电影 | 欧美激情天堂 | 免费三级大片 | 男女无套免费视频 | 色污视频在线观看 | 国内精品伊人久久久久网站 | 99精品热视频 | 日韩精品免费看 | 一边吃奶一边摸下娇喘 | 亚洲午夜免费电影 | 一级啪啪片| 成人做爰高潮片免费视频韩国 | 美女网站黄在线观看 | 久久免费视频7 |