昨天晚上加班的时候遇到一个问题,大致要实现以下内容:
1.数据窗口控件:dw_1、dw_2;
2.如果dw_1得到光标,那么{dw_2.visible = true} ;
3.如果dw_1 失去焦点,那么:如果dw_2得到光标,{dw_2.visible = true} ;如果dw_2也没有得到光标,{dw_2.visible = false} 。
看起来很简单的样子(实际上也很简单),但是我试了很多次。一开始在dw_1的losefocus事件里加上:{dw_2.visible = true} ,这样一来,在dw_1失去光标的时候dw_2不可见了,即使你单击的是dw_2也是一样的效果,这就没有达到目的。所以需要在{dw_2.visible = true} 之前判断是否是dw_2得到了光标,如果是,那么就直接return,否则再set{dw_2.visible = true}。
可是要怎么实现呢?
经尝试,解决方法如下(PB9.0):
graphicobject lctl_control //声明一个graphicobject 类型的变量,用来存储getfocus()的返回值
lctl_control = getfocus( ) //使用getfocus()函数,得到当前活动的控件
/*注意下面一句代码,判断当前活动控件是否是dw_2。因为dw_2本身是datawindow类型的,而lctl_control是graphicobject 类型的,此处需要进行强制类型转换以后才能进行比较,否则会报错。强制类型转换可以采取多种方式,在此我选择了把取两者的句柄来比较(handle函数的返回值是long类型,此处和C++中不一样,VC++中本身就有句柄类型)*/
//如果是dw_2得到了光标,return
if handle(lctl_control) = handle(dw_2) then return
//否则,将dw_2设置为不可见
dw_2.reset( )
dw_2.visible = false