以下是引用hkbkjjjj在2017-6-15 16:32:40的发言:
那个搞好了 现在又出现了这个怎么办
变量和别名又不一样了:别名是全局的,只要这个表文件开着,哪儿都能用。变量是有“地区”差异的,也就是作用域的问题。VFP里的变量作用域分为:全局(PUBLIC)、局部(LOCAL)、私有(PRIVATE)。
全局变量:无论其在何处定义,主程序及任何过程中都可以使用它;
局部变量:只可以用在定义它的过程体中,不可以在其它过程体中调用;
私有变量:可以在定义它的过程体,以及任何下级过程体中调用。
如果一个内存变量没有定义就直接使用,那么它的作用域等同于私有变量,可以视作“准私有变量”。但与私有变量不同,用PRIVATE命令定义过的私有变量可与上级内存变量同名(虽然我个人不建议这么做),而不会互相影响;但“准私有变量”因为未经定义,所以任何下级过程体中的调用,都视作为调用了同一个变量。见下面的栗子:
**********
* 主程序 *
**********
ABC=2
&&未经定义
DO TEST1
?"主程序ABC="+STR(
ABC,1)
CANCEL
*************
* 过程TEST1 *
*************
PROCEDURE TEST1
PRIVATE ABC &&此处定义了另外一个私有变量ABC,与主程序中的同名
ABC=3
?"过程TEST1中的ABC="+STR(
ABC,1)
RETURN
ENDPROC
输出的答案应该是:
过程TEST1中的ABC=3
主程序ABC=2
如果没有TEST1过程中的“PRIVATE ABC”这一句,那么输出结果就是,两个ABC都是3。因为过程体中没有重新定义ABC,所以在此调用的ABC重新赋值就是对主程序中的ABC进行了重新赋值。所以,回到主程序后,变量ABC中的值自然也就变成了新的。
不知道这么解释,你是否明白?
再回到你这个问题:找不到变量的错误,在VFP看来,通常是没有定义该变量,或之前没有使用过该变量。但从编程者的角度来看,之前肯定是用过的,否则不会平白无故地调用一个自己都不知道的变量。从两个角度综合分析,再加上前面说的作用域问题,我认为可能是:1、在与首次定义(非PUBLIC)或使用该变量的过程体的平行层次或上级层次过程体中调用了该变量,造成调用这个名称的变量时,该变量已经被释放,从而被VFP认为是调用没有定义过的变量;2、用LOCAL定义了变量。因为局部变量只能在自己定义的过程体内使用,不能在其它任何过程体内调用,所以也会发生这个错误;3、手误,把变量名字打错了。
[此贴子已经被作者于2017-6-16 09:14编辑过]