用容器类包装第三方控件,添加ControlSource类 ,使得更规范,更符合VFP的开发方式。
思路:1 自定义属性ControlSource INIT和Refresh时取这个值进行赋值给控件.
2 第三方控件LOSTFOUCES时,Replace 回ControlSource的字段
3 添加自定义方法SetSize,设置各控件位置关系,在Init Resize事件分别调用,并设置好Anchor属性
设计原则
1 容器类添加ControlSource 并且判定其值是否有效
Init 事件
Local otmp As Object,ctmp As String
Set Safety Off
otmp="&This.ControlSource"
If Thisform.BindControls=.T.
If Vartype(This.ControlSource)<>'U' And !Empty(This.ControlSource)
自定义赋值控件
Endif
Endif
this.setsize()
Refresh事件 此事件要进行最好进行事件绑定,不采用Refresh事件,防止子控件中有更改
Local otmp as Object
otmp="&This.ControlSource"
If (vartype(This.ControlSource)<>'U') AND !EMPTY(This.ControlSource)
自定义赋值控件
Endif
Value事件的处理
Value_Access 返回内控件的值,注意不要改变外部容器内的Value
例子:
Value_Access
*To do: 为 Access 方法程序修改此例程
Return This.text1.Value
或者修改为自己需要返回的值
Value_Assgin
LPARAMETERS vNewVal
*To do: 为 Assign 方法程序修改此例程
This.text1.value = m.vNewVal
改变值了,就要改变其它的值了
内容控件 InteractiveChange/LostFocus
此事件要进行改变数据源的值了
*--取出表名
cAlias=LEFT(oTmp,AT(".",oTmp)-1)
IF !USED(cAlias)
ERROR "数据源格式不正确.eg:表名.字段名"
ENDIF
replace &this.controlsource with 值 in(表名)
如果控件中的内容控件不使用ControlSource 属性时,
编程修改Value 引发Value_Assgin 方法或键鼠改变操作控件的值时
要使用 replace &this.controlsource with 值 in (表名)