VF编程技巧大全.pdf

上传人:索**** 文档编号:76248479 上传时间:2023-03-08 格式:PDF 页数:22 大小:228.01KB
返回 下载 相关 举报
VF编程技巧大全.pdf_第1页
第1页 / 共22页
VF编程技巧大全.pdf_第2页
第2页 / 共22页
点击查看更多>>
资源描述

《VF编程技巧大全.pdf》由会员分享,可在线阅读,更多相关《VF编程技巧大全.pdf(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、梅子 3000问-技巧与问答严禁灌水第一遍主程序俗语说:万事开头难。一个应用软件,如果没有一个主程序(这像一棵树,没有树干,充其量好象只能是灌木了吧),没有一根主线,很难想象在编程时该怎么写代码?怎样控制程序的流程?(当然不是非得有主程序不可_)作为一个主程序,应该包括哪些内容或者说是哪些功能?鄙人以为:1、初始化环境(我习惯在Config.Fpw中设置)2、初始化系统变量3、初始化界面(这要根据需要而定),有些程序为了适应客户要求,需做些 LOGO 界面,问题有了(这问题可能也算是本论坛的精华问题之一吧):如何去掉 Visual FoxPro 的主窗口?首先:Modify Command C

2、onfig.fpw(建立资源文件)SCREEN=OFF ANSI=ON AUTOSAVE=ON CONSOLE=OFF DEBUG=OFF DELETED=ON DOHISTORY=OFF ESCAPE=OFF EXACT=ON EXCLUSIVE=OFF HELP=OFF NOTIFY=OFF OPTIMIZE=ON REFRESH=0,0 SAFETY=OFF STATUS=OFF STATUS BAR=OFF SYSMENU=OFF SYSFORMATS=ON TALK=OFF TITLE=蓝色雪狐基地(c)2001 VIEW=OFF 以上各个设置并非必须,我把以前一个程序的设置拷贝过来

3、的,由于时间关系(我写文章的热情一般最多保持半个小时:(),这里不作一一说明。其次,在你的主程序的第一语句写上(必须是第一语句,这样当程序运行时,不论机器速度如何,界面过渡会显得最完美):With _Screen.Visible=.F.(默认界面不可见).WindowState=2(当再次需要显示时最大化,当再次用_Screen.Visible=.T.恢复界面时,这样的效果最理想)EndWith这里要注意一个问题,就是 Config.Fpw 这个文件在项目中必须为包含。以前我指导他人时,有些人总说我这样还是会有默认界面一闪的痕迹。我觉得很奇怪?后来有一个网友把整个项目发给了我,我在分析后才知道

4、的。这可能是写程序的习惯问题:因为我有这么一个习惯,凡是应用程序中能包含的文件,我都包含进去,如客户需作特殊设置,提供一个数据表及一个接口,让客户自行设置界面、标题等等。(注意,图片可尽量不要包含在项目中,除非是标记性的,如你公司的徽标等等,切记!)启动时的效果跟其它软件一样,好了,那下面做什么呢?如何防止客户重复启动!由于编程的要求及其他方面的问题,客户无意中重复启动应用程序往往可能会造成不可预测的问题(当然,如果在编程时就考虑到数据共享、重复运行等因素,则客户完全可以多次打开一个应用软件,一边删、一边改)。经常在论坛的人大都知道两种以上的方法,我这儿呢一股脑儿全列出来,大家自己摸摸!如何防

5、止应用软件重复启动(1)在应用软件启动后,在硬盘上留下一个特定的文件。这种方法只要在启动时检测一下这个文件是否存在,作一个判断即可。存在缺陷:当应用软件由于不可预见的情况,非正常退出的情况下,该文件得不到及时删除,怎么办?我 KAO,想出来了,这个特定的文件为任一空的数据表,在应用软件中以独占方式找开它,那么当第二次再需打开会提示出错。如何防止应用软件重复启动(2)用 FindWindow 及 ShowWindowAsync API函数:Declare Long FindWindow In USER32.DLL String,String Declare Long ShowWindowAsyn

6、c In USER32.DLL Long,Long nTitle=安华镇农业税征收系统 hWnd=FINDWINDOW(,nTitle)IF hWnd!=0 ShowWindowAsync(hWnd,3)&请注意看这个API 函数的效果Clear Dlls Clear All Quit ENDIF 存在缺陷:无法判断窗口标题动态变动的情况如何防止应用软件重复启动(3)用程序特定的类及相关的特性综合判断,先用GetClassName 取得应用软件的类名,再根据类名查找是否有同样的窗体存在,以下是一个简单的相关示例:nCaption=蓝色雪狐基地(c)2001 Declare Long FindW

7、indowEx In user32 Long,Long,String,String&该函数可根据类查找窗口Declare Long GetClassName In user32 Long,String,Long Declare Long ShowWindowAsync IN user32 Long,Long hWnd=FindWindowEx(0,0,0,nCaption)Buffer=Space(32)nLen=GetClassName(hWnd,Buffer,32)hClass=Left(Allt(Buffer),nLen)hWnd=FindWindowEx(0,hWnd,hClass,n

8、Caption)IF hWnd 0 ShowWindowAsync(hWnd,3)Clea DLLS Quit ENDIF这是一个框框而已,你可以根据应用程序的各种不同的特征,来检测是否有窗体存在。存在缺陷:如何“设置”应用软件的特定的类信息我自己搞糊涂了,如何能在应用软件中设置特定的类信息,那才能做到“完美无缺”如何防止应用软件重复启动(4)好象是刚才论坛里搞出来的,是谁定的,说一声_ 内存映谢文件防止应用应用程序运行PUBLIC handle DECLARE INTEGER CreateFileMapping IN kernel32.DLL INTEGER hFile,;INTEGER l

9、pFileMappingAttributes,integer flProtect,;INTEGER dwMaximumSizeHigh,INTEGER dwMaximumSizeLow,;STRING lpName DECLARE INTEGER GetLastError IN kernel32.DLL DECLARE INTEGER CloseHandle IN kernel32.DLL INTEGER hObject szname=myonly handle=createfilemapping(0 xFFFFFFFF,0,4,0,128,szname)IF handle=0 WAIT WI

10、NDOW CreateFileMapping 失败-LastError:;+LTRIM(STR(getlasterror()RETURN ENDIF if handle=0 messagebox(创建内存映谢文件失败!,0,错误)return.f.else if GetLastError()=183=messagebox(该软件已经正在运行啊!,32,嘿嘿-不要做重复运动*(_)*)CLOSE all Clear dlls Clear events QUIT endif endif注在程序结束处别望了一定要:DECLARE INTEGER CloseHandle IN kernel32.DLL

11、 INTEGER hObject=CloseHandle(handle)clea event clea quit 以上经测试效果也相当不错,由于本人水平有限,对于用这种方式会不会造成多占用内存(应该说对于 CreateFileMapping API 函数的功能不清楚吧!),心里没底,反正大家再试试!,方法是多种多样的,大家再讨论讨论。如果有初始化的界面,那么接下去,主程序的最后应该是设置应用软件的路径、背景等设置,最后显示界面。今个活特多,不写了。对了,下面拷贝一个我刚写完的主程序,大家看看。_Screen.Visible=.F._Screen.WindowState=2 NoAgein(_S

12、creen.Caption)&这里就是检测是否已运行的模块Do Form Logo.scx&欢迎界面Public p p=.T.cTitle=_Screen.Caption Do Form Pass.scx With cTitle&登录对话框,cTitle 是登录对话框中界面中的一个特效的文字(组件化)If p=.F.Clea Events Quit EndIf Clea All On Error MessageBox(Message(),16,_Screen.Caption)On ShutDown Do E_end Set Default To Sys(5)+Sys(2003)+Set Re

13、source To SysFoxUser.DBF _Screen.Caption=蓝色雪狐基地(c)2001 Use SysUser.dbf Locate For AllTrim(Name)=PICTURE IF!Empty(AllTrim(Path).AND.File(Path)PIC=AllTrim(Path)_Screen.Picture=PIC Else _Screen.BackColor=RGB(28,118,202)EndIf Use _Screen.Visible=.T.第二章程序运行环境设置每一个应用程序,都有自己相应的环境。由于广大程序员一般都从FoxBase-FoxPro-

14、VFP 这样的编程经历,所以在程序编写时总是习惯的采用全局变量的方式来初始化程序的环境。如:Public nPath,nName,nID nPath=.nName=.nID=.等等。以方便在以后的各种模块中可随时调用所需的数据,殊不知这样给编程设置了一个很麻烦的障碍:1、在程序中由于数据操作频繁,变量定义较多,很可能一下子会搞不清变量名,无意中把其它数据赋予全局变量,改变了全局变量的值,导致在系统测试时问题百出,而且分析原因也比较麻烦。2、由于 VFP 系统在内存处理方面较弱,如在程序中采用了全局变量设置环境的方式,则在每一个模块进入、退出时无法清除内存,给系统的稳定性方面埋下隐患。我以前也跟

15、大家提过我自己在用的计划生育信息管理软件,用FoxPro2.5B For Windows 编译的,其中的模块化水平及数据处理方面有着非常精深的应用。其程序运行速度之快,数据处理之稳定,程序模块之精炼,就连我现在如果让我一个人仿制的话,我也没有太大的把握,而且他对于变量的应用可以说是到了出神入化之境地。我曾经反编译出来(应该说是不太道德),分析其中的一个数据随机查询模块,到现在我还搞不太清楚(所以有人经常说,分析一个程序还不如自己写一个来得省心、省力,不知为什么还有那么多人在关于反编译的问题?)。但到最后问题就来了,在进行大量的数据操作之后,系统经常性导致内存溢出(完全可以排除其它原因),非正常

16、退出。我也曾一度怀疑是操作系统或CPU频率等其它因素造成的,但我在调查了全市 35 个乡镇后,才怀疑是由于软件本身存在的缺陷。最后在一本技术资料上找到了真正的原因:FOXPro 在内存处理方面比较弱(由此想到国外的软件生产商为什么连在测试一个按钮时都一定要按100 下才算测试通过!我们测试了吗?)。所以我写程序模块时一定要先回到系统的初始状态,再重新开始。原因找出来了,如何解决?在每调用一个模块前先回到初始化环境设置。也就是说先清空内存变量,关闭所有打开的东东,再重新设置环境变量,系统就不再出现这种情况,但由于模块多,而且每调用一个模块都要清空设置,很麻烦!随它吧,小程序和一般数据处理不多的程

17、序肯定不会出现这种情况,但心理总觉不踏实。所以有一段时间我想尽方法忘记所有的函数,也就是说,我以一个初学者的眼光重新去看VFP的相关资料,直到最近才有了一个比较完美的解决方法。出于对软件高效、高速、精炼的要求,我在编程时都采用VFP 的_Screen 作为主界面,从不用自己的表单来代替(当然,如果你用自己的表单一样也可以采用以下的方法),是否可以用给_Screen 添加属必的方法来解决呢?答案在经测试后是可以的。而且更加方便:_Screen.AddProperty(nPath)_Screen.AddProperty(nName)_Screen.AddProperty(nID)_Screen.n

18、Path=C:在以后的各个模块中,你只要在一开始添加完所需的环境设置后,无论你怎么样都可以!CLEAR ALL CLOSE ALL CLEAR PROGRAM,再运行模块。编者按:我一直很不注意在这方面积累经验,并把它写出来与大家一起分享。我也一直想改变一下自己的惰性心理,可实在太难了打字员的活很难干的,根本静不下心来。最近大家对于VFP的前景、论坛的前景讨论很热烈,这是一个好的兆头。是一个上进的开始。我真心希望自己(包括各位高手)能静下心来,多写写体会、经验,不但是对自己写作、思路的一种有效的锻炼,而且对于广大的 VFP 爱好者来说,未心不是福音。我还有一个怪毛病就是写完了从不去看第二遍,如

19、有不当之处,与大家探讨。最好大家说说自己的想法,这类的文章该如何写,用怎样的思路写要出书也好,要上报有也,文章首先得经得起大家的评价。技巧篇 1:VFP 变量的魔术VFP 中进行对象引用VFP 最大的特点是它的灵活性。那么什么是灵活性呢?在编程语言的世界里,灵活性几乎就等于是简单易用的反义词。灵活性意味着编程语言把大量的工作留给你自己去定制,而不是预先为你做好它。那么被称为“数据库里的C 语言”的 VFP,其灵活性具体表现在哪里呢?今天我们就来共同探讨一个魔术“对象引用”。“对象引用”的概念什么是“对象引用”呢?在VFP6的时候,有时候在代码中需要输入很长的对象层次。比如,现在我们有一个表单f

20、orm1,表单上有一个页框pageframe1,页框的第一页上有一个表格grdView,现在,我要把第一列的标题设置为“第一列”,把背景色设置为灰色,正常情况下,我们不得不输入长长的对象层次如:thisform.pageframe1.page1.grdview.column1.header1.caption=”第一列“thisform.pageframe1.page1.grdview.column1.BackColor=RGB(192,192,192)使用 With,EndWith 结构可以让上面麻烦的输入变得简单点:WITH thisform.pageframe1.page1.grdview

21、.column1.header1.caption=第一列 .BackColor=RGB(192,192,192)ENDWITH 但是,如果代码中经常出现这样的情况,而且又不一定连贯的话怎么办呢?这时,我们就可以使用对象引用来简化输入:LOCAL oColumn 建立对表格中Column1 对象的引用oColumn=thisform.pageframe1.page1.grdview.column1 oColumn.header1.caption=”第一列“oColumn.BackColor=RGB(192,192,192)这里建立了一个oColumn 变量,然后把它指定为Column1 对象的引

22、用,这样,我们就可以像直接操作 Column1 对象那样操作oColumn 变量了。提醒:对 oColumn 的任何操作都会反映到Column1 对象上。对象引用普通变量看上去,这个所谓的“对象引用”变量跟普通变量好像没什么区别。那就让我们来证明一下。继续使用前面的例子,不过要把上述代码中的Local 改为 Public,然后把这些代码放入到表单的 Init 方法中去,运行这个表单后关闭它,看看发生了什么。“表单关不掉了!是不是死机了?让我按下Ctrl+Alt+Del试试,”“NO!不要这样!”,并没有死机,只是对象的引用在作怪而已。你可以打开调试器来看看究竟发生了什么事:在Local 窗口里

23、,表单的变量名还在,它的类型为“O”,可它的值已经为“.NULL.”,也就是说:表单事实上已经被释放了。而在下方的oColumn 变量则不同,它的类型为“O”,值却是“对象”!原因:任何在表单中建立的Public 变量在表单释放时都不会自动被释放。由于我们将 oColumn 对象声明为Public 了,所以oColumn 对象在关闭表单后没有被释放。从这里我们可以看到:利用对象引用的技术,就可以访问到表单上的任何一个对象,这是普通变量所不能达到的。传递对象引用让我们考虑一下对象引用的优点:对象引用是一种变量,因此你可以像传递一个普通变量那样传递它,包括将它传递到另一个表单;同时,对象引用又不止

24、是一种变量而已,它可以拥有自己的属性、事件、方法这意味着你甚至可以自由自在地向它添加任意多个自定义属性!现在让我们做个精彩的试验:1、建立一个表单Form1,表单上放上3 个文本框 Text1,Text2,Text3、一个 Custom 对象 Custom1、一个命令按钮cmdTransObj,在命令按钮的Click 事件中放入如下代码:Do form form2 with this.Custom1 Thisform.Refresh()2、建立一个模式表单Form2(把该表单的WindowType属性设置为“1模式”),像表单 1那样放上 3 个文本框,给表单建立一个自定义属性oFrm1Cus

25、t,在表单的Init 事件中输入以下代码:PARAMETER oCustom This.oFrm1Cust=oCustom WITH this.Text1.value=.oFrm1Cust.parent.Text1.value.Text2.value=.oFrm1Cust.parent.Text2.value.Text3.value=.oFrm1Cust.parent.Text3.value ENDWITH 3、在 Form2 上再添加一个命令按钮cmdReturn,其中放入以下代码:WITH THISFORM.oFrm1Cust.parent.Text1.value=.Text1.value

26、.oFrm1Cust.parent.Text2.value=.Text2.value.oFrm1Cust.parent.Text3.value=.Text3.value ENDWITH THISFORM.Release OK,现在运行Form1,在三个文本框中各输入一些数据,然后按下命令按钮。表单1 上的数据现在都传递到表单2 的三个文本框里了,现在再把表单2 里面的数据改动一下,然后按下命令按钮CmdReturn,表单 2 中所做的改动又反映到表单1 里了!你可以使用这个方法轻松地在表单间传递多个数据,而且由于可以直接在被调用表单中修改对象引用的数据,你甚至不需要返回任何参数想想难以从一个表

27、单返回数组的情况、从一个用CreateObject(表单类)的方法建立的表单中无法返回参数的情况你完全可以相信:这就是最棒的魔术!技巧篇 2:在 VFP 应用程序中调用MS-DOS应用程序在 VFP 数据库应用程序设计中,经常需要调用一些以前在MS-DOS 环境下运行的应用程序。这时候我们经常会想到RUN 命令。利用RUN 命令确实可以运行MS-DOS 应用程序,但是却会跳出一个令人讨厌的黑屏幕。利用本文介绍的方法调用MS-DOS 应用程序,就可以解决这个问题了。FUNCTION run PARAMETER doscmd DECLARE INTEGER WinExec IN win32api

28、AS run;STRING command,INTEGER param cmdstart=fullpath(FOXRUN.PIF)+/C fullcmd=cmdstart+doscmd retval=run(fullcmd,0)RETURN retval 在使用这个程序片段时,必须保证资源文件FOXRUN.PIF 能够在当前工作目录下找到(可以将其从 VFP 的根目录下拷贝到应用程序目录下,不要对其缺省设置进行任何改动)。在调用MS-DOS应用程序时,可以使用如下语句:DO RUN WITH DosProgramName 例如我们需要运行在当前工作目录下的MS-DOS 应用程序 TEST.EX

29、E,就可以使用如下语句:DO RUN WITH TEST.EXE 技巧篇3:优化FoxPro 在网络上的性能在工作站上安装FoxPro 的本地拷贝并只将需要共享的数据放在网络上.确保所有临时文件和工作文件都放在了本地驱动器上.例如,CONFIG.FP 文件(或,在 Windows product 中,CONFIG.FPW 文件)包括以下入口:tmpfiles=c:foxtemp sortwork=c:foxtemp progwork=c:foxtemp editwork=c:foxtemp 对于需要共享但又很少更新的文件(如包括州名及其缩写的STATES.DBF),在网络级设置其文件属性为只读

30、.例如,要在 Novell 网中设置STATES.DBF 属性为只读,你可以打入:FLAG states.dbf+RO STATES.DBF will now open faster.参考 Developers Guide,version 2.5,FoxPro in a Multiuser Environment Developers Guide,Professional Edition,Visual FoxPro version 3.0,Programming for Shared Access.技巧篇4:怎样在Visual FoxPro 中增加与去除网络联接概述在FoxPro for Wi

31、ndows 2.x 中用 Foxtools.fll 和在 Visual FoxPro 中用 DECLARE DLL 命令定义相关的Windows API(应用程序编程接口)函数,可以在FoxPro 中增加与去除网络联接.仅管 Visual FoxPro 仍然支持FOXTOOLS 库作为向后兼容,DECLARE 命令是调用DLL 函数的更好的方法.更多信息以下章节包括FoxPro 2.x 和 Visual FoxPro 用法约定.FoxPro 2.x 在 FoxPro 2.x 中用FOXTOOLS 库,按以下步骤添加和移除网络连接.用以下命令载入库:SET LIBRARY TO SYS(2004

32、)+FOXTOOLS.FLL ADDITIVE 注册你要调用的Windows API 函数.在目前情况下我们要用到的是WNetAddConnection()和WNetCancelConnection().addconn=RegFn(WNetAddConnection,CCC,I)delconn=RegFn(WNetCancelConnection,CI,I)要连接到网络设备,发布以下命令:=CallFn(addconn,SERVERSHARE,password,:)要断开网络连接,发布以下命令:=CallFn(delconn,:,0)Visual FoxPro 使用 DECLARE DLL 命

33、令定义要调用的DLL 函数:*-DLL 定义 Declare integer WNetAddConnection in WIN32API string,string,string Declareinteger Declare integer WNetCancelConnection in WIN32API String,integer*-添加网络连接=WNetAddConnection(SERVERSHARE,DriveLetter:)*-移除网络连接=WNetCancelConnection(DriveLetter:,0)以下信息提供了这两个API 调用的附加的参考材料.WNetAddCon

34、nection()WNetAddConnection()函数重定向指定的本地设备(磁盘或打印端口)为给定的共享设备或远程设备.它使用以下参数:lpszNetPathName 指向以null 结尾的字符串,该字符串指定了要连接的网络资源,如 ServerShare.注意:通常Novell 用户不使用:符号来引用服务器和目录.例如,不要试着用以下方法来引用一个目录:servervolume:mydirectory.而应使用以下方法:servervolumemydirectory lpszPassword 指向以null 结尾的字符串,该字符串指定了要用来进行连接操作的口令.该参数通常是与当前用户相

35、关的口令,如果该参数为null,那么使用缺省口令.如果该字符串为空,则不使用口令(使用一介空串作为占位符):=CallFn(addconn,SERVERSHARE,:)lpszLocalName 指向以null 结尾的字符串,该字符串指定了要被重定向的本地设备.所有 lpszLocalName 串(如 LPT1)是要区分大小写的.只使用了设备名A:到 Z:和 设备名LPT1 到 LPT3.WNetCancelConnection()WNetCancelConnection()函数取消网络连接.它使用以下参数:lpszName 指向以null 结尾的字符串,该字符串指定了重定向的本地设备名(如

36、LPT1:或 D:)或解除连接的远程网络资源。当该参数指定了一个重定向的本地设备,则该指定的设备的重定向被解除。若该参数指定了一个远程网络资源,那么只有该远程资源的连接而不是设备被解除。fForce 指定即使在连接上有打开的文件或任务时,是否任进行中断连接。如果该参数为FALSE,那么在有打开的文件或任务时,调用该函数失败.参考关于WNetAddConnection()和 WNetCancelConnection()API 调用的更多信息,请参阅Microsoft Windows Software Development Kit(SDK)程序员参考,第二卷:函数,.注意:API 调用返回值不会

37、被FoxPro for Windows 转换.关于 Visual FoxPro DECLARE 命令细节,请参阅DECLARE-DLL 帮助主题技巧篇 5:VFP 查询系统实现技巧六则用 VFP60可缺少的重要部分。而开发一个优秀的查询系统需要很多的应用技巧。由于工作原因,笔者经常开发查询系统模块,现将个人编程中总结的一些技巧介绍给大家,希望对读者的应用开发有所帮助。任务进度条的实现在查询的过程中,如果数据较多,需要用户等待时,查询系统中应有进度条加以显示,才能使系统更加具有规范性。具体实现方法如下:1.选择 VFP的系统选单“工具”中“选项”条,弹出“选项”窗口,在窗口中点击“ActiveX

38、控件”栏,添加任务进度栏控件Microsoft ProgressBar Control Version5.0(SP2)至 ActiveX 工具箱中。2.选定表单控件工具栏中“ActiveX 控件”,添加控件Microsoft ProgressBar Control Version6.0 至查询的表单Form1 中,并设置其属性Max 值为 1000。3.将下列代码添加到数据查询程序代码之后:for i=1 to 1000 for j=1 to 2000 j=j+1 endfor thisform.olecontrol1.value=i i=i+1 endfor messagebox(数据查询完

39、毕,OK!,0+64)thisform.release clear events 通过这样的设置,在查询时如果时间较长,查询进度条会为用户显示查询任务的运行情况。应用宏命令实现组合查询在组合查询中,需要查询的组合项通常很多,如果每项都使用不同的变量,编程会非常烦琐。笔者使用宏命令轻松实现查询组合条件,具体实现的方法是在查询按钮里加入如下代码:LOCAL cFilter,nCnt,cCondition FOR nCnt=1 to THISFORM.ControlCount IF TYPE(THISFORM.Controls(nCnt).controlSource)U THEN IF!EMPTY(

40、THISFORM.Controls(nCnt).ControlSource)AND;TYPE(THISFORM.Controls(nCnt).value)U THEN cCondition=THIS.Parent.parseCondition(THISFORM.Controls(nCnt).value,THISFORM.Controls(nCnt).controlSource)IF!EMPTY(cCondition)THEN cFilter=cFilter+AND cCondition ENDIF ENDIF ENDIF ENDFOR 通过这样的设置,虽然有多个查询条件,但查询的组合条件为cF

41、ilter,以后的应用只要对cFilter 进行处理即可。删除查询表中的空记录使用类查询(_dataquery.vcx)时,会在待查询表中的最后自动插入一条空记录,而在实际的 GRID 表格显示中,我们是不希望将空记录显示出来的。下面是解决此问题的详细步骤:1.在主程序或Form 对象的 Load 事件输入以下代码:SET DELETE ON 2.在查询结束代码后输入以下代码:Thisform.Refresh&刷新表单go bottom delete next 1&因为当前表被添加了一个空记录,在实际应用中应删除掉Thisform.Grid1.Column1.Setfocus go top T

42、hisform.grid1.refresh&删除一条记录后,应及时地刷新GRID 表实现中英文自动切换在用 VFP6.0 开发查询系统时,文本框对象和组合框对象应用得较多,在文本框中进行中英文的输入时,来回切换非常烦琐,所以笔者借助自定义子类,来实现中英文输入的自动切换。具体实现的步骤如下:1.点击 VFP6 系统选单栏“文件新建类”,启动“新类”对话框,填入类名为gsTextBox,并设置父类为TextBox,在“存储于”栏处输入存储的位置和名称,按“确定”键进入类设计器画面。2.新增一个属性,来作为对象是否启动中文输入法的控制码。通过系统选单栏“类新建属性.”,启动“新建属性”对话框,设置

43、一些属性,其中可视性设为public。3.最后设置 GotFocus 与 LostFocus 事件过程。Gotfocus Event 事件过程如下:If thischinese&中英文选择,thischinese 为逻辑量=imestatus(1)else=imestatus(0)endif Lostfocus Event 事件过程如下:=imestatus(0)至此,类已经定义完成,以后只要在设计表单时,通过表单控件“工具栏查看类添加.”把自定义类加入,并且设置“中英文选择”属性,即可实现中英文输入的自动切换。实现整条记录突出显示在用 VFP 设计一个查询应用系统时,信息的浏览是相当重要的功

44、能之一,通常采用的实现方法是用 Grid 对象来显示数据信息,但在使用过程中却存在一些不足,就是当使用者在记录之间移动时,只有获得焦点的那条记录的某一字段可以以不同于Grid 背景的颜色显示,很不醒目。笔者利用 Grid 对象,成功实现了当数据记录移动时,整条记录均用同一种颜色突出显示,即当数据记录移动时,用颜色动态变化显示相对光标所在的位置,设计步骤如下:首先定义一个Grid 对象,并设置好其属性,然后在其 AfterRowColChange事件过程中添加如下代码:LPARAMETERS nColIndex this.setall(dynamicbackcolor,iif(this.acti

45、verowrecn(),rgb(255,255,255),rgb(0,0,255),column)利用以上代码,我们就能达到当数据记录移动时,其相对的Row 显示动态颜色变化。在上面的设计中,我们首先使用了SetAll()方法设定 Grid 中的 Column 层次的DynamicBackColor(动态背景颜色属性),然后在第二个参数中使用了Grid 对象的 ActiveRow 反映相对的行数,若不等于记录编号时,则通过RGB(255,255,255)送出白色背景,若相对行等于记录编号时,则通过RGB(0,0,255)送出绿色背景色,而该颜色也可自行设定。用 Grid 模拟 Browse 窗

46、口可以将 Grid 结合在 Form 对象中,模拟成一个Browse 命令窗口,可以自由调整Form 大小,而 Grid 对象也会自动调整大小。实现方法如下:1.首先设定一个Form 对象,该对象必须保留其BorderStyle 为“3-可调边框”,这样可自由调整大小的边线属性,同时设定Resize 事件程序如下:Thisform.Grid1.Width=this.width Thisform.Grid1.Height=this.Height 2.设计一个 Grid 对象于 Form 对象中,并设定其属性如下:Width=Thisform.Width Height=Thisform.Heigh

47、t RecordSource 设为目前“数据环境”中所设定的工作区别名;Top 与 Left 均设为 0,表示该对象左上端坐标为0,0。这样,已经设定好的Grid 对象和 Browse 窗口一样,当对Form 对象进行大小调整时,对象的高度与宽度就可以随之调整。技巧篇 6:在 VFP 中实现 FTP 远程通信目前 VFP 仍然受到很多程序员的喜爱,特别是在中小规模的单机、局域网的前台应用软件开发中得到了广泛的使用。下面介绍一下如何使用FCREATE()、FWRITE()、FCLOSE()三个函数,在VFP 中实现 FTP远程传送文件的方法。FCREATE(cFileName,nFileAttr

48、ibute)函数的功能是创建并打开低级文件,其中参数cFileName 指定要创建的文件名称,在文件名前可以加入驱动器指示符和路径,如果没有包括驱动器指示符或路径,则在默认目录下创建该文件。NFileAttribute指定文件的属性,可选值为 0,7,0 为读写方式(默认值),其它参见 VFP 的随机帮助。返回值为数值型,创建成功返回文件句柄编号,可以把该编号赋给内存变量,从而可以在其他的低级文件函数用此内存变量访问该文件,如果不能创建文件,则返回-1。FWRITE(cFileHandle,cExpression,nCharactersWritten)函数的功能是向低级文件函数打开的文件或通信

49、端口写入字符串,其中参数nFileHandle 为文件句柄号,或要写入字符串的通信端口,cExpression 指定 FWRITE()函数写入字符表达式,nCharatersWritten为写入文件或通信端口的cExpression 中的字符的数目,返回值为0,表示操作失败。FCLOSE(,nFileHandle)函数的功能是刷新并关闭低级文件函数打开的文件或通信端口。MYFTP()的自定义函数的源代码,该函数首先调用已有的拨号连接,待用户确定线路连通后,创建 ftp 连接进行文件传输,完成后,关闭 ftp 通信端口,并提示用户断开拨号连接。function myftp*调用拨号网络中名为“我

50、的连接”的拔号连接,如用户为专线或局域网连接,删除该段run/N rundll32.exe rnaui.dllRnaDial 我的连接if messagebox(通信线路是否连通,开始传送文件吗?,1)=2 wait wind 取消传送文件,请断开连接线路!nowait return-1 endif*创建 FTP连接fp=fcreate(“ftpcp”,0)if fp=-1 wait wind 不能创建 FTP 连接,请检查网络配置 nowait return-1 endif*FTP 用户登录,192.168.0.1为远程 FTP 服务器的 IP ss=open 10.168.0.1+chr(

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 实施方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁