Macros VFP宏扩展在用语句

Macros VFP宏扩展在用语句,macros,visual-foxpro,Macros,Visual Foxpro,正在用户提供名称的文件夹中打开表 lFolder = Getfile() lFilename = lFolder + “mytable.dbf” USE &lFilename IN 0 ALIAS . . . 这通常效果很好。但是,如果用户提供名称的文件夹具有嵌入空间,因此为“我的文件夹”,则使用指令将失败。但这一指令成功地起到了作用: USE (lFilename) IN 0 . . . 是否有任何规则规定何时应该使用符号(&)结构以及何时应该使用括号结构?这是否仅适用于使用声

正在用户提供名称的文件夹中打开表

lFolder = Getfile()
lFilename = lFolder + “mytable.dbf”
USE &lFilename IN  0 ALIAS  . . .
这通常效果很好。但是,如果用户提供名称的文件夹具有嵌入空间,因此为“我的文件夹”,则使用指令将失败。但这一指令成功地起到了作用:

USE (lFilename) IN 0 . . .
是否有任何规则规定何时应该使用符号(&)结构以及何时应该使用括号结构?这是否仅适用于使用声明


谢谢。Andrew

编写该代码的正确方法是:

local lFolder, lFilename
lFolder = Getdir()
lFilename = addbs(m.lFolder) + 'mytable.dbf'

* or a single GetFile() to select the dbf directly

USE (m.lFilename) IN  0 ALIAS  . . .
此代码中有不止一点: 1) 将变量声明为本地变量。如果没有该声明,它将起作用,VFP将隐式地将它们声明为私有。声明local是一种很好的做法,如果您使用像ISX这样的工具,它也将有助于intellisense

2) 使用addbs()可以确保使用反斜杠。它只是安全编码

3) 使用m。(又名mdot)用于内存变量。使用mdot,可以明确地告诉VFP它是一个内存变量。使用mdot没有坏处,但如果不这样做,可能会陷入难以捕获的bug(而且在紧密循环中,使用mdot的速度被证明要快得多)

4) 最后是你原来的问题。文件名是一个“名称”,所以不要使用宏扩展(&)运算符,而是在任何有名称的地方使用“名称表达式”。“名称表达式”只是一组括号。如果某个内容是“名称”,则使用“名称表达式”(字段名、文件名、文件夹名、变量名…)

除了规则之外,不幸的是,许多VFP开发人员滥用了&并且过于频繁地使用它。在现实中,使用SQL子句的地方可能太少了。不是这样的:

lcSQL = "select * from ..." + ... + "..."
&lcSQL
(通常您也会看到这种模式),但这是一种SQL部分使用宏扩展的模式。即:

select &fieldList ;
from (m.tableName) ;
where &lcWhere ;
order by &lcOrder 

请注意,m.tableName是一个“名称”,因此与“名称表达式”一起使用。FieldList变量可能包含一个字段名或一系列字段名(即:“CustomerId”或“CustomerId、CompanyName、ContactName”),不能用作“名称表达式”,需要进行宏扩展。

谢谢您的提示1。变量lFolder、lFilename被声明为local。局部变量以“l”甚至“lc”开头。声明没有显示在代码片段中,但在那里。2.在VFP9下,afaik,GETDIR()返回一个带有终止“\”的字符串(如果它返回一个目录);如果我错了,请纠正我!您的ADDBS()调用没有任何害处;但我没有包括在内。3.关于使用m.的建议-注意。正如您所说,它在一个紧密的循环中可能很有用。4.谢谢你。将接受您的建议,并在此处使用名称表达式。非常感谢。@Andrew_46--如果你欣赏塞廷的长篇大论和深思熟虑的回答,那么你最好给他一点鼓励。是的,这是一个长篇大论的回答,我相信这是出于好意。再次感谢塞廷。事实上,Tamar的评论包含了一个非常有用的链接,该链接非常详细地解释了这个主题。谢谢Tamar,非常有用,您的文章明确提到了嵌入空间,这似乎是最初的问题。