《你从VFP教程上看不到的编程小经验》由会员分享,可在线阅读,更多相关《你从VFP教程上看不到的编程小经验(11页珍藏版)》请在金锄头文库上搜索。
1、你从 VFP 教程上看不到的编程小经验 第 1 页你从你从 VFP 教程上看不到的编程小经验教程上看不到的编程小经验这是我历年使用 VFP 编程过程中的小经验,许多问题在高手看来不值一提,但当时我 可花了时间尝试后才解决的(那时互联网还不普及,许多问题在教材上又找不到) 。希望对 初学 VFP 编程的网友有所帮助。另外,虽然现在 VFP 被认为落伍了,但其实如果你真正学会了(不一定要精通) ,在 日常数据处理工作中还是会有很大用处的。我最喜欢的是它的命令窗口,灵活好用,可以说无能出其右者1、当程序运行之初,与字段绑定的控制显示的值不一定与被绑定的字段的值相同。 因此,要取得字段的值,不能用 O
2、bject.Value 属性值来取得。2、编增加条码部分的“换条码”功能时,当选定表格中的条码号后,击”换条码“按钮, 换条码窗口中出现欲替换的条码号总是为表格中的第一个条码号的情况,如欲删除条码号 “D0100009” ,却删除了“D0100001” (表格中出现的第一个条码) ,后将“换条码”的 Click 事件的方法中的 Thisform.Refresh()这句去掉后,即解决了问题。3、在编类别库 Ts_libs 中的 frm_Cxflmx 类别时,设定下拉列表框的 RowSourceType 属性为“字段” ,RowSource 属性为字段名。每一下拉列表框影响 GotFocus 事件
3、的方法为依据对应字段的索引,影响 InternateChange 事件的方法包 含有“IF !EMPTY(THIS.DisplayValue).ENDIF”的条件判断语句,结果引用该类 别的例程执行时死锁。经查试,用“变量=ALLTRIM(THIS.DisplayValue)”和“IF !EMPTY(变量).ENDIF”语句后,死锁现象消除。初步分析:这是由于在重新建立不同 关键词的索引时, “THIS.DisplayValue”的值与依据该作为判断条件的索引都在不断刷 新的缘故。4、激活其它表单时,当引用当前表单控件数据时,一定要指明全称。如当前表单的 控件 Text1 的 LostFocu
4、s 事件中引用自身控件的值时(例:SET FILTER TO 字段 =Thisformset.Form1.Text1.Value) ,如果只用 This.Value ,当其它表单里的控 件(例:表格)引用到该值时,将会出错。5、在编报刊订阅模块时,在读者栏输入过信息后,再在“个人”与“单位”选项中切换 到个人时,数据表 td_dzmx 指向表尾。反复查看代码,发现是由于在读者栏输入过信息 后,数据表 td_dzmx 经过了 SET FILTER 过滤。在“个人”与“单位”选项的 INTERCHANGE 事件代码中在选定“个人”项代码的选择 SELECT td_dzmx 后加上 SET FILT
5、ER TO ,问题得到解决。所以,在选择数据表后,一定要注意其原选的 SET ORDER 和 SET FILTER 设置,尤其是 SET FILTER 。6、在编报刊推荐模块时,遇到过在表格控件中无法浏览互相关联的子表 td_bkmx(报刊明细库) 的全部记录而在浏览窗口中却可以,解除两表(父表为 td_bkflm)之间的关联并将记录指针移到表头也不行,后将子表的与关键字有关的索引 取消即解决了问题(两表之间的关联没解除也没关系) 。7、一定要注意将工作区切换回要操作的工作区。8、在设计报刊管理系统的随机更换壁纸的功能时,总是出现重复显示一两张画的情你从 VFP 教程上看不到的编程小经验 第
6、2 页况,用 VAL(RIGHT(SYS(3),2) 获取任意序号的文件名后加在 _SCREEN.Picture=(任意序号文件名) 也好,还是获取任意序号的文件名后改为统一文 件名后调用再改回原文件也好,都无法解决问题,但在 Bmps 目录下的位图文件大多是小 文件的时候却能随机更换壁纸。后来在 DO WHILE.ENDDO 语句循环获取 VAL(RIGHT(SYS(3),2) 时加上一句 II=INKEY(0.00001),即解决了此问题。9、编按班级号顺序+班内分组随机号获取考号时,以“索引”作为临时存放排序号的字 段,并以此字段为分组依据。由于设置的结构索引表达式是为“索引”字段为依据
7、的,导致 考号与“索引”字段值相对应。经反复试验,找到原因,即:执行 LOCATE ALL FOR VAL(索引)=lnStartIndexInGroup .AND. VAL(索引)60” ,再在报表的文本框数据源设为 (bb/aa)*100,这样就得到了及格率。由于 找到了这个办法,甚至积各班分数段的统计都可用这个方法。一句话,只要不想长期保留 的统计信息,都可以打印报表时取得。 (2000.08.04)13、昨天的经验让又我解决了表格控件的列控制源 ControlSource 的属性值不能 用函数“&”的问题。如设 aaa=“IIF(ISNULL(cj_ksnj1.语文),0,cj_ksn
8、j1.语文)你从 VFP 教程上看不到的编程小经验 第 3 页+IIF(ISNULL(cj_ksnj1.数学),0,cj_ksnj1.数学)+.“ 然后在 Grid 控件在设 列控制源的 ControlSource 属性为 EVLAUATE(aaa) 就可以了。如果表达式长度超 过 255 个字符的话,还可以用两个或更多的变量如 bbb=“.“、ccc=“.“,ControlSource 属性相应可设为 EVLAUATE(aaa) +EVLAUATE(bbb) +EVLAUATE(ccc) 就可以了。如果表达式纯是字段表达式如 “cj_ksnj1.语文+cj_ksnj1.数学+cj_ksnj1
9、.外语+.“,可直接不要 EVLAUATE 函数而直接赋给 ControlSource 就可以。这一点我以前好象也试过,但不知为什么没 成功,可能不是这样设的。现在成绩库设几个总分字段还需要吗?看来只需要一个就可以 了,其它在浏览或用 Grid 控件时临时设置吧!(2000.08.05)14、又解决了一个在自定义类 GrdClickHeaderOrder 中不能对包含 .NULL. 值 的字段进行排序的问题。原用到 grdOrderField = This.&lcCurrColumnName .ControlSource 和 INDEX ON EVALUATE(grdOrderField) T
10、AG temp OF c:tempcdx DESCENDING 这两条命令,第一条用于取得当前列的控制源(包含别名的 字段名,控制源包含别名还是经过多次试验后才在自动获取列控制源的方法中加上去的, 开始没有加时,得不到预期的显示信息) ,第二条用于索引。索引命令时,原来用的是“&” 函数,但没有索引,后来改用 EVALUATE 函数才达到索引目的,可是却不能对包含 .NULL. 值的字段索引,为此增加了自定义方法,以获取可以接受 .NULL. 的字段,索 引时需要判断该字段是否接受 .NULL. 值,接受则不索引并提示。今天上午我在试验中 发现在命令窗口中可以对包含 .NULL. 值的字段进行
11、索引,索引时可以用变量加宏替换 “&”代替字段名。那为什么在自定义类中不能呢?再试验后得知,原来问题的关键是别名, 用变量代替字段名时,不能包含别名,如 aa=“cj_ksnj1.语文“ 和 bb=“语文“ 索引时 就会出现不同情况,前者不能对包含 .NULL. 值的“语文”字段进行索引,后者却行。原 来担心这样一来,当工作区改变时可能出现找不到字段的错误,试验的结果没有,证明这 个方法是行的。于是我在 grdOrderField = This.&lcCurrColumnName .ControlSource 命令行后加了 grdOrderField=SUBSTR(grdOrderField,
12、AT(“.“,grdOrderField)+1) 这一行, 以去掉别名。用这种方法索引时,只能用宏替换“&” ,不能用 EVALUATE 函数。 (2000.08.05)15、将自定义类 GrdClickHeaderOrder 的列控制源 ControlSource 用 EVLAUATE() 函数代替后,同样可以对这个列进行自动排序。现在可以完全不要去考虑统 计的问题了,除非要长期保留。成绩库中可以去掉总分 1、总分 2 字段,但总 1、总 2 的 班名次、年级名次可能还不能去掉。 (2000.08.05)16、今天用 SQL 语句创建了一个自定义过程和自定义的类(功能一样) ,用于统计学 科
13、各班的分析数据。用了它以后,一个学科的各班分析数据,只需要数秒钟就统计出来了, 以一个班 10 班计,也只需要最多一分钟。这比我以前的方法可简单多。 (2000.08.07)17、对于 ComboBox 控件来说,当 Enabled 设为 .F. 后,即始将其 DisplayValue 属性设为空,其 ListItemID 值也不一定是 0 ,因此表单启动后如果 ComboBox 的 Enabled 是 .F. 的话,不能用 ListItemID 是不是等于 0 来判断其 有没有选定过选项,即使 DisplayValue 为空时也是这样。这是我在修改任意条件查询的自定义类时得出的经验。 (20
14、00.08.08)18、当一个表处表尾时,将不管是否被其它用户锁定都不能锁定,也就是 FLOCK() 你从 VFP 教程上看不到的编程小经验 第 4 页和 RLOCK 都返回.F.。 (2000.08.10)19、在编查询当前成绩表单时,在执行到以自定义类 GrdClickHeaderOrder 创 建的控件 Form2.Grid1 时速度大大降低,并出现了超过 DO 嵌套层数的错误信息。原 来在表单集的自定义的方法 ResetGrid 中调用了浏览工具栏的 AfterLookStyleChange 方法,而后者又调用执行了表单集的 ResetGrid 方法,导 致不断循环。 (2000.08
15、.25)20、今天又彻底解决了一个在自定义类 GrdClickHeaderOrder 中存在的困惑问 题。我在用该类建立表格后,在单击列标题时有时会出现“找不到变量(如报刊名称 、 半 年价之类) ”的提示信息。这种情况出现在第二次调用该类建立的表格的时候。以前一直 弄不清楚是什么原因,只是后来用“&”命令后有好长一段时间没有出现此问题,以为已经 解决了。今天当我对该类作了一些修改(对“INDEX”命令行增加了“ADDITIVE”子句,用 不加别名的字段名作索引标识,以便对增索引过的列用索引标识排序,避 免对同一列重复使用“INDEX”命令)后,又出现了此问题,我下决心要找到原因。我 “WAI
16、T WINDOW”命令步步搜索,发现问题就出现在“INDEX”命令行上。我反复用“&” 、 “()” 、 “EVALUATE”方式对变量进行替换,都没有解决,甚至我直接用“INDEX ON 报刊名称 TAG 报刊名称 .”命令还是不能解决问题。为什么呢?我真是百思不得其解。后来我突然想到查看一个单击列标题后有关数据表(bk_bkys)的索引标识,于是我 在单击列标题后立即进入命令窗口,键入“MODI STRU”出现数据结构窗口后,发现索引 标识多了 10 多个,有“报刊名称” 、 “半年价” 、 “季价” 、 “一季份数”等,其中有些索引标识对应 的同名字段在数据表(bk_bkys)中是没有的,是选前执行过的用该类建立的表格数据源表 (bk_dymx),这下子我完全明白了,原来用问题正是出现在“ADDITIVE”子