充分利用Windows API 扩展Delphi 函数

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

充分利用WindowsAPI扩展Delphi函数BorlandDelphi是与VisualBasic相似的可视化开发工具,但其功能比VB更加强大。例如,Delphi支持汇编语言和指针操作、全面支持WindowsAPI函数及外部DLL的使用,使得它具有更广泛的应用范围。即使用于编制些较小的应用程序,Delphi与VB相比看来不相上下,但由于Delphi是编译型的语言,其编译后的EXE文件可以真正脱离Delphi的环境独立运行,而VB生成的EXE文件离开了VB软件包的大堆DLL、VBX等文件可能会无法执行。而更重要的是,般用户往往并不真正知道自己开发的VB程序到底使用了哪些DLL类的文件,为了保证程序的正常运行,可能在最后的安装盘中包含了不少其实并不需要的文件。所以,般用户用VB很难开发出真正实用的软件,难怪有人说VB是先甜后苦Delphi实际上可以看作是VP(VisualPascal),所以它的易学性也可与VB媲美。今年发布的Delphi2.0可以为Windows町、WindowsNT开发32位程序,使得VB4.0的优势也不复存在。看来,在今后段时间内,将会有更多的人使用Delphi开发Windows应用程序。在DOS下开发过软件的人都知道int21h的重要。与此类似,Windows应用程序也是离不开WindowsAPI的,许多较底层的操作必须通过API函数来实现。为此,无论是C++、归还是Delphi都无一例外地支持API函数的调用,只是VB由于自身的特点所限制,仅支持部分API函数,而C++、Delphi则全面地支持API函数。相比之下,Delphi对API函数的调用最简捷,达到了与自身的内部函数几乎不分彼此的程度(只要求在interfaces中的user段中加上Windows即可,而这一步Delphi会自动为您做到),VB则相当繁琐。以调用获得Windows系统子目录的API函数为例,我们来看一下二者有什么不同:API函数格式的描述:WORDGetSystemDirectory(lpBuffer,nSize)VB4.0调用时首先要做如下申明:DeclareFunctionGetSystemDirectoryLibkerne132(ByVallpBufferAsString,ByValnSizeAsLong)AsLong然后才能使用:DimlpBufferAsString*255Size&二GetSystemDirectory(lpBuffer,255)而Delphi只需像调用内部函数那样:varlpBuffer:PChar;{API函数必须使用null结尾的字符串}Size:WORD;{返回的系统子目录字符串实际长度}begin1pBuffer:二StrA110c(255)才预留字符串长度}Size:二GetSystemDirectory(lpBuffer,255);end;由此可见,De1phi是可以充分利用WindowsAPI来扩展其自身功能的。当然,在大多数情况下,De1phi本身的函数功能已经足够使用了。但是,在有些情况下,需要使用API函数来实现些特殊的功能或完善De1phi的些功能。下面提供两个实例来说明这一点。、信息框函数MsgBox信息框是Windows应用程序中使用得较多的一种对话机制,它被广泛地用于提示、选择程序走向,是一个重要的程序控制手段。De1phi提供的信息框函数MessageD1g功能比较强,其最大优点是可以任意设定信息框的按钮(使用了集合类型),但其缺点也是很明显的,主要表现在标题字符串不能由用户自己设置!窗口弹出时寂静无声!按钮不能随着Windows的不同语言的版本显示不同的文字(例如无论在哪种语言版本下都只能显示OK仁Yes等英文字符)。这些优点和缺点都是由于它是De1phi自己实现的,而不是通过调用系统API函数实现的,故不能使用系统的语言环境、多媒体等资源。这样,所开发的程序在中文版中显示信息框时与周围的窗口显得极不协调。而VB在这方面却做得较好,所以我们按照凹的格式自定义一个信息框函数MsgBoxo下面的函数都假定是在TForm1中定义的。为了使用方便,我们首先在Interfaces段中定义些符号常量:const{第组:按钮内容选择}OKOn1y二0;{仅显示确定按钮}OKCance1二1;{显示确定:f日取消按钮}AbortRetryIgnore二2;{中J上川重试放弃}YesNoCance1二3;{是否川取消}YesNo二4;{是和否}RetryCance1=5;{重试取消}{第二组:显示图标选择}Critica1二16;{STOP图标}Question二32;{7图标}Exca1amation二48;{!图标}Information二64;{勺图标}{第三组:缺省指针位置(激活状态)}Defau1tButton1二0;{第按钮}Defau1tButton2二256{第二按钮}Defau1tButton3二512{第三按钮}{第四组:信息框方式}App1icationModa1二0;{应用方式}SysternModa1二4096;{系统方式}然后,建立函数MsgBox,由于API函数中使用的字符串必须以mull结尾,所以使用了另一个自定义的函数StrToPch来将Pasca1类型字符串转换成为以mull结尾的字符串。参数说明msg为信息框标题变量;mbType为规定信息框类型的变量,使用方式是mbType二按钮内容+图标+缺省指针+信息框方式。便如您想得到一个含确定和取消两个按钮、带?图标、缺省指针指向第二个按钮(W'取消勺的信息框,那么就该这样设置.mbType:二OKCance1+Question+Defau1tButton2;tit1e为信息框中显示文本的变量。MsgBox的返回值与MessageD1g8lJ数的返回值完全一样,例如返回mrYes表示Yes或是按钮被按下,rnrNo表示No或否按钮被按下等等。可参考MessageD1g8lJ数的说明。下面即是在De1phi中通过调用WindowsAPI的GetActiveWindows函数和MessageBox函数来实现MsgBox函数的代码:{信息框函数}functionTForm1.MsgBox(msg:string;mbType:Word;tit1e:string):Word;varhWnd:HWND1pText,!pCaption:Pchar;begin1pText:二StrToPch(tit1e);1pCaption二StrToPch(msg);hWnd:二GetActiveWindowO;MsgBox:二MessageBox(hWnd,1pText,1pCaption,mbType);end{将Pasca1字符串转换成null结尾字符串函数}functionTForm1.StrToPch(Str:string):PChar;vara:PCharbegina:二StrAlloc(Length(Str)+1);StrPCopy(a,Str);StrToPch:二a;end二、文件拷贝函数CopyFDe1phi提供了组比较完整的文件操作函数,用它们可以完成几乎全部的文件操作,但恰恰缺少拷贝文件的函数。而文件拷贝的使用应该说是比较常用的,因此,笔者利用几个API函数定义了个功能很强的文件拷贝函数CopyF。该函数代码如下(请注意·该函数中调用了上述的MsgBox函数):{文件拷贝函数}functionTForm1.CopyF(varExistingFi1eName:string;constNewFi1eName:string;varMode:lnteger):Boo1ean;varEFi1e,NFi1e:PChar;CpF1ag,Fai1IfExists:Boo1ean;msg:string;ErrID,mbType:integer;beginEFi1e:二StrToPch(ExistingFi1eName);NFi1e:二StrToPch(NewFi1eName);if(Mode二1)or(Mode二3)thenFai1IfExists:二Truee1seFai1IfExists:二Fa1se;CpF1ag:二CopyFi1e(EFi1e,NFi1e,FailIfExists);ifnotCpF1agthenbeginErrID:二GetLastError0;ExistingFi1eName:二SysErrorMessage(ErrID);ifMode2thenbeginmsg:二,CopyFi1eError!';mbType:二OKOn1y+Exca1amation;MsgBox(msg,mbType,ExistingFi1eName);endMode:二ErrIDendCopyF:二CpF1ag;endCopyF函数参数说明如下:若拷贝操作成功,函数CopyF返回True,失败函数CopyF返回Fa1se。ExistingFi1eName是字符变量,输入时代表源文件名。若操作失败,则返回错误信息字符串(由于调用了API函数,在中文Windows下该信息当然就是中文)0NewFi1eName是字符常量,代表目标文件名。Mode是整数变量,输入时代表拷贝的方式·。表示如果目标文件存在,将覆盖它,操作失败,将显示具有出错信息的信息框!1表示如果目标文件存在,不覆盖它,操作失败,显示具有出错信息的信息框!2表示如果目标文件存在,将覆盖它,操作失败,不显示信息框!3表示如果目标文件存在,不覆盖它,操作失败,不显示信息框!当拷贝操作失败时,Mode将返回出错代码。总之,灵活应用API函数可以使您的应用程序的界面与您使用的Windows的语言环境相当和谐地融为体,摆脱掉De1phi的痕迹,使您的程序给人以相当专业的感觉。最后说明点,如果要使这些自定义的函数成为全局的,在其它单元中也能够使用,需将函数标题复制到Unit1单元interfaces的type段中(应删除TForml.几个字符);然后在调用函数的其他单元imp1ementation中的user段中加入Unit1;在函数名前要加上Forml.几个字符,如在Unit2单元中调用MsgBox就应写成Forml.MsgBox0(以上所有函数均在Windows95中文版使用DelphiDesktopV2.0调试通过)

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功