充分利用WindowsAPI扩展Delphi函数_第1页
充分利用WindowsAPI扩展Delphi函数_第2页
充分利用WindowsAPI扩展Delphi函数_第3页
充分利用WindowsAPI扩展Delphi函数_第4页
充分利用WindowsAPI扩展Delphi函数_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、充分利用 Windows API 扩展 Delphi 函数Borland Delphi是与Visual Basic相似的可视化开发工具,但其功能比VB更加强大。例如, Delphi 支 持汇编语言和指针操作、全面支持Windows API 函数及外部DLL 的使 用,使得它具有更广泛的应用范围。即使用于编制 些较小的应用程序, Delphi 与 VB相比看来不相上下,但由于Delphi是编译型的语言,其编译后的 EXE文件可以真正脱离Delphi的环境独立运行,而VB生成的EXE文件离开了 VB软件包的大堆DLL、VBX 等文件可能会无法执行。而更重要的是,般用户往往并不真正知道自己开发的 V

2、B 程序到底使用了哪些DLL 类的文件,为了保证程序的正常运行,可能在最后的安装盘中包含了不少其实并不需要的文件。所以,般用户用VB很难开发出真正实用的软件,难怪有人说 VB是“先甜后苦"Delphi实际上可以看作是 VP(Visual Pascal),所以它的易学性也可与VB媲美。今年发布的 Delphi2 . 0可以为Windows町、Window s NT开发 32 位程序,使得VB 4. 0 的优势也不复存在。看来,在今后段时间内,将会有更多的人使用Delphi开发Window s应用程序。在DOS下开发过软件白人都知道int 21h的重要。与此类似, Windows 应用程

3、序也是离不开Windows API 的 ,许多较底层的操作必须通过API 函 数来实现。为此,无论是C+ 、归还是 Delp hi 都无一例外地支持API 函数的调用,只是 VB 由于自身的特点所限制,仅支持部分API 函数,而C+、 Delphi 则全面地支持API 函 数。相比之下, Delphi 对 API 函 数的调用最简捷,达到了与自身的内部函数几乎不分彼此的程度( 只要求在interfaces 中的 user 段中加上 Window s 即可,而这一步 Delphi会自动为您做到),VB则相当繁琐。以调用获得Window s系统子目录的 API函数为例,我们来看一下二者有什么不同

4、:API 函数格式的描述:WORD GetSystemDirectory (lpBuffe r,nSize)VB 4. 0 调用时首先要做如下申明 :Declare Function GetSystemDirectoryLib"kerne132" (ByVallpBuffer As String , ByValnSize As Long)As Long然后才能使用 :Dim lpBuffer As String *255Size& 二 GetSyste mDirectory(lpBuffer, 255)而 Delphi 只需像调用内部函数那样:var lpBuffe

5、r:PChar;AP I 函 数必须使用 null 结 尾的字符串 Size:WORD; 返回的系统子目录字符串实际长度begin 1pBuffer: 二 StrA110c (255) 才预留字符串长度Size: 二 GetSystemDirectory(lpBuffer , 255) ;end;由此可见,Delphi是可以充分利用 Windows API来扩展其自身功能的。当然,在大 多数情况下, De1phi 本身的函数功能已经足够使用了。但是,在有些情况下,需要使用API 函 数来实现些特殊的功能或完善De1phi 的 些功能。下面提供两个实例来说明这一点。、信息框函数MsgBox信息框

6、是 Windows 应用程序中使用得较多的一种对话机制,它被广泛地用于提示、选择程序走向,是一个重要的程序控制手段。 De1phi 提供的信息框函数MessageD1g 功能比较强,其最大优点是可以任意设定信息框的按钮(使用了集合类型) ,但其缺 点也是很明显的,主要表现在标题字符串不能由用户自己设置! 窗口弹出时寂静无声! 按钮不能随着Windows 的不同语言的版本显示不同的文字 ( 例如无论在哪种语言版本下都只能显示"OK 仁 "Yes "等英文字符) 。这些优点和缺点都是由于它是De1phi自己实现的,而不是通过调用系统API 函数实现的,故不能使用系统的

7、语言环境、多媒体等资源。这样,所开发的程序在中文版中显示信息框时与周围的窗口显得 极不协调。而VB在这方面却做得较好,所以我们按照凹的格式自定义一个信息框函数MsgBoxo下面的函数都假定是叁TForm1定义的。为了使用方便,我们首先在 Interfaces 段中定义些符号常量:const第组:按钮内容选择 OKOnly二0;仅显示"确定"按钮 OKCance1=1; 显示" 确定 ":f 日 "取消 "按钮 AbortRetryIgnore = 2; "中 J上川重试""放弃"YesNoCan

8、ce1 二 3; " 是"" 否川取消 "YesNo二 4; "是"和"否"RetryCance1=5; " 重试 "" 取消 " 第二组 : 显示图标选择Critica1 二 16; " STOP"图标Question 二 32; " 7" 图标 Exca1amation 二 48 ; " ! " 图标 Information 二 64; 勺 " 图标 第三组 : 缺省指针位置( 激活状态 ) Defau

9、1tButton1 二 0; 第按钮 Defau1tButton2 二 256 第二按钮Defau1tButton3 二 512第三按钮 第四组 : 信息框方式App1icationModa1 二 0; 应用方式 SysternhOdal二4096; 系统方式然后,建立函数MsgBox由于API函数中使用的字符串必须以 mull 结尾,所以使用了另一个自定义的函数StrToPch 来将 Pasca1 类型字符串转换成为以 mull 结尾的字符串。参数说明msg为信息框标题变量;mbType为规定信息框类型的变量,使用方式是"mbType二按钮内容+图标 +缺省指针+信息框方式&quo

10、t; 。便如您想得到一个含 "确定 "和"取消 "两个按钮、带 "?" 图标、缺省指针指向第二个按钮(W' 取 消勺的信息框,那么就该这样设置.mbType:二 OKCance1+Question+Defau1tButton2;tit1e 为信息框中显示文本的变量。MsgBoX勺返回值与MessageD10l<J数的返回值完全一样,例如返回mrYes表示"Yes" 或"是"按钮被按下,rnrNo<水"No"或"否"按钮被按下等等。可参考

11、 MessageD1§l<J数的 说明。下面即是在De1phi中通过调用 Windows aPi的GetActive Windows函数和 MessageBox函数来实现 MsgBo湎数的代码:信息框函敖function TForm1.MsgBox(msg:string;mbType:Word; tit1e:stri ng):Word;var hWnd:HWND1pText , !pCaption:Pchar;begin1pText: 二 StrToPch(tit1e) ;1pCaption 二 StrToPch(msg); hWnd2 GetActi veWindowO;Ms

12、gBox:二 MessageBox(hWn,d1pText, 1pCaption , mbType); end将 Pasca1 字符串转换成null 结尾字符串函数function TForm1.StrToPch(Str:string) :PChar;vara:PCharbegina: 二 StrAlloc (Length (Str) +1) ;StrPCopy (a , Str) ;StrToPch: 二 a;end二、文件拷贝函数CopyFDe1phi 提供了 组比较完整的文件操作函数,用它们可以完成几乎全部的文件操作,但恰恰缺少拷贝文件的函数。而文件拷贝的使用应该说是比较常用的,因此,笔

13、者利用几个API 函数定义了 个功能很强的文件拷贝函数CopyF。该函数代码如下(请注意该函数中调用了上述的MsgBox函数): 文件拷贝函数function TForm1.CopyF(var ExistingFi1eName:string;constNewFi1eName:string; var Mode:lnteger) :Boo1ean;varEFi1e , NFi1e:PChar; CpF1ag,Fai1IfExists:Boo1ean;msg:string;ErrID , mbType:integer;beginEFi1e: 二 StrToPch ( ExistingFi1eName

14、 ) ;NFi1e: 二 StrToPch(NewFi1eName) ;if(Mode二 1) or (Mode二 3) then FaillfExists:二True e1se Fai1IfExists:二 Fa1se;CpF1ag: 二 CopyFi1e (EFi1e , NFi1e , Fai lI fExists) ;if not CpF1ag thenbeginErrID: 二 GetLastError 0 ;ExistingFi1eName:二 SysErrorMessage(ErrID)if Mode<2 thenbeginmsg: 二, CopyFi 1e Error!&

15、#39; ;mbType: 二OKOn1y+Exca1amation; MsgBox(msg ,mbType , ExistingFi1eName) ;endMode: 二 ErrIDendCopyF: 二 CpF1ag;endCopy F 函数参数说明如下 : 若拷贝操作成功,函数CopyF 返回 True ,失败函数 CopyF 返回 Fa1se 。ExistingFi1eName 是字符变量,输入时代表源文件名。若操作失败,则返回错误信息字符串(由于调用了API函数,在中文 Window s下该信息当然就是中文户NewFi leName是字符常量,代表目标文件名。Mode是整数变量,输入

16、时代表拷贝的方式。表示如果目标文件存在,将覆盖它,操作失败,将显示具有出错信息的信息框!1 表示如果目标文件存在,不覆盖它,操作失败,显示具有出错信息的信息框 !2 表示如果目标文件存在,将覆盖它,操作失败,不显示信息框!3 表示如果目标文件存在,不覆盖它,操作失败,不显示信息框!当拷贝操作失败时,Mode将返回出错代码。总之,灵活应用 API 函数可以使您的应用程序的界面与您使用的 Window s 的语言环境相当和谐地融为 体,摆脱掉De1phi 的痕迹,使您的程序给人以相当 "专业 " 的感觉。最后说明点,如果要使这些自定义的函数成为 " 全局 " 的,在其它单元中也能够使用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论