VFP学习、开发漫谈 (六)
孔夫子教导我们:温故而知新。有时候,“回锅肉”更有味道。所以,今天我们针对前几节课中的几个问题,杀个回马枪。首先,更正一个在漫谈(二)中出现的错误:
原文是:“==”仅用于两个字符串之间的比较,不能用于数值或其他类型表达式之间的比较,否则会出现语法错误。
经版主 TonyDeng 提醒,并上机验证确认:“==”也可以用于其他类型表达式之间的比较,但其功能与“=”相同,如:? 2==2.0 显示 .t.
有些错误在自己脑子里已经根深蒂固,若不借助“外力”,已经很难改正了。
其次,我想对漫谈(三)中关于 TRANSFORM()函数的使用,结合坛友的回贴,再啰嗦几句:
1. TRANSFORM 函数的掩码由格式掩码(Format)和输入掩码(InputMask)两部分组成,这与文本框的 Format属性和 InputMask属性相似。不同之处是,TRANSFORM 仅用于输出,而表单的 InputMask 还可用于控制输入。
2. 掩码的一般形式是:“@格式掩码 输入掩码”,二者之间用空格分开。当无格式掩码时,前面的“@”和空格可以省略,只保留输入掩码即可。
3. 有些掩码,如:“!”即可用于格式掩码,也可用于输入掩码。用于格式掩码时,是对整个字符串的控制,如:“!”格式码用于将整个字符串转化成大写。而用于输入掩码时,仅对当前位置上的单个字符起作用。如:“!”用于输入掩码时,仅将该位置上的字符转换成大写。同一个格式掩码不重复,而输入掩码可重复。
4. 同样的掩码对不同的数据类型其作用也是有差异的。下面举两个例子。
例一:把字符串“20140228”转换成“2014年02月28日”
方法一:? TRANS('20140228','@R 9999年99月99')+'日'
方法二:? TRANS(VAL('20140228'),'9999年99月99日')
从这个例子中可以看出,在处理字符型表达式时,对于输入掩码中的非掩码字符,需要使用“@R”,而对于数值型表达式,则不用。
例二:在表单上放置一个 Textbox 控件,保持其 Value 属性为默认的“(None)”,将 InputMask 属性设为“9999”。运行表单,我们发现只能在文本框中输入数字,不能输入加减号。现在,将文本框的 Value 设为 0,InputMask 仍为 9999,运行表单,你会发现:在文本框中不仅可输入数字,也可以输入加减号了。
由此可以看出,掩码“9”对字符型表达式和数值型表达式的控制是不同的。
在漫谈(三)中,我提到:将客户端与服务器时钟同步时,使用“Net Time \\192.168.0.1 /Set /Yes”DOS 命令。
这个命令对于客户端是域用户时,没有问题。但是,若客户端不是域用户,由于客户端未被服务器验证,无法访问服务器,造成时间同步失败。为此,可以在服务器上设置一个临时用户,如:tmp,无口令,在执行 Net Time 前,先与服务器建立连接就 OK 了。
Net Use \\192.168.0.1 "" /User:tmp
Net Time \\192.168.0.1 /Set /Yes
同样的道理,我们开发的应用程序在非域用户微机上运行时,也可以采用此方法。
最后一个问题,就是在 VFP 下执行“RUN Net Time \\192.168.0.1 /Set /Yes”时,会出现一个难看的“黑”窗口。如何避免呢?
有用户可能说:用 RUN /N 不就行了?
使用 RUN /N 有 2 个问题需要解决:一个是对于纯 DOS 批处理,即使增加了“/N”参数,也会有一个“一闪而过”的黑窗口;二是使用“/N”参数时,VFP不等待DOS命令执行完成,就继续向下运行。若后续命令调用了前面 DOS 命令的运行结果,可能导致错误。
对于第一个问题,我采用了一个完全免费的小程序 NirCmd.exe,用它来执行 DOS 命令不会出现黑窗口。Nircmd 可以从 www. 网站上下载,其体积超小(仅40K)、功能超多、纯绿色、全免费,是不可多得的好工具,强烈推荐!
对于第二个问题,我通过判断一个标记文件 ~cmdok.txt 是否存在,从而使系统处于“等待”状态,以保证 DOS 命令执行完毕。
我编写的通用自定义函数如下:
* 函数:运行 DOS命令-------------------------------------------------------------------------------------------------
FUNCTION RunCmd(tcCmd)
#DEFINE CRLF CHR(13)+CHR(10)
LOCAL tcCmd
DELETE FILE c:\mis\~cmdok.txt && 清除“批处理执行结束标记文件”
DELETE FILE c:\mis\~cmd.bat && 清除“批处理临时文件”
IF RIGHT(m.tcCmd,2) # CRLF && 换行
tcCmd = m.tcCmd + CRLF
ENDIF
tcCmd = m.tcCmd + 'echo.>c:\mis\~cmdok.tmp' && 在批处理末尾增加一行,用于生成结束标记文件
= STRTOFILE(m.tcCmd,'c:\mis\~cmd.bat') && 将字符串转化成批处理文件
RUN /N Nircmd.exe execmd c:\mis\~cmd.bat && 执行 DOS 命令,隐藏 DOS 窗口
DO WHILE !FILE("c:\mis\~cmdok.tmp") && 等待命令执行完毕
ENDDO
DELETE FILE c:\mis\~cmdok.tmp && 清除临时文件
DELETE FILE c:\mis\~cmd.bat
ENDFUNC
执行以下命令,可以将本机的网卡连接信息放到文件 NetCard.txt中:
= RunCmd('config/all>c:\netcard.txt')
[ 本帖最后由 liuxingang28 于 2014-2-28 12:32 编辑 ]