VFP与Excel交互编程_第1页
VFP与Excel交互编程_第2页
VFP与Excel交互编程_第3页
VFP与Excel交互编程_第4页
VFP与Excel交互编程_第5页
已阅读5页,还剩192页未读 继续免费阅读

下载本文档

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

文档简介

1.VFP与Excel交互编程VFP(Visual Foxpro)是一种关系型数据库管理系统,由于其强大的数据处理能力及良好的兼容性,使其成为数据库应用程序开发人员强有力的工具而广为使用; 而Excel则是一个优秀的电子表格处理软件,在兼容性、操作界面、公式运算、图表等方面有着独到的优势,成为广大办公应用人员必备的首选软件。上述两种软件在各自的应用领域均得到了广泛的应用,同时上述两种软件还具有良好的交互编程能力,为两者相辅相成、取长补短奠定了良好的基础。 本文将结合实例介绍的方法,在VFP中除了使用OLE技术外,还可使用DDE技术与外部服务器进行数据交换,本文主要讲解VFP中使用OLE技术与Excel交换数据,Excel中借助内置的VBA使用VFP提供的Application对象来调用VFP中的一些功能。其功能可简述如下:VFP数据表“学生成绩.DBF”中含“学号、姓名、语文、数学”等字段,示例程序将从Excel工作簿“VFP交互.XLS”的工作表“查询”中用“条件”区域(一般为一个矩形区中的数据,该区域名称指定为“条件”,数据形如“语文60”、“数学90”等)中的数据作为查询的条件,用“连接条件”区域(一般为一个单元格,其值为“or”或者“and”)来获取组合“条件”的逻辑连接,并将该连接信息的内容以工作表的形式显示出来,然后调用VFP中针对给定表的SQL查询来找出给定条件的记录并显示到Excel中。下列程序均在VFP 6.0与Excel 2000中调试通过。 Excel驱动VFP Excel内置的VBA语言(Visual Basic For Application)为Excel功能的扩展提供了便利的手段,用户可使用该语言直接驱动VFP完成数据检索等功能。程序首先生成一个VFP对象,然后用VFP的DoCmd方法执行VFP搜索命令串,其搜索结果再借助于VFP的DataToClip方法拷贝至剪切板,最后VBA将其粘贴至工作表的正确位置,为了每次运行时能将结果插入到工作表中,依次对操作的工作表以“搜索结果”、“搜索结果1”等进行编号。 Sub exceluseFox () Dim oFox As Object 声明oFox为一个对象 Dim SCommand As String SQL对应的命令串变量 Dim cell As Variant Dim choice As String Dim join As String Dim first As Boolean Dim found As Boolean 搜索结果标志,若表单中有搜索结果,则为真 Set oFox = CreateObject(“VisualFoxPro .Application”) 启动VFP,生成VFP对象 Sheets(“查询”).Select 选择对应的工作表“查询” join = Range(“连接条件”) 在单一表格中的一个元素,其值为and或者or choice = “” 置连接串初值为空 first = True 一般情况下连接串后需要加上逻辑连接符and 或 or,首次例外 For Each cell In Range(“条件”) 产生连接条件,形成where语句的连接逻辑串 If first Then choice = choice + cell 形成第一次出现的where子句后的字符串 first = False 修改首次进入标志,以后的连接均需要加上逻辑连接符 Else choice = choice + “ ” + join + “ ” + cell join的值是and或者是or End If Next cell Sheets.Add 产生新的工作表单 找一个不重复的工作表名 found = False 工作表名中前四个汉字有没有“搜索结果”的标志变量 n = 1 For Each cell In Worksheets If InStr(1, cell.Name, “搜索结果”) 0 Then found = True 找到对应的工作表 If n 名称-定义”来完成对给定区域名称的设定,这个名称可以在VBA中访问,如前述中的“条件”和“连接条件”。 VFP使用Excel OLE(Object Linking and Embedding)对象链接与嵌入,是Windows应用程序间相互传递和共享数据的一种有效方法。VFP借助于OLE不仅可共享其他应用程序的数据,而且还能以对象方式直接控制其他应用程序的运行,从而进一步扩展VFP的功能。VFP支持直接在程序中创建、使用和控制OLE对象,实现OLE自动化。作为OLE客户,VFP与作为OLE服务器的Excel具有良好的编程接口,下述程序段用OLE方式实现所要求的功能。程序首先生成一个Excel的OLE对象OleApp以便对其进行操作,然后利用OLE功能从Excel表单中获取欲查询的条件,并控制Excel生成新的唯一的工作表,通过找寻当前操作的所有工作表达到名称的唯一,VFP的查询结果仍然使用剪切板的方式传递至Excel工作表中。 local condition,where1,first,scommand,cell,newsheet,found1,n OleApp=CreateObject(“Excel.Application”) & 打开Excel,产生OLE对象 OleApp.Application.Caption=“VFP交互编程” & 指定标题栏名称 OleApp.Application.Visible=.T. & 置Excel可见 OleApp.Application.WorkBooks.Open(“d:vfpVFP交互.xls”) & 打开Excel工作簿,用户也可以修改连接条件或者查询条件 where1=“” &保存SQL中where子句的变量 first=.t. &置首次进入“查询”工作表中“条件”区域标志 found1=.f. n=1 DO WHILE .T. WITH OleApp.Application nAnswer = MessageBox(“开始搜索?”, 32+4, “搜索指定数据”) &显示搜索信息 IF (.NOT. (nAnswer=6) & 如按下“Yes”按钮,则开始搜索,反之退出 EXIT ENDIF .Sheets(“查询”).Select & 选取示例中的对应工作表 condition=.range(“连接条件”).value &得到“连接条件”区域中的逻辑连接符 for each cell in .range(“条件”).value &将表单区域内所有单元的数据拼接以形成where的连接逻辑串 If first Then Where1 = Where1 + cell &首次进入时where子句中串前不需要逻辑连接符 first = .f. &置非首次进入标志 Else Where1=Where1 +“ ”+condition +“ ”+ cell &这里condition的值取and或者or EndIf next for .Sheets.Add & 新建一工作表单 &下面的for each子句是用于找寻有否对应的工作表,若有则在搜索结果1、搜索结果2搜索结果n中得到最大的n值以便产生下一个比n大1的新工作表“搜索结果&(n+1)” for each newsheet in .worksheets if “搜索结果”$ n=max(val(subset(space(2),9,2),n) &得到最大的n值 found1=.t. &置找到工作表中前四个汉字是“搜索结果”的工作表 endif next for if not found1 .ActiveSheet.Name =“搜索结果1” & 指定工作表单的名称 else .=“搜索结果”+str(n+1,2) &得到唯一的工作表 endif SCommand = “SELECT * FROM d:vfp学生成绩表 WHERE ”+ALLTrim(where1) + “INTO CURSOR TEMP” & 形成VFP查询命令串 &Scommand & 执行VFP命令串 _VFP.DataToClip(“TEMP”, , 3) & 将搜索结果以文本方式拷贝至剪切板 .Range(“a1: a1”).Select & 指向拷贝目标区域左上角单元 .ActiveSheet.Paste & 粘贴搜索结果 ENDWITH ENDDO OleApp.Quit & 关闭Excel,保存更新后的工作簿文件 结束语 VFP与Excel的交互能力是很强的,用户可以使用VFP处理数据库的一些运算,如插入、排序、合并、选择等,将结果交由Excel中进行一些后期的处理,甚至可以将一些抽取数据的条件直接加入到Excel的条件区域中,由VFP来读取条件区域进行数据的筛选。总之,只要能充分利用好各自的优点,理解交互的接口方法,就一定能够编写出较适用的程序,满足实际工作的需要。2.Visual Foxpro生成任意打印字段报表的实现存在的问题 - 用VFP生面的执行程序后,对于用户所需的某一数据库的任意字段组合报表,就显得不是那样运用自如。因为,一方面软件开发时,无法考虑到日后用户所需报表的所有格式。另一方面,由于所设计好的报表格式文件已编译成可执行文件,即使修改了.FRX和.FRT文件结构内容,也需在开发环境下重新编译,对用户来讲是不实现的。例如需一份员工名单及一个空栏位,进行签名或登记某一证件号码的问题就比较难解决。 - 解决方案 - 运用VFP与Excel 的交换数据及在VFP中全面控制Excel的操作(即自动服务器),就可以很好的解决这一问题。关于如何控制Excel,一方面可以通过Excel的帮助文件的VBA语法,另一方面也有相当多的文章关于控制Excel的语法。值得注意的是:1、为提高效率,所有有关计算、小计、合计最好在VFP中进行,并写在相应的记录内;2、由于是两个软件,如果在有大量数据逐一插入Excel单元格时,显得速度较慢,所以如果数据量较大,应直接用VFP的数据表导出为Excel格式,再由VFP在后台控制Excel打开,并指定的Excel格式文件进行修改文档标题、列的名称、网格线型,以及根据纸张大小计算各列宽和调整字体大小。 - 实现办法 - 利用SQL结构化语言的Select生成一个数据表 - 在Select字段时,可以利用一个表单Form1加入两个列表框,一个列表框列出所有数据表的字段,另一个为空,利用鼠标双击或拖拉至空的列表框里,为选定一字段(此时第一个含有所有字段的列表框中,将不再显示被拖拉走的字段,而在另一列表中显示),并生成相应的Select查询程序段。 - 在本实例中为:form1中含有一个list1和edit1和两个按钮 Form1.ini public a,b,c,d,f,g a=SELECT b= c= FROM bn INTO CURSOR myquery d= f=0 g=0 list1.dblclick if len(alltrim(b)=0 b=b+thisform.list1.value else b=b+,+thisform.list1.value endif d=a+b+c thisform.edit1.refresh for mm=1 to thisform.list1.listcount if thisform.list1.selected(mm) thisform.list1.removeitem(mm) endif endfor command1.click * 执行所生成的select语句 SELECT &B FROM BN INTO CURSOR MYQUERY sele myquery command2.click* 调用excel my=createobject(excel.application) my.visible=.t. *如果在交付用户时可以将其设置成 .F. my.workbooks.add select myquery f=fcount() g=reccount() goto top for l=1 to g for i=1 to f fieldname=field(i) * 对于要生成中文的列位标题可以用一英文字段名称与中文名称对应的参数库来解决 my.activeworkbook.sheets(1).cells(l,i).value=myquery.&fieldname endfor skip endfor * 如果要增加一空列可以用 my.activesheet.columns(f+1).insert语法 * 设置页眉 my.activesheet.pagesetup. centerheader (centerfooter)=” xxx”3.VFP右键功能用其他语言做的软件,其TEXT、EDIT、COMBOX等都有右键功能, 即一按右键就会在其对象旁弹出一个这样的菜单(见右图),惟独VFP做的程序没有,您说气不气人。 下面就是该功能实现的方法: 先介绍几个需要用到常数,这里所说的常数,是系统默认的常数,也就是在编辑时会以蓝色显示的字符。这些常数是:常数名 所代表的含义_med_undo 撤消(U)_med_cut 剪切(T)_med_copy 复制(C)_med_paste 粘贴(P)_med_clear 删除(D)_med_slcta 全选(A)第一步我们在COMMAND窗口打: MODIFY COMMAND remouse.prg 在编辑窗内输入如下内容:DEFINE POPUP popRight SHORTCUT RELATIVE FROM MROW(),MCOL() DEFINE BAR _med_undo OF popRight PROMPT 撤消(U) DEFINE BAR 2 OF popRight PROMPT - DEFINE BAR _med_cut OF popRight PROMPT 剪切(T) DEFINE BAR _med_copy OF popRight PROMPT 复制(C) DEFINE BAR _med_paste OF popRight PROMPT 粘贴(P) DEFINE BAR _med_clear OF popRight PROMPT 删除(D) DEFINE BAR 7 OF popRight PROMPT - DEFINE BAR _med_slcta OF popRight PROMPT 全选(S) ACTIVATE POPUP popRight 存盘退出。 这样我们就建立了一个名为remouse.prg的文件。 接下来我们就可在需要右键功能对象的RinhtClick事件里写入: do remouse 好了,我们的程序也有右键功能了,就这么简单,不信您试试。 这个方法唯一不足的是,必须在每个需要右键功能的对象里都写上: do remouse这一句,但比起借用外部程序来达到这个目的,我觉得还是这个方法好。4.VFP访问外部数据源的几种方法Visual FoxPro(以下简称VFP)是微软公司Visual系列开发工具中的一种。在VFP 6.0中,与外部数据源进行数据交换的方式有导入导出数据、远程视图、SQL Pass Through以及数据升迁等几种方式。其中,导入导出数据是完成对静态数据(或文本)的数据转换,而对动态数据源的访问则主要是使用Windows中的ODBC技术。本文介绍在设计客户/ 服务器体系结构的应用程序时,如何使用VFP来实现与外部数据源的数据交换。 导入导出数据 导入导出数据是指利用VFP的内部转换机制由一个静态文件生成一个指定的新文件的过程。可以被转换的文件类型主要有:Excel文件、Paradox数据库文件、Lotus电子表格中的数据以及其他形式的文本文件。 导入数据是指将一个外部文本转换成一个新的DBF文件。例如:将A盘上的一个abc.xls文件转换成Example数据库下的CBA.DBF表,可用如下命令完成: import from a:abc.xls Database Example Name cba Type xls 导出数据是指将一个打开的VFP数据表(DBF)文件转换成一个其他形式的外部文件,同时还可以使用范围或条件子句对被复制的数据进行过滤。例如: use cba copy to abc for fieldl=“aaaaa”,type xls 上述代码将CBA.DBF文件中满足条件“fieldl=,“aaaaa”的记录转换为Excel文件abc.xls。 远程视图 远程视图以视图的方式通过ODBC与外部数据源建立连接,从而达到访问或更新外部数据源的目的。它是客户/服务器体系结构中经常运用的一种访问外部数据源的方法。在VFP中建立远程视图的方式主要有两种:采用VFP中的视图向导和程序方式。在使用程序方式时,一般需要两个步骤: 通过ODBC与外部数据源建立一个命名连接; 定义视图。 建立一个远程视图后,用户就可以像调用一个自由表一样来使用它。在使用远程视图的过程中,应当注意以下几个问题: 远程视图只能对后台数据库进行查询、插入、更新和删除等操作,不能进行数据定义。它的事务处理只限于对本地数据库的操作,而无权管理后台数据库。 尽量不要使用远程视图对后台数据库进行多表插入的操作,以免产生非法NULL值或引起数据不一致。 尽量使用SQL语句完成对后台数据库的操作,以免在执行时产生二义性。 例如,我们要访问一个远程SQL Server上的my-db库中的my-tab表,可由如下的语句来完成(假定sql为已在ODBC中建立的与SQL Server 服务器的my-db数据库相连的数据源): create connection example datasource sql userid usr-1 password sqlpass /*建立一个名为example的与SQL Server服务器的连接*/ create sql view my-r-view remote connection example as select * from my -tab /*建立一个名为my-r-view的远程视图。该视图依赖于example连接,视图访问的是my-tab表中的所有字段。*/ use my-r-view /*打开my-r-view视图*/ browse /*浏览视图中的内容*/ SQL Pass Through技术 SQL Pass Through(以下简称SPT)技术能使用户直接访问ODBC函数,并把SQL语句发送给服务器执行。与远程视图相比,它能够更直接地控制后台服务器上的数据库: 可以使用服务器的特有功能,如存储过程和基于服务器的内部函数等; 可使用服务器所支持的SQL扩展功能,而且可进行数据定义、服务器管理和安全性管理等; 对后台数据库的更新、删除和插入等操作拥有更多控制权,对远程事务也拥有更多控制权。 该方法的缺点在于不能使用图形化的设计器,而且必须在命令窗口或程序中直接输入SQL命令。 在SPT中经常使用的函数主要有:连接管理函数(如SQLCONNECT、SQLSTRINGCONNECT、SQLDISCONNECT等)、SQL语句的执行和控制函数(如SQLEXEC、SQLMORERESULTS、SQLCOMMIT、SQLROLLBACK等)。下面给出一个应用实例来说明这些函数的使用及其参数的设定: Store sqlstringconnect(“dsn=sql; uid=usr-1; pwd=sqlpass”)to gnconnhandlc /*将连接函数的返回值存入连接句柄gnconnhandlc中) If gnconnhandlc=0 /*当连接句柄gnconnhandlc的值小于或等于零时,表明连接失败*/ Messagebox(“建立连接失败”,16,“SQL Connect Error”) Else Sqlexec(gnconnhandlc,“select*from my-tab”) /*当连接成功后向服务器发送一个查询语句,并将返回的结果集存入一个临时表中*/ Sqlcancle(gnconnhandlc) /*停止sqlexec()的执行*/ Sqldisconnct(gnconnhandlc) /*断开与sql数据源的连接*/ Brow /*浏览返回的结果集*/ Endif 数据库升迁 利用VFP的数据库升迁向导,可以实现将本地数据库转换为远程数据库的功能。借助这一功能,我们可以很方便地将使用VFP建立的数据库、表和视图等从本地系统迁移到另一个远程服务器上。虽然在VFP中,该方法只限于对SQL Server和Oracle Server的访问,但通过使用SQL Pass Through函数在服务器上创建远程表,然后再用VFP建立远程视图访问这些服务器上的表,我们就可以为任何远程ODBC数据源建立客户/服务器模式的应用程序。 有了这一功能,可以极大地方便客户/服务器应用程序的开发工作。用户可先在单机上开发应用程序,待基本功能模块设计调试成功后,再运用数据库升迁的方法将本地数据库、表转换到远程服务器上,并把本地视图升迁为远程视图,继而将开发调试工作的重点转移到客户机与服务器间的数据通信以及数据库服务器的管理等方面。5.在VFP中调用其他应用程序的实用技术- 在用VFP进行应用程序设计中,经常需要调用其他的应用程序。这时候我们立即会想到RUN命令。使用RUN命令只需知道应用程序的文件名及其路径即可。 - 下面的示例是以最大化方式启动Windows目录下的图画板程序并同时打开c:windowsBubbles.bmp 文件: - RUN/n3 C:WindowsPbrush.exe c:windowsBubbles.bmp 。RUN命令的参数用法可以参考Visual FoxPro的帮助文件。 但是令人失望的是,在实际开发时我们常常无法确定所需要启动的应用程序的文件名及其安装的路径。比如我们需要启动用户机器上的浏览器并连接到某一个网址,该机器可能安装的是IE,也可能是NetScape,还有可能是其他的浏览器软件,安装的路径更是无从确定。下面给出我在工作中找到的两种解决方法,这两种方法都是通过Win32 API函数来解决问题,因此其解决思路也可以用到其他编程语言中去。 - (一)从注册表中获取被调用软件的名称及路径。 - 我们只需要提供被调用的软件所处理的文件类型(由文件扩展名来确定),即可通过查找注册表中该软件注册的可以处理的文件类型的数据项来得到该软件的文件名及安装路径 。 *主函数PROCEDURE lookregParameterfiletype& 文件类型* 申明要用到的API 函数DECLARE Integer RegOpenKey IN Win32API ;Integer nHKey, String cSubKey,Integer nResultDECLARE Integer RegCloseKey IN Win32API ;Integer nHKeyDECLARE Integer RegQueryValueEx IN Win32API ;Integer nHKey, String lpszValueName, Integer dwReserved,;Integer lpdwType, String lpbData,Integer lpcbData#DEFINE HKEY_CLASSES_ROOT -2147483648#DEFINE C_EXTNOFOUND_LOC 查找失败!LOCAL cExtn,cAppKey,cAppName,nErrNumLOCAL oReg,regfilecAppKey = cAppName = nCurrentKey = 0nErrNum =GetAppPath(filetype,cAppKey,cAppName)* 确保去掉可执行文件后的参数 (如: C:EXCELEXCEL.EXE /e)IF ATC(.EXE,m.cAppName) #0m.cAppName= ALLTRIM(SUBSTR(m.cAppName,1,ATC(.EXE,m.cAppName)+3)IF ASC(LEFT(cAppName,1)=34& 去掉长文件名前多出的字符m.cAppName = SUBSTR(m.cAppName,2)ENDIFENDIFRetu LOWER(m.cAppName)ENDPROC* 打开注册表PROCEDURE OpenKeyLPARAMETER cLookUpKeyLOCAL nSubKey,nErrCodenSubKey = 0m.nRegKey = HKEY_CLASSES_ROOTnErrCode = RegOpenKey(m.nRegKey,m.cLookUpKey,nSubKey)nCurrentKey = m.nSubKeyENDPROC* 关闭注册表PROCEDURE CloseKey=RegCloseKey(nCurrentKey)nCurrentKey =0 ENDPROC* 查询注册表PROCEDURE GetKeyValueLPARAMETER cValueName,cKeyValueLOCAL lpdwReserved,lpdwType,lpbData,lpcbData,nErrCodeSTORE 0 TO lpdwReserved,lpdwTypeSTORE SPACE(256) TO lpbDataSTORE LEN(m.lpbData) TO m.lpcbDatam.nErrCode=RegQueryValueEx(nCurrentKey,m.cValueName,;m.lpdwReserved,lpdwType,lpbData,lpcbData)m.cKeyValue = LEFT(m.lpbData,m.lpcbData-1)ENDPROCPROCEDURE GetAppPathLPARAMETER cExtension,cExtnKey,cAppKeyLOCAL cOptNamecOptName = * 得到要打开的文档在注册表中的名称=OpenKey(.+m.cExtension)=GetKeyValue(cOptName,cExtnKey)=CloseKey()RETURN GetApplication(cExtnKey,cAppKey)ENDPROC* 得到应用程序的安装路径及名称PROCEDURE GetApplicationPARAMETER cExtnKey,cAppKeyLOCAL cOptNamecOptName = =OpenKey(m.cExtnKey+ShellOpenCommand)=GetKeyValue(cOptName,cAppKey)=CloseKey()ENDPROC- 在使用这段程序时,使用如下格式的语句: - fullpath=lookreg(doc) & 返回打开doc 文件的软件名及安装路径 - 灵活运用该段程序,可以大大丰富我们在软件中的表现能力,例如应用软件的菜单中都有一项“关于本软件”的功能,该功能调用的表单一般用来显示有关系统资源及软件版权的信息。如果我们要给其中的公司信息加上超文本链接使其可以直接访问公司主页。就可以在显示公司信息的 Label控件的 Click 事件中使用如下语句: fullpath=lookreg(htm)Ifallt(fullpath)= =messagebox( 无法找到浏览器以浏览公司主页!,64,)retuElsefullpath=subst(fullpath,1,rat(.,fullpath)-1)+space(2)+;RUN/n3&fullpathEndif- (二)利用Windows 的文档关联特性直接调用。 - 我们知道,Windows是一种面向文档的操作系统。当我们双击某个文件时,Windows就会自动启动与该文件相关联的应用程序来对文件进行处理。在这个过程中Windows主要使用了一个名为ShellExecute 的Win32 API函数。我们可以通过这个函数来直接调用其他程序,彻底抛弃Run 命令的方式。 Function shellstartParametersdocumentname* 声明ShellExecute函数 DECLARE INTEGER ShellExecute IN shell32.DLL INTEGER HWND,; STRING lpszOP, ; STRING lpszFile, ; STRING lpszParams, ; STRING lpszDir, ; INTEGER fsshowcmd * 指定ShellExecute函数的输出指向Windows桌面DECLARE INTEGER GetDesktopWindow IN win32api HWND = GetDesktopWindow() *指定操作命令为打开方式lpszOP = open * 指定ShellExecute操作的对象为 documentnamelpszFile = documentnamelpszParams = * 指定ShellExecute的缺省目录为c:templpszDir = c:temp fsshowcmd = 0* 执行ShellExecute命令 LNRETURN = ShellExecute(HWND, lpszOP, lpszFile, lpszParams, lpszDir,fsshowcmd) Retu调用方式:=shellstart()& 连接到网站=shellstart(“c:windowsscript.doc”)&打开c:windowsscript.doc文件6.VFP中常用WIN32API函数调用事例我们在VFP编程时,为了弥补VFP本身功能的不足,常常会用到WIN32API函数来对VFP的功能行扩展,例如取得系统信息、对注册表进行操作等,但是由于WIN32API函数是C+的数据结构形式,在调用时与VFP的数据格式有所不同,因此在 调用时往往会产生问题,而目前的一些资料所介绍的大都是VB、DELPHI等语言如何调用,对VFP如何调用介绍的比较少,更缺少具体的调用事例,下面我分几次介绍在VFP如何调用WIN32API函数,并就一些常用的WIN32API函数作一介绍,由于本人水平有限,所介绍的内容,仅供您参考,也欢迎您在我的请您留言中共同 探讨: .一、VFP中调用WIN32API函数的格式 VFP中调用WIN32API函数的命令主要是: DECLARE - DLL CLEAR DLLS 1.DECLARE - DLL 它用于注册外部 Windows 32 位动态链接库 ( .DLL ) 中的 一个函数。 语法: DECLARE cFunctionType FunctionName IN LibraryName AS AliasName .cParamType1 ParamName1, cParamType2 ParamName2, . 说明: cFunctionType 指定该函数返回值的类型,其类型代码如下: SHORT16 位整数 INTEGER32 位整数 SINGLE 32 位浮点数 DOUBLE 64 位浮点数 STRING 字符串 FunctionName 指定要注册使用的32位函数名。注意 FunctionName 区分大小写。 如果该函数名与Visual FoxPro的保留字相同,应使用AS参数另起 别名。 IN LibraryName 指定该函数所在的外部动态链接库文件名,如果LibraryName为: WIN32API时,VFP将依次查找KERNEL32.DLL、GDI32.DLL、 USER32.DLL、MPR.DLL及ADVAPI32.DLL等动态链接库文件名。 AS AliasName 当API函数的名称与Visual FoxPro的保留字相同时,另取 AliasName别名,另取的别名是不区分大小写的。 cParameterType1 ParamName1, cParameterType2 ParamName2, . 指定传递给被调用的32位.DLL函数的参数类型及参数名称。其类 型代码如FunctionType,如果要以传址方法传递参数则应在参数 名前加上。 2.CLEAR DLLS 释放所有利用DECLARE - DLL命令所装入的动态链接库。.一旦申明WIN32API函数成功,就可以和一般函数一样用 ?xxx()、=xxx() 来调用。 .下面以具体事例谈谈win32api在Vfp中的运用: 1.利用win32api函数获取指定磁盘的卷标: Stor 0 to C_var,C_cd,C_qf C_Var=c: DECLARE INTEGER GetVolumeInformation IN Win32API STRING , STRING , INTEGER,; INTEGER , INTEGER , INTEGER , STRING , INTEGER xx=GetVolumeInformation(C_Var,20,C_var,C_cd,C_qf,0,0) CLEAR DLLS &释放所有利用DECLARE - DLL命令所装入的动态链接库。 xx0 获取指定磁盘的卷标成功,反之则未成功。 C_var=指定磁盘的卷标,是个十进制的数值,与我们在DOS下看到的16进制不同。 C_cd=系统规定的文件名每一部分的长度,是个十进制的数值。 C_qf=文件名的大小写标志,是个十进制的数值。 .怎么样很简单吧,我们可以把获取的磁盘卷标,用来加密我们的软件,这样 我们的 软件就具有防拷贝的功能了。7.在VFP中怎样做出象IE4中的那样的浮动按钮先放上按钮,将按钮的visible设为.f.,再用一image(其中图形与按钮一样)放在按钮的位置,在图片的mousemove事件中写入将按钮visible设为.t.的语句,在表单的mousemove事件中写入将按钮visible设为.f.的语句。 8.使用 SQL.我正在设法将一个表与多个表建立左联接。当查询需要的所有表打开时,该查询可以工作。但是当有些表没有打开时,就会产生错误。而且当所有表打开时,尽管没有产生错误信息,但结果不正确。为什么? 当试图建立一个表对多个表的左联接时,您也许使用了下面语句,该语句用表别名进行了“自联接”。您的 SQL 语句可能如下所示: select one.firstname as first, one.lastname as second,; two.firstname as third, two.lastname as fourth; from FirstTable; left outer join SecondTable one;left outer join SecondTable two; left outer join ThirdTable; on ThirdTable.ThirdID=FirstTable.FirstID; on Two.SecondID=FirstTable.FirstID; on one.SecondID=FirstTable.FirstID; order by 4,3,2,1 这里的查询试图将临时表 One、Two 以及 ThirdTable 左联接到 FirstTable 上,但是没有得到预期的效果。查询分析器从最里面的联接开始分析查询(在上面语句中为 left outer join ThirdTable),但是不能定位 FirstTable 表,该表名字位于此语句的上面。因此,如果没有打开表,您就会发现错误,如 SQL: Column ThirdID 没有找到,同时输出也不正确。当表打开时,couple.coupleid 绑定到外部(非SQL)临时表 couple 的字段上。此查询也是合法的,但是得不到预期的效果。为了避免此错误,并能够得到正确结果,可以使用类似如下的 SQL 语句: select one.firstname as first, one.lastname as second,; two.firstname as third, two.lastname as fourth; from (FirstTable; left outer join SecondTable One; on one.SecondID = FirstTable.FirstID); left outer join SecondTable Two; on Two.SecondID = FirstTable.FirstID);left outer join ThirdTable; on ThirdTable.ThirdID = FirstTable.First

温馨提示

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

评论

0/150

提交评论