VFP 学习、开发漫谈 (21)
最近一段时间,因单位工作繁忙,“开发、漫谈”已经好久未更新了。近日,获悉本人升任“版主”,这既是一份荣誉,又代表着一份责任。忙里愉闲,正好今天有点时间,就几个小问题给大伙儿聊几句。问题一,记得在阅读有关 VFP 6.0 的资料时,书中提到一个小技巧:在“工具”-“选项”对话框中,按下 Shift 键不放,单击“确定”按钮,即可将对应的 SET 命令与系统变量输出到命令窗口中。
但是,在 VFP 9.0 下,打开“Option”对话框,按下 Shift 键的同时,单击“OK”按钮,你会发现在 Command 窗口中却什么也不显示。难道在 VFP 9.0 下,这项“绝招儿”不灵了?非也,你只需按照如下步骤操作:
1. 选择菜单“Tools”-“Debugger”,打开调试器,并保证 Debug Output 窗口处于打开状态(默认是打开的)。
2. 切换回 VFP 窗口,选择菜单“Tools”-“Option”,打开选项窗口。
3. 按下 Shift 键不松开,单击“OK”按钮。
4. 切换到 Debugger 窗口,你会发现:与选项对话框相对应的 Set 命令和系统变量均输出到了 Debug Output 窗口中了。
问题二,我们都知道,VFP 设置系统默认路径的命令是 Set Default To <路径>。按照我们的理解,要获取默认路径,应该采用 Set("Default")。因为,一般情况下 Set 命令与 Set()函数是对应的,前者用于设置系统状态,后者用于返回系统状态。但是,当你输入 ? Set("Default")时,你会发现:系统返回的不是默认路径,而是默认驱动器,如:“C:”。那么,如何才能返回默认路径呢?相信大多数用户都知道:采用 SYS(3)+SYS(2005)。不过,这里我再教你一招儿:使用 Set("Directory")。令人奇怪的是,在 VFP 的帮助文件中,竟没有查到有关这个函数的任何信息。不信,各位可以在命令窗口中,输入 Help Set(),查看列表中是否有 Directory。
问题三,要使递增框(Spinner)每次递增 0.001,当在 Increment 中输入 0.001 时,系统会自动变为 0.00,也就是说,系统只能保留 2 位小数。怎样才能输入多位小数呢?答案是:在 Increment 框中输入 =0.001,即:在值的前面输入一个等号。另外,还有一个更重要的问题:当 Increment 的小数位大于 Value 中的小数位时,会造成控件的显示值与实际值不符。比如:设置 Increment = 0.5,Value = 0,运行时,单击向上递增按钮,则 Spinner 显示为 1,但其 Value 却还是 0。这会带来严重的问题。因此,必须牢记:Increment 的小数位必须小于或等于 Value 的小数位。
问题四,列表框的 RowSourceType = 0,如何将内容添加到第 2 列?
若在列表框的 Init 事件中输入:
THIS.AddItem('选项11',1,1)
THIS.AddItem('选项12',1,2)
运行结果如下:
我们发现,“选项12”没有出现在第一行第二列,而是出现在第二行的第二列。
正确的处理方法有两种:
方法一:
THIS.AddItem('选项11')
THIS.List(THIS.NewIndex,2) = '选项12'
方法二:
THIS.AddItem('选项11')
THIS.AddListItem('选项12',THIS.NewIndex,2)
问题五,列表框的 RowSourceType = 0,如何使用一个 AddItem() 添加多个列表项?
答:在列表框的 Init 事件中,输入:THIS.AddItem('选项01\;选项02\;选项03'),可一次性添加“选项01”、“选项02”、“选项03”三个列表项。
问题六,如何在列表框中添加分隔线?
答:与在菜单中添加分隔线的方法相似,THIS.AddItem('\-')。
问题七,如何禁用列表框中的某个列表项?
答:在列表项前加反斜线和右方括号(\]),如:在一个命令按钮的 Click 事件中输入:THISFORM.List1.List[2] = '\]'+THISFORM.List1.List[2] 可禁用列表框的第 2 项。列表框的第 2 项将显示为灰色,并且无法用鼠标和键盘选定。
问题八,“开发、漫谈(八)”对控件操作进行了总结。其中,遗漏了一点,补充如下:
比如,选择多个控件后,单击布局工具栏上的“Same Width(相同宽度)”,默认是将所有控件的宽度设定为其中最宽的控件的宽度。若按下 Ctrl键,单击“Same Width”按钮,则是将所有控件的宽度设定为其中最窄的控件的宽度。也就是说,按下 Ctrl 键,可以做“相反”操作。其他如“Same Height(相同高度)”、“Same Size(相同尺寸)”按钮与此相同。
问题九,在“开发、漫谈(二)”中,提到 TRIM()函数不仅可过滤尾部空格,也可以过滤掉其他字符。最近,在编写代码时就发现了它的妙用,列举 2 个例子。
例 1:将日期变量 dNow(存储的值为 2014.05.10)转化为 5.10,仅保留月份和天数,且去除月份前面的 0
? LTRIM(RIGHT(DTOC(dNow),5),'0')
上述代码中,使用 LTRIM()函数过滤掉了月份中的 0
例 2:将数值转化为字符串,要求:0 或0.00 转化成空串;5.00 转化成 5;5.10 转化成 5.1
程序代码:
FUNCTION Ntoc(nValue) && nValue(要转换的数值) LOCAL cRet DO CASE CASE nValue = 0 && 为 0 时返回空串 cRet = '' CASE INT(nValue) = nValue && 为整数时不保留小数位 cRet = TRAN(nValue) OTHERWISE && 有小数时不保留小数位右侧的 0 cRet = TRIM(TRAN(nValue),'0') ENDCASE RETURN cRet ENDFUNC在上述代码中,使用 TRIM()函数去掉了小数点右边的无效 0,十分简洁。若采用代码,需放在一个循环中逐个字符去检测,十分繁琐。
该函数可用于表格中,用来显示数值型数据,以节约列宽。比如,在我开发的进销存系统中,去税单价设置了 6 位小数,若不采用该函数,则小数点后面的 0 非常影响视觉体验。
[ 本帖最后由 liuxingang28 于 2014-5-13 15:41 编辑 ]