《2022年VF编程技巧大全 .pdf》由会员分享,可在线阅读,更多相关《2022年VF编程技巧大全 .pdf(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、梅子 3000问- 技巧与问答严禁灌水第一遍主程序俗语说:万事开头难。一个应用软件,如果没有一个主程序(这像一棵树,没有树干,充其量好象只能是灌木了吧), 没有一根主线, 很难想象在编程时该怎么写代码?怎样控制程序的流程?(当然不是非得有主程序不可_ )作为一个主程序,应该包括哪些内容或者说是哪些功能?鄙人以为:1、 初始化环境(我习惯在Config.Fpw中设置)2、初始化系统变量3、初始化界面(这要根据需要而定),有些程序为了适应客户要求,需做些 LOGO 界面,问题有了(这问题可能也算是本论坛的精华问题之一吧):如何去掉 Visual FoxPro 的主窗口?首先: Modify Com
2、mand Config.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 = 蓝
3、色雪狐基地(c) 2001 VIEW = OFF 以上各个设置并非必须,我把以前一个程序的设置拷贝过来的,由于时间关系(我写文章的热情一般最多保持半个小时:( ) ,这里不作一一说明。其次,在你的主程序的第一语句写上(必须是第一语句,这样当程序运行时,不论机器速度如何,界面过渡会显得最完美) :With _Screen .Visible = .F. (默认界面不可见).WindowState = 2 (当再次需要显示时最大化,当再次用_Screen.Visible = .T.恢复界面时,这样的效果最理想) EndWith这里要注意一个问题,就是 Config.Fpw 这个文件在项目中必须为包含
4、。以前我指导他人时,有些人总说我这样还是会有默认界面一闪的痕迹。我觉得很奇怪?后来有一个网友把整个项目发给了我,我在分析后才知道的。这可能是写程序的习惯问题:因为我有这么一个习惯,凡是应用程序中能包含的文件,我都包含进去, 如客户需作特殊设置,提供一个数据表及一名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 22 页 - - - - - - - - - 个接口,让客户自行设置界面、标题等等。(注意,图片可尽量不要包含在项目中,除非是标记性的,如你公司的徽标等等,切记! )
5、启动时的效果跟其它软件一样,好了,那下面做什么呢?如何防止客户重复启动! !由于编程的要求及其他方面的问题,客户无意中重复启动应用程序往往可能会造成不可预测的问题 (当然, 如果在编程时就考虑到数据共享、重复运行等因素,则客户完全可以多次打开一个应用软件,一边删、一边改)。经常在论坛的人大都知道两种以上的方法,我这儿呢一股脑儿全列出来,大家自己摸摸!如何防止应用软件重复启动(1)在应用软件启动后,在硬盘上留下一个特定的文件。这种方法只要在启动时检测一下这个文件是否存在,作一个判断即可。存在缺陷: 当应用软件由于不可预见的情况,非正常退出的情况下,该文件得不到及时删除,怎么办?我 KAO ,想出
6、来了, 这个特定的文件为任一空的数据表,在应用软件中以独占方式找开它,那么当第二次再需打开会提示出错。如何防止应用软件重复启动(2)用 FindWindow 及 ShowWindowAsync API函数:Declare Long FindWindow In USER32.DLL String, String Declare Long ShowWindowAsync In USER32.DLL Long, Long nTitle = 安华镇农业税征收系统 hWnd = FINDWINDOW(, nTitle) IF hWnd != 0 ShowWindowAsync(hWnd, 3) & 请注
7、意看这个API 函数的效果Clear Dlls Clear All Quit ENDIF 存在缺陷:无法判断窗口标题动态变动的情况如何防止应用软件重复启动(3)用程序特定的类及相关的特性综合判断,先用GetClassName 取得应用软件的类名,再根据类名查找是否有同样的窗体存在,以下是一个简单的相关示例:nCaption = 蓝色雪狐基地(c) 2001 Declare Long FindWindowEx In user32 Long, Long, String, String & 该函数可根据类查找窗口Declare Long GetClassName In user32 Long, St
8、ring, 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, nCaption) IF hWnd 0 ShowWindowAsync(hWnd, 3) Clea DLLS Quit ENDIF这是一个框框而
9、已,你可以根据应用程序的各种不同的特征,来检测是否有窗体存在。存在缺陷: 如何“设置”应用软件的特定的类信息我自己搞糊涂了,如何能在应用软件中设置特定的类信息,那才能做到“完美无缺”如何防止应用软件重复启动(4)好象是刚才论坛里搞出来的,是谁定的,说一声_ 内存映谢文件防止应用应用程序运行PUBLIC handle DECLARE INTEGER CreateFileMapping IN kernel32.DLL INTEGER hFile, ; INTEGER lpFileMappingAttributes,integer flProtect, ; INTEGER dwMaximumSize
10、High, 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 WINDOW CreateFileMapping 失败- LastError: ; + LTRIM(STR(ge
11、tlasterror() RETURN ENDIF if handle=0 messagebox( 创建内存映谢文件失败!,0, 错误 ) return .f. else if GetLastError()=183 =messagebox(该软件已经正在运行啊!,32, 嘿嘿 -不要做重复运动*(_)*) CLOSE all Clear dlls Clear events QUIT endif endif名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 22 页 - - -
12、 - - - - - - 注在程序结束处别望了一定要:DECLARE INTEGER CloseHandle IN kernel32.DLL INTEGER hObject =CloseHandle(handle) clea event clea quit 以上经测试效果也相当不错,由于本人水平有限, 对于用这种方式会不会造成多占用内存(应该说对于 CreateFileMapping API 函数的功能不清楚吧!),心里没底,反正大家再试试!,方法是多种多样的,大家再讨论讨论。如果有初始化的界面,那么接下去,主程序的最后应该是设置应用软件的路径、背景等设置,最后显示界面。今个活特多,不写了。对
13、了,下面拷贝一个我刚写完的主程序,大家看看。_Screen.Visible = .F. _Screen.WindowState = 2 NoAgein(_Screen.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 名师资料总结 - - -精品资料
14、欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 22 页 - - - - - - - - - On Error MessageBox(Message(), 16, _Screen.Caption) On ShutDown Do E_end Set Default To Sys(5)+Sys(2003)+ Set Resource To SysFoxUser.DBF _Screen.Caption = 蓝色雪狐基地(c) 2001 Use SysUser.dbf Locate For AllTrim(Na
15、me) = 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-VFP 这样的编程经历, 所以在程序编写时总是习惯的采用全局变量的方式来初始化程序的环境。如:Public nPath, nName, nID n
16、Path = . nName = . nID = . 等等。以方便在以后的各种模块中可随时调用所需的数据,殊不知这样给编程设置了一个很麻烦的障碍:1、在程序中由于数据操作频繁,变量定义较多,很可能一下子会搞不清变量名,无意中把其它数据赋予全局变量,改变了全局变量的值,导致在系统测试时问题百出,而且分析原因也比较麻烦。2、由于 VFP 系统在内存处理方面较弱,如在程序中采用了全局变量设置环境的方式,则在每一个模块进入、退出时无法清除内存,给系统的稳定性方面埋下隐患。我以前也跟大家提过我自己在用的计划生育信息管理软件,用FoxPro2.5B For Windows 编译的,其中的模块化水平及数据处
17、理方面有着非常精深的应用。其程序运行速度之快,数据处理之稳定,程序模块之精炼,就连我现在如果让我一个人仿制的话,我也没有太大的把握,而且他对于变量的应用可以说是到了出神入化之境地。我曾经反编译出来(应该说是不太道德),分析其中的一名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 22 页 - - - - - - - - - 个数据随机查询模块,到现在我还搞不太清楚(所以有人经常说,分析一个程序还不如自己写一个来得省心、省力,不知为什么还有那么多人在关于反编译的问题?)。但到
18、最后问题就来了,在进行大量的数据操作之后,系统经常性导致内存溢出(完全可以排除其它原因),非正常退出。我也曾一度怀疑是操作系统或CPU频率等其它因素造成的,但我在调查了全市 35 个乡镇后,才怀疑是由于软件本身存在的缺陷。最后在一本技术资料上找到了真正的原因:FOXPro 在内存处理方面比较弱(由此想到国外的软件生产商为什么连在测试一个按钮时都一定要按100 下才算测试通过!我们测试了吗?)。所以我写程序模块时一定要先回到系统的初始状态,再重新开始。原因找出来了,如何解决?在每调用一个模块前先回到初始化环境设置。也就是说先清空内存变量,关闭所有打开的东东,再重新设置环境变量,系统就不再出现这种
19、情况,但由于模块多,而且每调用一个模块都要清空设置,很麻烦!随它吧,小程序和一般数据处理不多的程序肯定不会出现这种情况,但心理总觉不踏实。所以有一段时间我想尽方法忘记所有的函数,也就是说,我以一个初学者的眼光重新去看VFP的相关资料,直到最近才有了一个比较完美的解决方法。出于对软件高效、高速、精炼的要求,我在编程时都采用VFP 的_Screen 作为主界面,从不用自己的表单来代替(当然,如果你用自己的表单一样也可以采用以下的方法),是否可以用给_Screen 添加属必的方法来解决呢?答案在经测试后是可以的。而且更加方便:_Screen.AddProperty(nPath) _Screen.Ad
20、dProperty(nName) _Screen.AddProperty(nID) _Screen.nPath = C: 在以后的各个模块中,你只要在一开始添加完所需的环境设置后,无论你怎么样都可以!CLEAR ALL CLOSE ALL CLEAR PROGRAM ,再运行模块。编者按 :我一直很不注意在这方面积累经验,并把它写出来与大家一起分享。我也一直想改变一下自己的惰性心理,可实在太难了打字员的活很难干的,根本静不下心来。最近大家对于VFP的前景、论坛的前景讨论很热烈,这是一个好的兆头。是一个上进的开始。我真心希望自己(包名师资料总结 - - -精品资料欢迎下载 - - - - - -
21、 - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 22 页 - - - - - - - - - 括各位高手)能静下心来,多写写体会、经验,不但是对自己写作、思路的一种有效的锻炼,而且对于广大的 VFP 爱好者来说,未心不是福音。我还有一个怪毛病就是写完了从不去看第二遍,如有不当之处,与大家探讨。最好大家说说自己的想法,这类的文章该如何写,用怎样的思路写要出书也好,要上报有也,文章首先得经得起大家的评价。技巧篇 1:VFP 变量的魔术VFP 中进行对象引用VFP 最大的特点是它的灵活性。那么什么是灵活性呢?在编程语言的世界里,灵活性几乎就
22、等于是简单易用的反义词。灵活性意味着编程语言把大量的工作留给你自己去定制,而不是预先为你做好它。那么被称为“数据库里的C 语言”的 VFP,其灵活性具体表现在哪里呢?今天我们就来共同探讨一个魔术“对象引用”。“对象引用”的概念什么是“对象引用”呢?在VFP6的时候,有时候在代码中需要输入很长的对象层次。比如,现在我们有一个表单form1 ,表单上有一个页框pageframe1 ,页框的第一页上有一个表格grdView ,现在,我要把第一列的标题设置为“第一列”,把背景色设置为灰色,正常情况下,我们不得不输入长长的对象层次如:thisform.pageframe1.page1.grdview.c
23、olumn1.header1.caption = ”第一列“thisform.pageframe1.page1.grdview.column1.BackColor = RGB(192,192,192) 使用 With ,EndWith 结构可以让上面麻烦的输入变得简单点:WITH thisform.pageframe1.page1.grdview.column1 .header1.caption = 第一列 .BackColor = RGB(192,192,192) ENDWITH 但是,如果代码中经常出现这样的情况,而且又不一定连贯的话怎么办呢?这时,我们就可以使用对象引用来简化输入:LOC
24、AL oColumn 建立对表格中Column1 对象的引用oColumn = thisform.pageframe1.page1.grdview.column1 oColumn.header1.caption = ”第一列“oColumn.BackColor = RGB(192,192,192) 这里建立了一个oColumn 变量,然后把它指定为Column1 对象的引用,这样,我们就可以像直接操作 Column1 对象那样操作oColumn 变量了。提醒:对 oColumn 的任何操作都会反映到Column1 对象上。名师资料总结 - - -精品资料欢迎下载 - - - - - - - -
25、 - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 22 页 - - - - - - - - - 对象引用普通变量看上去,这个所谓的“对象引用”变量跟普通变量好像没什么区别。那就让我们来证明一下。继续使用前面的例子,不过要把上述代码中的Local 改为 Public,然后把这些代码放入到表单的 Init 方法中去,运行这个表单后关闭它,看看发生了什么。“表单关不掉了!是不是死机了?让我按下Ctrl+Alt+Del试试, ”“NO!不要这样!”,并没有死机,只是对象的引用在作怪而已。你可以打开调试器来看看究竟发生了什么事:在Local 窗口里,表单
26、的变量名还在,它的类型为“O”,可它的值已经为“.NULL.”,也就是说:表单事实上已经被释放了。而在下方的oColumn 变量则不同,它的类型为“O”,值却是“对象”!原因:任何在表单中建立的Public 变量在表单释放时都不会自动被释放。由于我们将 oColumn 对象声明为Public 了,所以oColumn 对象在关闭表单后没有被释放。从这里我们可以看到:利用对象引用的技术,就可以访问到表单上的任何一个对象,这是普通变量所不能达到的。传递对象引用让我们考虑一下对象引用的优点:对象引用是一种变量,因此你可以像传递一个普通变量那样传递它,包括将它传递到另一个表单;同时,对象引用又不止是一种
27、变量而已,它可以拥有自己的属性、事件、方法这意味着你甚至可以自由自在地向它添加任意多个自定义属性!现在让我们做个精彩的试验:1、建立一个表单Form1,表单上放上3 个文本框 Text1, Text2, Text3、一个 Custom 对象 Custom1 、一个命令按钮cmdTransObj ,在命令按钮的Click 事件中放入如下代码:Do form form2 with this.Custom1 Thisform.Refresh() 2、建立一个模式表单Form2( 把该表单的WindowType属性设置为“ 1模式” ),像表单 1那样放上 3 个文本框,给表单建立一个自定义属性oFr
28、m1Cust ,在表单的Init 事件中输入以下代码:PARAMETER oCustom This.oFrm1Cust = oCustom WITH this .Text1.value = . oFrm1Cust.parent.Text1.value 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 22 页 - - - - - - - - - .Text2.value = . oFrm1Cust.parent.Text2.value .Text3.value = . oF
29、rm1Cust.parent.Text3.value ENDWITH 3、在 Form2 上再添加一个命令按钮cmdReturn ,其中放入以下代码:WITH THISFORM . oFrm1Cust.parent.Text1.value = .Text1.value . oFrm1Cust.parent.Text2.value = .Text2.value . oFrm1Cust.parent.Text3.value = .Text3.value ENDWITH THISFORM.Release OK,现在运行Form1,在三个文本框中各输入一些数据,然后按下命令按钮。表单1 上的数据现在都
30、传递到表单2 的三个文本框里了,现在再把表单2 里面的数据改动一下,然后按下命令按钮CmdReturn ,表单 2 中所做的改动又反映到表单1 里了!你可以使用这个方法轻松地在表单间传递多个数据,而且由于可以直接在被调用表单中修改对象引用的数据,你甚至不需要返回任何参数想想难以从一个表单返回数组的情况、从一个用CreateObject( 表单类 )的方法建立的表单中无法返回参数的情况你完全可以相信:这就是最棒的魔术!技巧篇 2:在 VFP 应用程序中调用MS-DOS应用程序在 VFP 数据库应用程序设计中,经常需要调用一些以前在MS-DOS 环境下运行的应用程序。这时候我们经常会想到RUN 命
31、令。利用RUN 命令确实可以运行MS-DOS 应用程序,但是却会跳出一个令人讨厌的黑屏幕。利用本文介绍的方法调用MS-DOS 应用程序,就可以解决这个问题了。FUNCTION run PARAMETER doscmd DECLARE INTEGER WinExec IN win32api AS run ; STRING command, INTEGER param cmdstart = fullpath(FOXRUN.PIF)+ /C fullcmd = cmdstart+ doscmd retval = run(fullcmd, 0) RETURN retval 在使用这个程序片段时,必须保
32、证资源文件FOXRUN.PIF 能够在当前工作目录下找到(可以将其从 VFP 的根目录下拷贝到应用程序目录下,不要对其缺省设置进行任何改动)。在调用MS-DOS应用程序时,可以使用如下语句:DO RUN WITH DosProgramName 例如我们需要运行在当前工作目录下的MS-DOS 应用程序 TEST.EXE,就可以使用如下语句:DO RUN WITH TEST.EXE 技巧篇3:优化FoxPro 在网络上的性能在工作站上安装FoxPro 的本地拷贝并只将需要共享的数据放在网络上. 确保所有临时文件和工作文件都放在了本地驱动器上. 例如 , CONFIG.FP 文件(或, 在 Wind
33、ows product 中, CONFIG.FPW 文件 ) 包括以下入口 : 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 22 页 - - - - - - - - - tmpfiles = c:foxtemp sortwork = c:foxtemp progwork = c:foxtemp editwork = c:foxtemp 对于需要共享但又很少更新的文件(如包括州名及其缩写的STATES.DBF), 在网络级设置其文件属性为只读 . 例如 , 要在 Nov
34、ell 网中设置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
35、Windows 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 LIBR
36、ARY TO SYS(2004)+FOXTOOLS.FLL ADDITIVE 注册你要调用的Windows API 函数 . 在目前情况下我们要用到的是WNetAddConnection() 和WNetCancelConnection(). addconn=RegFn(WNetAddConnection,CCC,I) delconn=RegFn(WNetCancelConnection,CI,I) 要连接到网络设备, 发布以下命令 : =CallFn(addconn,SERVERSHARE,password,:) 要断开网络连接 , 发布以下命令 : =CallFn(delconn,:,0)
37、Visual FoxPro 使用 DECLARE DLL 命令定义要调用的DLL 函数 : *- DLL 定义 Declare integer WNetAddConnection in WIN32API string,string,string Declareinteger Declare integer WNetCancelConnection in WIN32API String,integer *- 添加网络连接=WNetAddConnection(SERVERSHARE, , DriveLetter:) *- 移除网络连接=WNetCancelConnection(DriveLette
38、r:,0) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 22 页 - - - - - - - - - 以下信息提供了这两个API 调用的附加的参考材料. WNetAddConnection() WNetAddConnection() 函数重定向指定的本地设备(磁盘或打印端口) 为给定的共享设备或远程设备. 它使用以下参数 :lpszNetPathName 指向以null 结尾的字符串 ,该字符串指定了要连接的网络资源,如 ServerShare. 注意 : 通常Nov
39、ell 用户不使用: 符号来引用服务器和目录. 例如 , 不要试着用以下方法来引用一个目录 : servervolume:mydirectory. 而应使用以下方法: servervolumemydirectory lpszPassword 指向以null 结尾的字符串 ,该字符串指定了要用来进行连接操作的口令. 该参数通常是与当前用户相关的口令,如果该参数为null ,那么使用缺省口令. 如果该字符串为空,则不使用口令(使用一介空串作为占位符): =CallFn(addconn,SERVERSHARE,:) lpszLocalName 指向以null 结尾的字符串 ,该字符串指定了要被重定向
40、的本地设备.所有 lpszLocalName 串 (如 LPT1) 是要区分大小写的. 只使用了设备名A: 到 Z: 和 设备名LPT1 到 LPT3. WNetCancelConnection() WNetCancelConnection() 函数取消网络连接.它使用以下参数 : lpszName 指向以null 结尾的字符串 ,该字符串指定了重定向的本地设备名(如 LPT1: 或 D:) 或解除连接的远程网络资源。当该参数指定了一个重定向的本地设备,则该指定的设备的重定向被解除。若该参数指定了一个远程网络资源,那么只有该远程资源的连接而不是设备被解除。fForce 指定即使在连接上有打开的
41、文件或任务时,是否任进行中断连接。如果该参数为FALSE ,那么在有打开的文件或任务时,调用该函数失败. 参考关于WNetAddConnection() 和 WNetCancelConnection() API 调用的更多信息 , 请参阅Microsoft Windows Software Development Kit (SDK) 程序员参考 , 第二卷 : 函数 ,. 注意 : API 调用返回值不会被FoxPro for Windows 转换 . 关于 Visual FoxPro DECLARE 命令细节 , 请参阅DECLARE - DLL 帮助主题技巧篇 5:VFP 查询系统实现技巧
42、六则用 VFP60可缺少的重要部分。而开发一个优秀的查询系统需要很多的应用技巧。由于工作原因,笔者经常开发查询系统模块,现将个人编程中总结的一些技巧介绍给大家,希望对读者的应用开发有所帮助。任务进度条的实现在查询的过程中,如果数据较多,需要用户等待时,查询系统中应有进度条加以显示,才能使系统更加具有规范性。具体实现方法如下:1.选择 VFP的系统选单“工具”中“选项”条,弹出“选项”窗口,在窗口中点击“ActiveX控件”栏,添加任务进度栏控件Microsoft ProgressBar Control Version5.0 (SP2)至 ActiveX 工具箱中。2.选定表单控件工具栏中“Ac
43、tiveX 控件”,添加控件Microsoft ProgressBar Control Version6.0 至查询的表单Form1 中,并设置其属性Max 值为 1000。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 22 页 - - - - - - - - - 3.将下列代码添加到数据查询程序代码之后:for i=1 to 1000 for j=1 to 2000 j=j+1 endfor thisform.olecontrol1.value=i i=i+1 en
44、dfor messagebox( 数据查询完毕, OK!,0+64) thisform.release clear events 通过这样的设置,在查询时如果时间较长,查询进度条会为用户显示查询任务的运行情况。应用宏命令实现组合查询在组合查询中, 需要查询的组合项通常很多,如果每项都使用不同的变量,编程会非常烦琐。笔者使用宏命令轻松实现查询组合条件,具体实现的方法是在查询按钮里加入如下代码:LOCAL cFilter,nCnt,cCondition FOR nCnt = 1 to THISFORM.ControlCount IF TYPE(THISFORM.Controls(nCnt).con
45、trolSource) U THEN IF !EMPTY(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 EN
46、DIF ENDFOR 通过这样的设置,虽然有多个查询条件,但查询的组合条件为cFilter ,以后的应用只要对cFilter 进行处理即可。删除查询表中的空记录使用类查询( _dataquery.vcx )时,会在待查询表中的最后自动插入一条空记录,而在实际的 GRID 表格显示中,我们是不希望将空记录显示出来的。下面是解决此问题的详细步骤:1.在主程序或Form 对象的 Load 事件输入以下代码: SET DELETE ON 2.在查询结束代码后输入以下代码:Thisform.Refresh& 刷新表单go bottom delete next 1& 因为当前表被添加了一个空记录,在实际应
47、用中应删除掉Thisform.Grid1.Column1.Setfocus go top Thisform.grid1.refresh名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 22 页 - - - - - - - - - & 删除一条记录后,应及时地刷新GRID 表实现中英文自动切换在用 VFP6.0 开发查询系统时, 文本框对象和组合框对象应用得较多,在文本框中进行中英文的输入时,来回切换非常烦琐,所以笔者借助自定义子类,来实现中英文输入的自动切换。具体实现的步
48、骤如下:1.点击 VFP6 系统选单栏 “文件新建类”,启动“新类”对话框, 填入类名为gsTextBox ,并设置父类为TextBox ,在“存储于”栏处输入存储的位置和名称,按“确定”键进入类设计器画面。2.新增一个属性,来作为对象是否启动中文输入法的控制码。通过系统选单栏“类新建属性.”,启动“新建属性”对话框,设置一些属性,其中可视性设为public 。3.最后设置 GotFocus 与 LostFocus 事件过程。 Gotfocus Event 事件过程如下:If thischinese & 中英文选择, thischinese 为逻辑量=imestatus(1) else =im
49、estatus(0) endif Lostfocus Event 事件过程如下:=imestatus(0) 至此,类已经定义完成,以后只要在设计表单时,通过表单控件“工具栏查看类添加.”把自定义类加入,并且设置“中英文选择”属性,即可实现中英文输入的自动切换。实现整条记录突出显示在用 VFP 设计一个查询应用系统时,信息的浏览是相当重要的功能之一,通常采用的实现方法是用 Grid 对象来显示数据信息,但在使用过程中却存在一些不足,就是当使用者在记录之间移动时,只有获得焦点的那条记录的某一字段可以以不同于Grid 背景的颜色显示,很不醒目。笔者利用 Grid 对象,成功实现了当数据记录移动时,整
50、条记录均用同一种颜色突出显示,即当数据记录移动时,用颜色动态变化显示相对光标所在的位置,设计步骤如下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 22 页 - - - - - - - - - 首先定义一个Grid 对象,并设置好其属性, 然后在其 AfterRowColChange事件过程中添加如下代码:LPARAMETERS nColIndex this.setall(dynamicbackcolor,iif(this.activerowrecn(),rgb(25