| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2765 人关注过本帖, 5 人收藏
标题:VFP学习、开发漫谈 (二)
取消只看楼主 加入收藏
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
结帖率:96.88%
收藏(5)
已结贴  问题点数:20 回复次数:1 
VFP学习、开发漫谈 (二)
看到这么多人跟贴,尽管右臂肌肉拉伤,还是很乐意打起十二分的精神与大伙儿接着聊。

首先从“$”这个简单的字符串比较符开始吧,其用法是“A $ B”。很多书上把它称作“包含”,这就使人很容易将其理解为“A包含B”,这就错了。所以,应该把它读成“包含于”,即“A包含于B”,意思是“B包含A”,这就对了。

“$”比较符是区分大小写的,若要不区分大小写,应该写作“UPPER(A) $ UPPER(B)”,把二者转换成大写再比较。在微软的例程中,常用AT()或ATC()来代替 $ 的使用,原因可能是在其他语言中,$ 用的较少的缘故吧。我的使用习惯是:若要区分大小写判断A是否包含于B,我使用“A $ B”,若忽略大小写判断A是否包含于B,我使用“ATC(A,B) > 0”。

说到字符串比较,我先请你执行一下 ? 'a' > 'A',很多人可能认为这太 Easy 了,运行结果肯定是 .t.,因为我们习惯上认为:字符串是按其ASCII值的大小进行比较的,小写a的Ascii码值是97,大写A的Ascii码值是65。原来我也是这么认为的。但在VFP 9.0下,其显示结果受 Set Collate设置的影响。在Set Collate to "PinYin"状态下,? "a" > 'A' 的运行结果是 .f.,在 Set Collate To "Machine"状态下,? "a" > 'A' 的运行结果才是 .t.。为了保证字符串按我们习惯的Ascii码值进行比较,强烈建议 set collate to "Machine"。另外,在修改表结构时,注意观察一下 Indexs 页上各索引的 Collate 设置,建议将其设置为 Machine。我在这方面有过深刻的教训。

再来说一下字符串定界符。VFP的字符串定界符多达三个:双引号(")、单引号(')和方括号([]),这在其他语言中是不多见的。其实,VFP在编程元素方面比其他语言丰富的还不只这些,比如:不等于,就有:<>、#、!= 。对于字符串定界符,我比较喜欢使用单引号,因为输入单引号只需按一下键,而输入双引号则需要按下两个键。若使用方括号,虽然也仅需按一个键,但左右方括号需要按不同的键,另外,方括号也是数组下标的定界符,所以我一般将方括号仅用于数组。那位说了,数组不是可以使用小括号吗。但是,别忘了,输入小括号需要按下两个键,不如输入方括号容易。同样的道理,在选择不等于符号时,我比较喜欢使用“#”。俗话说:“萝卜青菜,各有所爱”。上述使用习惯,仅作参考。

再说一下 STORE 赋值命令。为单个变量赋值时,用 STORE 有点“杀鸡用牛刀”的感觉,所以我一般使用等号,而为多个变量赋同一个值时,我才使用STORE。另外,STORE不仅可以为变量赋值,其还可以为属性赋值(即修改属性),这一点是很多用户没有注意到的。在为多个属性赋值时,为了可读性,建议每行写一个属性,行尾输入续行符分号。这里所说的变量,是指内存变量,且内存变量与字段变量重名时,无需在变量前加“m.”。

再来说一下用于字符串连接的“-”号。说实话,在我二十年的编程生涯中,从没有这样用过,大部分情况下都是使用“+”和Trim()函数来解决。对于“A-B”来说,大部分书籍均强调减号会过滤掉 A 尾部的空格然后与 B 连接,很少提到它将过滤掉的空格添加到了B的尾部。所以,我将减号的功能概述为:将A尾部的空格移至B的尾部

在判断字符串“A = B”时,默认状态(set exact off)下,若A开头部分等于B时,则返回.t.,这在模糊查询时很有用,不要求A与B的长度相等。若要判断A与B是否完全相同,应使用“A == B”,读作“A全等于B”。注意:两个等号之间不能有空格。“==”也可用于其他数据类型表达式的比较,其作用与“=”相同。在 set exact on状态下,很多用户认为“A=B”与“A==B”的功能是相同的。实事并非如此。你可以在set exact on状态下,输入 ? "ab" = "ab ",注意后面字符串尾部有一个空格。尽管二者的长度不同,但其显示结果仍是.t.,这是因为在比较时,系统会在较短的字符串尾部添加空格使二者长度相等,然后再比较。其实,在我的编程经历中,从没有在set excact on状态下比较过字符串。

在 Select - SQL 语句的 Where 条件中,对于模糊查询,Set exact 的设置不再有效,而是要看 set ansi 的设置,其作用与 set exact 类似。不过从移植性和标准化方面来考虑,我建议大家使用“LIKE”配合“%”和“_”通配符更好一些,功能也更强。

我们常使用 trim()这个古老的函数来过滤掉字符串尾部的空格,久而久之,就将 trim() 与过滤字符串尾部空格等同起来。其实,trim()可过滤掉字符串尾部的多个字符串。在这里,我第一个需要强调的是“多个”而不限于一个。如:? trim("My.Name.12","1","2","."),结果为“My.Name”,将尾部的“.12”三个字符都过滤掉了。从运行结果中我们还可得出如下结论:一是,这若干个字符(串)可以是任意顺序,并不要求将最先过滤掉的字符放在第一个;二是要过滤掉的字符的组合在原字符串的尾部必须是连续的,因为第一个句点没有被过滤掉。我第二个需要强调的是“字符串”而不仅限于单个“字符”。如:? trim(My.Name,"Name"),显示结果是“My.”,字符串“Name”被过滤掉了。LTRIM()、ALLTRIM()、RTRIM()也有与TRIM()相似的功能。

再次强调,对于初学者来说,在学习VFP编程时,一定要把基础打牢。特别是那些命令和函数中的“特殊情况”更需给予“特殊关照”。

今天就写到这里吧,下次再见!



[ 本帖最后由 liuxingang28 于 2014-2-24 13:11 编辑 ]

[此贴子已经被作者于2018-11-24 10:23编辑过]

收到的鲜花
  • tlliqi2014-02-24 14:47 送鲜花  20朵   附言:辛苦了
  • hu9jj2014-02-24 16:56 送鲜花  49朵   附言:好文章
2014-02-24 12:21
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
以下是引用TonyDeng在2014-2-25 12:28:48的发言:

用==符號對非字符型是不會報語法錯的,除非你符號兩邊的數據類型不一樣。這個符號是從C移植過來的,本來就是對所有數據類型都是用這個符號比較(C的浮點型這個比較不精確是因爲數據儲存的原因)。

确如大侠所言,==确实可用于其他数据类型,是我错了,十分感谢批评指正!

泉城飞狐
2014-02-25 16:33
快速回复:VFP学习、开发漫谈 (二)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021507 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved