《管理信息系统程序设计》实验指导书
数据窗口控件dw_1
图 2.2 祖先窗口的设计界面
(3) 为窗口的“Resize”事件编写代码:实现数据窗口控件的大小随窗口的大小同步变化的功能。
具体代码如下:
// 窗口w_base的Resize事件代码 // 让数据窗口控件与窗口同步调整大小 dw_1.width = this.width – 38 // 38为调整系数 dw_1.height = this.height – 108 // 108为调整系数 (4) 用“w_base”为窗口名保存当前窗口,并进行相关测试。
提示: 在为应用程序对象的“Open”事件编程之前,所有窗口的运行测试都需要通过在
“Workspace”视图中选择窗口对象的右键菜单中的“Run/PreView”命令进行。
2) 在祖先窗口中添加功能函数
我们所谓的信息管理主要是指对数据的浏览、重载、编辑、添加、删除、更新、查找、排序、以及过滤等操作。为了实现这些功能,我们需要在祖先窗口中添加相应的事件或者函数(等同在窗口中添加按钮控件来实现这些功能),并为其编写代码,这样用继承方式创建的窗口就能自动继承了这些功能,从而大大降低我们的编程强度。
在祖先窗口中我们采用函数的方式来实现管理窗口对数据的操作功能。具体需要添加的窗口函数定义如表2.1所示。
说明:函数的类型定义为“Public”(公共函数)是为了在菜单中调用这些函数;这些函数都没有设置返回值,主要是因为这些函数都只是执行一些操作过程,如果操作中有错函数会调用MessageBox()函数显示相关信息,没有必要通过返回值传递信息。
表 2.1 祖先窗口中的功能函数
函数类型 public public public public public public public 返回值 none none none none none none none 函数名 do_edit () do_reload () do_filter () do_find () do_sort () do_showrow () do_editmode () 参数 readonly string mode (无) (无) (无) (无) readonly string mode 功能 处理添加、删除和更新操作 为数据窗口重新读取数据 处理数据过滤操作 处理数据查找操作 处理数据排序操作 处理记录行的显示 readonly window actwin 设置管理窗口的操作方式 - 30 -
《管理信息系统程序设计》实验指导书 readonly boolean mode public none do_print () (无) 处理数据的打印操作 为祖先窗口添加功能函数
在窗口中定义函数的步骤如下:
(1) 在窗口画笔中选择“Script”(代码编辑)视图。
(2) 在“Script”视图上方最左边的下拉列表框中选择“(Functions)”,在中间的下拉列表框中选择
“(New Function)”,进入函数定义界面,如图2.3所示。
显示或隐藏函数定义界面 图 2.3 函数定义界面
(3) 在函数定义界面中输入函数的相关信息。如果需要增加函数的参数,可以在该界面中单击右键,
从快捷菜单中选择“Add Parameter”或者“Insert Parameter”命令,删除参数选择“Delete Parameter”命令。
(4) 函数的代码可以在下面的编辑框中输入。
提示: 在定义函数后,如果需要对其类型、返回值、参数进行调整,可在“Script”视图中先选
择该函数,并单击按钮(如图2.3所示),显示该函数的定义界面,然后进行修改。如果再次单击按钮,将隐藏函数的定义界面。
按照上述步骤依次在祖先窗口“w_base”中添加将表2.1所列出的所有函数。 编写功能函数的代码
各功能函数的具体代码如下: ? do_reload ( )
dw_1.retrieve() // 载入数据 if dw_1.rowcount() > 0 and & dw_1.object.datawindow.readonly = \dw_1.selectrow(1, true) // 高亮显示第一条记录 end if ? do_showrow ( )
- 31 -
《管理信息系统程序设计》实验指导书 // 设置数据窗口的当前显示行 choose case mode case \ // 显示第一条记录 dw_1.scrolltorow(1) dw_1.scrollpriorpage() dw_1.scrollnextpage() dw_1.scrolltorow(dw_1.rowcount()) case \ // 显示上一页记录 case \ // 显示下一页记录 case \ // 显示最后一条记录 end choose ? do_editmode ( )
long row dw_1.object.datawindow.readonly = not mode // 设置数据窗口的操作方式 if mode then // 进入编辑方式 row = dw_1.getselectedrow(0) if row > 0 then dw_1.selectrow(row, false) // 取消当前记录原有的高亮显示 actwin.title = dw_1.tag + \—编辑状态\ // 在窗口标题上显示操作方式 row = dw_1.getrow() if row > 0 then dw_1.selectrow(row, true) // 高亮显示当前记录 actwin.title = dw_1.tag + \—浏览状态\ // 在窗口标题上显示操作方式 else // 进入浏览方式 end if ? do_edit ( )
int rc long row string t1 = \操作提示\string t2 = \数据库错误\string m1 = \请先选择要删除的记录行!然后重试...\// 续 string m2 = \当前操作将删除选中的记录行!请确定...\ choose case mode // 根据调用者传递的mode参数执行相应的操作
- 32 -
case \// 删除操作 row = dw_1.getrow() // 获得要删除行的行号 case \// 添加操作 row = dw_1.insertrow(0) dw_1.scrolltorow(row) dw_1.setfocus() 《管理信息系统程序设计》实验指导书 case \ // 更新操作 rc = dw_1.update() // 获得更新操作的结果 if rc > 0 then // 更新成功 // 提交失败 COMMIT USING SQLCA; // 向数据库提交修改 if SQLCA.SQLCode < 0 then messagebox(t2, \错误号=\\原因为:\// 显示错误信息 Halt Close // 终止应用程序 if row = 0 then // 如果没有选定删除行显示提示信息 messagebox(t1, m1, Exclamation!, OK!) dw_1.selectrow(row, true) // 加亮删除行 if messagebox(t1, m2, Question!, OKCancel!, 2) = 1 then else dw_1.selectrow(row, false) // 否则取消行的选中状态 end if dw_1.deleterow(row) // 删除选中行 else // 选定了删除行则显示确认删除信息 end if end if ROLLBACK USING SQLCA; if SQLCA.SQLCode < 0 then // 撤消所有修改 // 回滚失败 else // 更新失败 messagebox(t2, \错误号=\\原因为:\// 显示错误信息 Halt Close // 终止应用程序 end if end if end choose ? do_find ( )、do_sort ( )、do_filter ( )、do_print ( )
messagebox(\系统提示\该项功能正在开发中...\ 提示: 查找、排序、过滤、打印等功能请读者自行编写。编写时可参看“7.7 数据窗口综合设计
实例”一节的相关内容。
在祖先窗口中依次输入这些功能函数的代码。
3) 编写祖先窗口的其它代码
在创建功能函数后我们可以在祖先窗口以及数据窗口控件的相关事件中调用这些函数来实现对应功能。下面我们为窗口和数据窗口控件编写事件代码。
(1)窗口事件代码 ? open
- 33 -
《管理信息系统程序设计》实验指导书 // 初始化数据窗口 dw_1.settransobject(SQLCA) this.do_reload() // 载入数据 dw_1.tag = this.title // 在tag属性中保存窗口标题 this.do_editmode(this, false) // 数据窗口设为只读 // 分配事务对象 ? closequery
// 防止窗口的误关闭操作 int rc string t1 = \操作提示\string m1 = \窗口中存在未更新的数据!退出前是否更新数据库?\ // 检查是否存在未更新的数据 if dw_1.modifiedcount() > 0 or & dw_1.deletedcount() > 0 then choose case rc case 1 // 先更新数据库,然后再退出 this.do_edit(\return 0 // 不更新数据库退出 // 不关闭窗口,返回操作界面 return 0 return 1 // 有变动或删除的记录行 rc = messagebox(t1, m1, Question!, YesNoCancel!) case 2 case 3 end choose end if (2)数据窗口控件的事件代码 ? dberror
// 定义错误信息 string t1 = \数据库错误\string m1 = \错误号=\原因为:\ // 显示错误信息 messagebox(t1, m1, StopSign!) // 终止应用程序 Halt Close ? rowfocuschanging ( )
// 仅在数据窗口处于浏览方式时执行 if dw_1.object.datawindow.readonly = \ dw_1.selectrow(currentrow, false) // 去掉当前行高亮显示 dw_1.selectrow(newrow, true) // 加亮用户新选择的行 end if
- 34 -