作者:达通兴电脑科技公司(www.study01job.com) 郭宝利
和数据窗口控件打交道都是通过编辑控件进行的。在数据窗口中录入数据、修改数据,实际上是在修改单元上的编辑控件中的内容。当编辑控件移动到另外单元上之前,要对编辑控件中的数据进行校验,如果能通过字段的校验规则,就保存到字段中。编辑控件是可以移动的,需要编辑哪个单元,编辑控件就移动到哪个单元上,接受输入或者修改。
对于熟悉Microsoft Excel的人来说,编辑控件可以看成是Excel网格中的单元格。当用户在一个单元格中输入一个公式,它不会被接受和计算,直到用户移到其他单元格时才进行公式正确性检查,如果错误则不能移动到其他单元格中。数据窗口控件使用了同样的概念。
编辑控件在没有离开当前字段时,用户录入或者修改的数据就不会被保存到字段中,如何确保在数据窗口失去焦点时,最后位置上编辑框中的内容不被遗漏呢?前面介绍了在数据窗口的LoseFocus事件中编写如下脚本:
this.AcceptText()
这个方法在很多情况下能解决该问题。美中不足的是,如果编辑框中的内容不能通过字段的校验规则,有时会显示两次错误信息窗口。造成两个错误信息窗口,往往是在选择其他单元时发生,在数据窗口失去焦点之前(如单击“保存”按钮等)只会显示一个错误信息窗口。用户选择其他单元时,编辑框中的数据开始进行校验,不能通过校验规则,显示校验错误信息,在显示校验错误信息时数据窗口失去焦点,触发数据窗口的LoseFocus事件执行AcceptText函数,又一次显示校验错误窗口。
所以,显示两次校验错误窗口的原因是LoseFocus事件中的AcceptText函数造成的。可以想法让该函数在这种情况下不执行。为此定义一个实例变量:
Boolean ib_accept = True
该变量用来表示是否正确通过了校验,然后将LoseFocus中的脚本改成下面的脚本:
If ib_accept Then
This.AcceptText()
Else
ib_accept = true
End If
在数据窗口的ItemError事件中编写脚本:
ib_accept = False
这样就可以解决显示两个校验错误信息窗口了,并且不会遗漏最后一个编辑框中的内容。
当在某个单元中修改或者录入数据后,编辑框要离开时,要进行4个校验步骤,前面两个步骤由PowerBuilder完成,后面两个由开发者编写。
(1)看数据和编辑前相比是否发生了改变,没有改变则不做任何处理。
(2)检查测试此值是否违反了任何一个在字段上定义的有效性校验规则,违反则拒绝接受此值,并触发ItemError事件。
(3)检查此值是否与编辑前真的不同,没有改变则终止有效性校验。
(4)检查开发人员在ItemChanged事件中编写的脚本。具体的发生情况取决于分配给被称为动作代码的值。