| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1839 人关注过本帖, 3 人收藏
标题:VFP学习、开发漫谈 (六)
取消只看楼主 加入收藏
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
结帖率:96.88%
收藏(3)
已结贴  问题点数:10 回复次数:1 
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 编辑 ]
收到的鲜花
  • tlliqi2014-02-28 12:29 送鲜花  20朵   附言:学习
  • hu9jj2014-02-28 19:04 送鲜花  50朵   附言:好文章
搜索更多相关主题的帖子: 温故而知新 孔夫子 回马枪 回锅肉 表达式 
2014-02-28 12:24
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
以下是引用sdta在2014-2-28 13:22:01的发言:

应该是RUNCMD吧

是 NirCmd.exe,该文件是从 www. 网站上下载的。

泉城飞狐
2014-02-28 13:39
快速回复:VFP学习、开发漫谈 (六)
数据加载中...
 
   



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

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