编写代码的正确方法是:
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会默认宣布它们是私有的。如果你使用像ISX这样的工具,这是一个很好的做法,可以声明本地,也可以帮助intellisense。
2)使用addbs()确保反斜杠。它只是编码安全。
3)使用m。 (又名mdot)的内存变量。使用mdot,你明确告诉VFP它是一个内存变量。使用mdot并没有什么坏处,但是如果你不这样做,你可能很难找到bug(并且在紧密的循环中,使用mdot证明它会快得多)。
4)最后,你的原始问题。文件名是一个“名称”,因此不要使用宏扩展(&)运算符,而是在名称的任何位置使用“名称表达式”。 “名称表达”只是一组括号。如果某物是“名称”,则使用“名称表达式”(fieldName,fileName,folderName,variableName ...)。
除了规则,不幸的是许多VFP开发人员滥用&并经常使用它。实际上,使用它的地方可能太少,这是SQL语句。不是这样的:
lcSQL = "select * from ..." + ... + "..."
&lcSQL
(通常你可能会看到这种模式),但这一部分SQL使用宏扩展。即:
select &fieldList ;
from (m.tableName) ;
where &lcWhere ;
order by &lcOrder
请注意,m.tableName是一个“名称”,因此与“名称表达式”一起使用。 FieldList变量可能持有一个fieldName或一系列fieldNames(即:“CustomerId”或“CustomerId,CompanyName,ContactName”)并且不能用作“名称表达式”,需要进行宏扩展。
永远不要使用&when()会做。 http://www.tomorrowssolutionsllc.com/Articles/Handling%20Code%20that%20Changes%20at%20Runtime.pdf –
谢谢Tamar,非常有帮助,你的文章明确提到了嵌入式空间,这似乎是最初的问题。 –