程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 充分利用WindowsAPI擴展Delphi函數

充分利用WindowsAPI擴展Delphi函數

編輯:Delphi

充分利用Windows API擴展Delphi函數
                      袁衛國



    Borland Delphi是與Visual Basic相似的可視化開發工具,但其功能比VB更加強大。
例如,Delphi支持匯編語言和指針操作、全面支持Windows API函數及外部DLL的使
用,使得它具有更廣泛的應用范圍。即使用於編制一些較小的應用程序,Delphi與VB
相比看來不相上下,
但由於Delphi是編譯型的語言,其編譯後的EXE文件可以真正脫
離Delphi的環境獨立運行,而VB 生成的EXE文件離開了VB軟件包的一大堆DLL、
VBX等文件可能會無法執行。而更重要的是,一般用戶往往並不真正知道自己開發
的VB程序到底使用了哪些DLL一類的文件,為了保證程序的正常運行,可能在最後的
安裝盤中包含了不少其實並不需要的文件。所以,一般用戶用VB很難開發出真正實
用的軟件,難怪有人說VB是"先甜後苦"。Delphi實際上可以看作是VP(Visual Pascal),所
以它的易學性也可與VB媲美。今年發布的Delphi2.0可以為Windows 95、Window s NT
開發32位程序,使得VB 4.0的優勢也不復存在。看來,在今後一段時間內,將會有更多
的人使用Delphi開發Windows應用程序。在DOS下開發過軟件的人都知道int 2lh的重要。
與此類似,Windows應用程序也是離不開Windows API的,許多較底層的操作必須通過
API函數來實現。為此,無論是C++、VB還是Delp hi都無一例外地支持API函數的調
用,只是VB由於自身的特點所限制,僅支持部分API函數,而C++、Delphi則全面地支持
API函數。相比之下,Delphi對API函數的調用最簡捷,達到了與自身的內部函數幾乎
不分彼此的程度(只要求在interfaces中的user段中加上Windows即可,而這一步Delphi
會自動為您做到),VB則相當繁瑣。以調用獲得Windows系統子目錄的API函數為例
,我們來看一下二者有什麼不同:API函數格式的描述:WORD GetSystemDirectory(lpBuffer,
nSize)

    VB 4.0調用時首先要做如下申明:
    Declare Function GetSystemDirectory Lib"kernel32"(ByVal
lpBuffer As String, ByValnSize As Long)As Long
    然後才能使用:
    Dim lpBuffer As String *255
    Size&=GetSystemDirectory(lpBuffer,255)
    而Delphi只需像調用內部函數那樣:
    var lpBuffer:PChar;{API函數必須使用null結尾的字符串}
    Size:WORD;{返回的系統子目錄字符串實際長度}
    begin lpBuffer:=StrAlloc(255);{預留字符串長度}
    Size:=GetSystemDirectory(lpBuffer,255);end;
    由此可見,Delphi是可以充分利用Windows API來擴展其自身功能的。當然,在大
多數情況下,Delphi本身的函數功能已經足夠使用了。但是,在有些情況下,需要使
用API函數來實現一些特殊的功能或完善Delphi的一些功能。下面提供兩個實例
來說明這一點。

    一、信息框函數MsgBox
    信息框是Windows應用程序中使用得較多的一種對話機制,它被廣泛地用於提
示、選擇程序走向,是一個重要的程序控制手段。Delphi提供的信息框函數MessageDlg
功能比較強,其最大優點是可以任意設定信息框的按鈕(使用了集合類型),但其缺
點也是很明顯的,主要表現在標題字符串不能由用戶自己設置;窗口彈出時寂靜無聲
;按鈕不能隨著Windows的不同語言的版本顯示不同的文字(例如無論在哪種語言版

本下都只能顯示"OK"、"Yes"等英文字符)。這些優點和缺點都是由於它是Delphi
自己實現的,而不是通過調用系統API函數實現的,故不能使用系統的語言環境、
多媒體等資源。這樣,所開發的程序在中文版中顯示信息框時與周圍的窗口顯得
極不協調。而VB在這方面卻做得較好,所以我們按照VB的格式自定義一個信息
框函數MsgBox。下面的函數都假定是在TForml中定義的。為了使用方便,我們首
先在Interfaces段中定義一些符號常量:

    const
      {第一組:按鈕內容選擇}
    OKOnly=0;{僅顯示"確定"按鈕}
    OKCancel=1;{顯示"確定"和"取消"按鈕}
    AbortRetryIgnore=2;{"中止""重試""放棄"}
    YesNoCancel=3;{"是""否""取消"}
    YesNo=4;{"是"和"否"}
    RetryCancel=5;{"重試""取消"}
    {第二組:顯示圖標選擇}
    Critical=16;{"STOP"圖標}
    Question=32;{"?"圖標}
    Excalamation=48;{"!"圖標}
    Information=64;{"i"圖標}
    {第三組:缺省指針位置(激活狀態)}
    DefaultButton1=0;{第一按鈕}
    DefaultButton2=256{第二按鈕}
    DefaultButton3=512{第三按鈕}
    {第四組:信息框方式}
    ApplicationModal=0;{應用方式}
    SystemModal=4096;{系統方式}
    然後,建立函數MsgBox,由於API函數中使用的字符串必須以mull結尾,所以使用了另
一個自定義的函數StrToPch來將Pascal類型字符串轉換成為以mull結尾的字符串。參
數說明 msg為信息框標題變量; mbType為規定信息框類型的變量,使用方式是"mbType=
按鈕內容+圖標+缺省指針+信息框方式"。便如您想得到一個含"確定"和"取消"兩個按
鈕、帶"?"圖標、缺省指針指向第二個按鈕(即"取消")的信息框,那麼就該這樣設置:
mbType:=OKCancel+Question+DefaultButton2;

    title為信息框中顯示文本的變量。
    MsgBox的返回值與MessageDlg函數的返回值完全一樣,例如返回mrYes表示"Yes"或
"是" 按鈕被按下,mrNo表示"No"或"否"按鈕被按下等等。可參考MessageDlg函數的說
明。下面即是在Delphi中通過調用Windows API的GetActive Windows函數和MessageBox
函數來實現MsgBox函數的代碼:{信息框函數}

    function TForm1.MsgBox(msg:string;mbType:Word;title:stri
ng):Word;
    var hWnd:HWND;
    1pText,!pCaption:Pchar;
    begin <

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