📄 充分利用windows api扩展delphi函数.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>充分利用Windows API扩展Delphi函数</title>
</head>
<body stylesrc="index.html" bgcolor="#EEEEFF">
<p> <font size="+1" color="#cc0000"></p>
<p></font><font color="#cc0000" size="4">充分利用Windows API扩展Delphi函数</font><big><big><big>
<br>
</big></big></big><font size="3">
袁卫国</font><big><big><big>
<br>
</big></big></big></p>
<hr width="100%">
<p><big><big><big><br>
</big></big></big><font size="3"> Borland Delphi是与Visual Basic相似的可视化开发工具,但其功能比VB更加强大。<br>
例如,Delphi支持汇编语言和指针操作、全面支持Windows API函数及外部DLL的使<br>
用,使得它具有更广泛的应用范围。即使用于编制一些较小的应用程序,Delphi与VB<br>
相比看来不相上下,</font><big><big><big> </big></big></big><font size="3">但由于Delphi是编译型的语言,其编译后的EXE文件可以真正脱<br>
离Delphi的环境独立运行,而VB 生成的EXE文件离开了VB软件包的一大堆DLL、<br>
VBX等文件可能会无法执行。而更重要的是,一般用户往往并不真正知道自己开发<br>
的VB程序到底使用了哪些DLL一类的文件,为了保证程序的正常运行,可能在最后的<br>
安装盘中包含了不少其实并不需要的文件。所以,一般用户用VB很难开发出真正实<br>
用的软件,难怪有人说VB是"先甜后苦"。Delphi实际上可以看作是VP(Visual
Pascal),所<br>
以它的易学性也可与VB媲美。今年发布的Delphi2.0可以为Windows 95、Window
s NT<br>
开发32位程序,使得VB 4.0的优势也不复存在。看来,在今后一段时间内,将会有更多<br>
的人使用Delphi开发Windows应用程序。在DOS下开发过软件的人都知道int
2lh的重要。<br>
与此类似,Windows应用程序也是离不开Windows API的,许多较底层的操作必须通过<br>
API函数来实现。为此,无论是C++、VB还是Delp hi都无一例外地支持API函数的调<br>
用,只是VB由于自身的特点所限制,仅支持部分API函数,而C++、Delphi则全面地支持<br>
API函数。相比之下,Delphi对API函数的调用最简捷,达到了与自身的内部函数几乎<br>
不分彼此的程度(只要求在interfaces中的user段中加上Windows即可,而这一步Delphi<br>
会自动为您做到),VB则相当繁琐。以调用获得Windows系统子目录的API函数为例<br>
,我们来看一下二者有什么不同:API函数格式的描述:WORD
GetSystemDirectory(lpBuffer,<br>
nSize)</font><big><big><big> <br>
</big></big></big><font size="3"> VB 4.0调用时首先要做如下申明:</font><big><big><big>
<br>
</big></big></big><font size="3"> Declare Function GetSystemDirectory
Lib"kernel32"(ByVal</font><big><big><big> <br>
</big></big></big><font size="3">lpBuffer As String, ByValnSize As Long)As Long</font><big><big><big>
<br>
</big></big></big><font size="3"> 然后才能使用:</font><big><big><big>
<br>
</big></big></big><font size="3"> Dim lpBuffer As String *255</font><big><big><big>
<br>
</big></big></big><font size="3">
Size&=GetSystemDirectory(lpBuffer,255)</font><big><big><big> <br>
</big></big></big><font size="3"> 而Delphi只需像调用内部函数那样:</font><big><big><big>
<br>
</big></big></big><font size="3"> var lpBuffer:PChar;{API函数必须使用null结尾的字符串}</font><big><big><big>
<br>
</big></big></big><font size="3"> Size:WORD;{返回的系统子目录字符串实际长度}</font><big><big><big>
<br>
</big></big></big><font size="3"> begin lpBuffer:=StrAlloc(255);{预留字符串长度}</font><big><big><big>
<br>
</big></big></big><font size="3">
Size:=GetSystemDirectory(lpBuffer,255);end;</font><big><big><big> <br>
</big></big></big><font size="3"> 由此可见,Delphi是可以充分利用Windows
API来扩展其自身功能的。当然,在大<br>
多数情况下,Delphi本身的函数功能已经足够使用了。但是,在有些情况下,需要使<br>
用API函数来实现一些特殊的功能或完善Delphi的一些功能。下面提供两个实例<br>
来说明这一点。</font><big><big><big> <br>
</big></big></big><font size="3"> 一、信息框函数MsgBox</font><big><big><big>
<br>
</big></big></big><font size="3"> 信息框是Windows应用程序中使用得较多的一种对话机制,它被广泛地用于提<br>
示、选择程序走向,是一个重要的程序控制手段。Delphi提供的信息框函数MessageDlg<br>
功能比较强,其最大优点是可以任意设定信息框的按钮(使用了集合类型),但其缺<br>
点也是很明显的,主要表现在标题字符串不能由用户自己设置;窗口弹出时寂静无声<br>
;按钮不能随着Windows的不同语言的版本显示不同的文字(例如无论在哪种语言版</font><big><big><big><br>
</big></big></big><font size="3">本下都只能显示"OK"、"Yes"等英文字符)。这些优点和缺点都是由于它是Delphi<br>
自己实现的,而不是通过调用系统API函数实现的,故不能使用系统的语言环境、<br>
多媒体等资源。这样,所开发的程序在中文版中显示信息框时与周围的窗口显得<br>
极不协调。而VB在这方面却做得较好,所以我们按照VB的格式自定义一个信息<br>
框函数MsgBox。下面的函数都假定是在TForml中定义的。为了使用方便,我们首<br>
先在Interfaces段中定义一些符号常量:</font><big><big><big> <br>
</big></big></big><font size="3"> const</font><big><big><big> <br>
</big></big></big><font size="3"> {第一组:按钮内容选择}</font><big><big><big>
<br>
</big></big></big><font size="3"> OKOnly=0;{仅显示"确定"按钮}</font><big><big><big>
<br>
</big></big></big><font size="3"> OKCancel=1;{显示"确定"和"取消"按钮}</font><big><big><big>
<br>
</big></big></big><font size="3"> AbortRetryIgnore=2;{"中止""重试""放弃"}</font><big><big><big>
<br>
</big></big></big><font size="3"> YesNoCancel=3;{"是""否""取消"}</font><big><big><big>
<br>
</big></big></big><font size="3"> YesNo=4;{"是"和"否"}</font><big><big><big>
<br>
</big></big></big><font size="3"> RetryCancel=5;{"重试""取消"}</font><big><big><big>
<br>
</big></big></big><font size="3"> {第二组:显示图标选择}</font><big><big><big>
<br>
</big></big></big><font size="3"> Critical=16;{"STOP"图标}</font><big><big><big>
<br>
</big></big></big><font size="3"> Question=32;{"?"图标}</font><big><big><big>
<br>
</big></big></big><font size="3"> Excalamation=48;{"!"图标}</font><big><big><big>
<br>
</big></big></big><font size="3"> Information=64;{"i"图标}</font><big><big><big>
<br>
</big></big></big><font size="3"> {第三组:缺省指针位置(激活状态)}</font><big><big><big>
<br>
</big></big></big><font size="3"> DefaultButton1=0;{第一按钮}</font><big><big><big>
<br>
</big></big></big><font size="3"> DefaultButton2=256{第二按钮}</font><big><big><big>
<br>
</big></big></big><font size="3"> DefaultButton3=512{第三按钮}</font><big><big><big>
<br>
</big></big></big><font size="3"> {第四组:信息框方式}</font><big><big><big>
<br>
</big></big></big><font size="3"> ApplicationModal=0;{应用方式}</font><big><big><big>
<br>
</big></big></big><font size="3"> SystemModal=4096;{系统方式}</font><big><big><big>
<br>
</big></big></big><font size="3"> 然后,建立函数MsgBox,由于API函数中使用的字符串必须以mull结尾,所以使用了另<br>
一个自定义的函数StrToPch来将Pascal类型字符串转换成为以mull结尾的字符串。参<br>
数说明 msg为信息框标题变量; mbType为规定信息框类型的变量,使用方式是"mbType=<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -