用vfp时遇到一点问题,经csdn bbs高手们指点,终于解决,现贴于此:
  问题:
给自定义类新增属性,并选择了access和assign
在使用该类时,如果过程_access和_assign中有自己写的任何代码,则访问新加属性得的值时得到逻辑.T.,而不是属性中原来赋予的值
比如:为自定义类mytextbox增加一个新属性mystring,选中access和assign,并赋初值mystring="000001"
在表单中加入该 类后,如果_access _assign中没有任何自己加入的代码,则
?thisform.mytextbox.mystring
得到的是原初值:000001
如果在过程_access中加入:wait "access"后再执行
?thisform.mytextbox.mystring
得到的是.T.
回答:
1.
在mystring_access方法中的代码最后加代码:
RETURN thisform.mytextbox.mystring
2.属性的 assign 和 access 方法是为了给你提供一个修改控件属性缺省行为的途径。

可以在 assign 方法中添加代码,以便该属性值被改变时可以执行一些附加的操作;以及/或者(如果你希望的话),保护改属性的值不会被更改,或改变成一个你需要的值。例如你的 mystring_assign 方法可以是:
procedure mystring_assign
  lparameters tcNewVal
  * 这里放你要执行的附加操作代码
    wait "access"
  * .......
  * ---------------------
  * 1. 如果你不想该属性值被改变,就像它是一个只读属性一样,什么代码都不用写
  * ---------------------
  * 2. 如果你想执行与缺省行为不同的赋值操作, 例如:前面再加上一些文字
    this.mystring = '(附加的前缀文字)' + tcNewVal
  * ---------------------
  * 3. 如果你希望执行缺省的赋值操作
    this.mystring = tcNewVal
endproc

同样, access 方法也可以让你在读取该属性值时,根据需要返回不同的值,例如:
procedure mystring_access
  * ---------------------
  * 1. 返回属性的原值
    return this.mystring
  * ---------------------
  * 2. 返回经过修改的属性值
    return this.mystring + '(我比缺省值多些东西)'
  * ---------------------
  * 3. 或者变态一点,返回父窗口的标题文字
    return thisform.caption
endproc

灵活的运用这两个方法,可以让它们自动为你做很多事情。这两个方法与你另外定义两个新方法来做同样的事情是基本相同的,唯一不同的地方是这两个方法在属性被读取(access)或写入(assign)时会自动被调用,你不需要手工调用它们。
 
=================
根据高手的指点,实验如下:
1.自定义类mytextbox中新增属性:my="原始初值"
2.在表单中加入此类:加入一按扭并有如下代码:
thisform.mytextbox1.value=thisform.mytextbox1.my
如果_access与_assign中没有任何自己写的代码
则mytextbox1的显示结果:原始初值
3.在_access中加入代码:
this.my="access中重新赋值"
RETURN this.my
4.在_assign中加入代码
 this.my="assign加入的"+vnewval
5.按扭运行的结果是:thisform.mytextbox1.value显示
"assign加入的access中重新赋值"
6.结论:
当读取属性值时,系统自动调用_access,如果在其中改变了属性值,新值将被传递到
_assign的参数vnewval中,_assign也将被系统自动调用.
如果在_access中没有改变属性值,_assign则不被系统调用