在打开和关闭窗口时进行数据传递
在应用程序中,有时一个任务要分解成几个部分,由多个窗口来协同完成,这就需要这些窗口之间能够很好地配合。例如,在检索大批量数据时,可以提供一个小窗口让用户随时停止数据检索,并能在该小窗口中显示检索的进度。如果在一个窗口中显示关于职工的简短描述信息,用户双击某职工数据时可以显示该职工的详细情况,等等,这些例子都涉及窗口之间的协作。本节介绍有关的函数和技巧。
窗口之间的协作有以下几种可能情况:
l 互相补充性的协作:从窗口提供比主窗口更加详细的信息,是对主窗口信息的补充。
l 控制性的协作:从窗口控制主窗口的进度,通常在主窗口完成需要花费较长时间的操作时提供具有控制功能的从窗口。
l 地位平等的协作:一个任务分割成几部分,不同部分在不同的窗口中完成。在执行过程中有可能需要参考各个任务的中间结果,所以它们之间应该能够交互。
上述这些情况在实际应用软件开发过程中都可能遇到,下面分别以典型例子来介绍。
一、在打开和关闭窗口时进行数据传递
窗口打开和关闭时进行数据的传递是一种基本的并且非常重要的窗口协作手段。可以使用两个函数和一个对象来完成这些工作。函数OpenWithParm和CloseWithReturn分别用来带参数打开窗口和带参数关闭窗口,这两个函数传递的参数使用对象Message的成员变量保存。使用它们可以构建多种形式的窗口协作。
函数OpenWithParm具有Open函数的功能,并且还能传递参数给要打开的窗口。该函数的语法如下:
OpenWithParm ( windowvar, parameter {, parent } )
其中windowvar是要打开的窗口名称,可以是Window画板中定义的窗口,也可以是脚本中定义的窗口变量;parameter是要传递的参数,只能是String,Numeric或者PowerObject类型,该参数根据类型保存在Message的成员变量中传递给要打开的窗口;parent是一个已经打开的窗口名称,该窗口要成为windowvar窗口的父窗口。函数执行成功返回1,否则返回-1。如果有参数为NULL则返回NULL。下面是以传递参数方式打开窗口的一些例子。
下面脚本打开窗口w_employee,并将“James NewTon”传递给该窗口:
OpenWithParm(w_employee, "James NewTon")
下面脚本在数据窗口的DoubleClicked事件中,把用户点击的数据行中的职工身份证号传递给w_detail窗口:
String ls_no
If row < 1 Then Return //用户点击的不是数据行
ls_no = GetItemString(row, "no") //获取身份证号
If Not IsNull(Ls_no) And Len(ls_no) > 0 Then
OpenWithParm(w_detail,ls_no)
End If
上面的脚本首先判断用户点击的是否有效数据行,使用DoubleClicked事件中的参数row是否大于0来判断,如果大于0则用户点击了有效的数据行。然后读取用户点击数据行中职工的身份证号,并将身份证号传递给w_detail窗口。在窗口w_detail中可以检索身份证号等于该参数的职工详细信息,这需要读取传递过来的参数。
对象Message是一个结构类型的全局变量,并有很多的成员变量。在传递参数时有三个成员变量用来读取传递的数据,它们是:
l Message.DoubleParm:用来传递Numeric类型的数据。
l Message.PowerObjectParm:用来传递PowerObject对象类型的数据,像数据窗口、按键、列表框和用户自定义的结构等都可以使用该变量进行传递。
l Message.StringParm:用来传递String类型的数据。
当使用函数OpenWithParm打开窗口后,应该在进行其他操作之前首先读取传递过来的参数,以免其他操作修改Message中的成员变量。例如,上述的双击数据窗口打开窗口w_detail后,在该窗口的w_detail中编写如下脚本:
String ls_no
ls_no = Mesasge.StringParm //读取传过来的参数
dw_1.SetTransObject(SQLCA)
dw_1.Retrieve(ls_no) //以ls_no为参数检索数据
在前面介绍设置MDI窗口中的工具条时,曾提到在调用通用工具条设置模块时,在菜单项的Clicked事件中使用函数OpenWithParm(parentwindow)把当前MDI窗口作为参数传递。在通用工具条设置模块的打开事件中编写如下脚本:
iw_window = Message.PowerObjectParm
… //其他处理
其中,iw_window为Window类型的实例变量,因为在该窗口的很多地方用到iw_window,所以应该定义成实例变量。
函数CloseWithReturn的作用是关闭指定的窗口,并且返回参数。该函数的语法格式是:
CloseWithReturn ( windowname, Returnvalue )
其中,windowname是要关闭的窗口的名称,一般是脚本所在的窗口的名称;Returnvalue是要返回的数值,和上述函数OpenWithParm的完全相同。函数正确执行返回1,否则返回-1,当有参数为NULL时返回NULL。
需要注意的是:只要是response类型的窗口,使用该函数就能有效地传递参数;该窗口不一定非得是用OpenWithParm打开的。在打开该response的窗口中可以读取传递过来的参数。例如,下面的例子中,窗口w_data中有按钮“检索学生数据”、“检索教师数据”和一个数据窗口dw_1;当用户点击按钮“检索学生数据”或者“检索教师数据”时,弹出response类型的窗口w_parm;用户在该窗口中输入要检索的学生或教师的姓名,点击该窗口w_parm上的“确定”按钮,然后返回到w_data窗口中,以用户输入的参数来检索数据。
在窗口w_data的按钮“检索学生数据”的Clicked事件中编写如下脚本:
String ls_name
OpenWithParm(w_parm, "student") //打开窗口w_parm
Ls_name = Message.StringParm //此处在关闭w_parm后继续执行
If Len(ls_name) > 0 Then Dw_1.Retrieve(ls_name)
在按钮“检索教师数据”的Clicked事件中编写如下脚本:
String ls_name
OpenWithParm(w_parm, "teacher") //打开窗口w_parm
Ls_name = Message.StringParm //此处在关闭w_parm后继续执行
If Len(ls_name) > 0 Then Dw_1.Retrieve(ls_name)
在窗口w_parm的Open事件中编写脚本:
If message.StringParm = "student" Then
st_1.text = "请输入要查找的学生姓名:"
Else
st_1.text = "请输入要查找的教师姓名:"
End If
在w_parm窗口的“确定”按钮的Clicked事件中编写如下脚本:
If Len(Trim(sle_1.text)) <= 0 Then
Beep(2)
MessageBox("提示", "请在编辑框中输入内容!",STopSign!)
Else
CloseWithReturn(Parent,sle_1.Text)
End If
在w_parm窗口的“取消“按钮的Clicked事件中编写如下脚本:
CloseWithReturn(Parent, " ")
总之,使用CloseWithReturn函数时一定要注意,只有被关闭的窗口是response类型才能有效地获取返回参数。
另外需要说明的一点是,某些情况下需要直接修改Message成员变量的取值才能正确返回值。比如,在一个数据窗口中,经常需要在窗口的CloseQuery事件中判断数据是否已经修改;如果修改,则直接保存,这时返回是否保存过数据的相应标记。在CloseQuery事件中使用函数CloseWithReturn不能正确返回值,只好直接修改Message成员变量的取值了。
窗口使用技巧系列文章--窗口之间的协作(上)
最新推荐文章于 2024-06-21 07:00:09 发布