第13章动态数据窗口数据窗口对象可以在数据窗口画板中创建,但这是静态数据窗口对象。为了增加应用程序的适应性和通用性,经常要求应用程序在运行时能够动态修改数据窗口的形式和内容,或者创建新的数据窗口对象,这就需要使用动态数据窗口技术。13.1动态指定数据窗口对象一个数据窗口控件对应一个数据窗口对象,完成固定的查询。这时是在窗口画板中选择数据窗口控件,然后在数据窗口控件的Properties窗口General标签页中的DataObject属性编辑框中指定一个已经设计好的数据窗口对象。而有时有如下情况:一个应用程序有很多查询,这些查询有类似的界面;为了某种目的,希望在一个界面中能够完成所有的查询;为了利用可重用的特性提高软件的质量等等。这个时候界面是类似的,数据窗口对象是事先设计好的,只是数据窗口控件与数据窗口对象的关联要在应用程序运行时指定。这时只要在适当事件中包含如下语句dwcontrol.DataObject=dwobject其中dwcontrol是数据窗口控件名;DataObject是数据窗口控件的属性,其值为关联的数据窗口对象;dwobject是用字符串指定的数据窗口对象名。结束放映第一页上一页下一页最后一页13.1动态指定数据窗口对象例如:要开发一个应用系统,其中有雇员信息和客户信息两种查询,可按如下思路设计应用。1.设计一个可视用户对象,含有若干公共控件,其中包括数据窗口控件。2.用继承的方法建立各查询界面,并为数据窗口控件指定相应的数据窗口对象。为此首先设计祖先窗口w_super,图中有一个数据窗口控件、两个命令按钮,两个命令按钮上显示的文本分别是开始和退出,在该窗口的Open事件脚本中有连接数据库的语句://profileEASDemoDBV4SQLCA.DBMS=ODBCSQLCA.AutoCommit=FalseSQLCA.DBParm=ConnectString='DSN=EASDemoDBV4;UID=dba;PWD=SQ1'Connect;为命令按钮“开始”的Clicked事件编程如下:dw_1.SetTransobject(sqlca)dw_1.retrieve()结束放映第一页上一页下一页最后一页13.1动态指定数据窗口对象为命令按钮“退出”的Clicked事件编程如下:close(parent)然后用继承的方法(单击PowerBar上的Inherit按钮)建立窗口w_employee(查询雇员信息的窗口)和w_custom(查询客户信息的窗口)。为w_employee窗口的Open事件编写语句:dw_1.dataobject=d_employee其中d_employee是已经建立好的数据窗口对象。为w_custom窗口的Open事件编写语句:dw_1.dataobject=d_custom其中d_custom是已经建立好的数据窗口对象。13.2动态建立数据窗口对象使用数据窗口控件的Create函数动态创建数据窗口对象。Create函数的格式如下:dwcontrol.Create(syntax{,errorbuffer})结束放映第一页上一页下一页最后一页13.2动态建立数据窗口对象其中参数dwcontrol是数据窗口控件名;syntax是用字符串给出的创建数据窗口对象的源代码;errorbuffer(可选项)是一字符串变量,用于保存创建数据窗口对象过程中出错时的错误信息,如果没有指定该项则使用信息框显示错误信息。Create函数用指定的源代码动态创建数据窗口对象,并用新的数据窗口对象取代数据窗口控件中原有的数据窗口对象。事实上,数据窗口对象的源代码是非常复杂的,我们几乎不可能自己来直接设计这些源代码。PowerBuilder为我们提供了源代码编辑器,对于那些PowerBuilder高手则可以直接在源代码编辑器中完成一些特殊的设计和修改。打开源代码编辑器的方法是:1.单击PowerBar上的Open按钮打开Open对话框。2.在Target下拉列表框中选择目标,在Libraries列表框中选择库文件,在Using下拉列表框中选择SourceEditor(源代码编辑器,默认是Painter,即画板),在ObjectsofType下拉列表框中选择DataWindows。3.最后在ObjectName文本框中选择要打开的数据窗口对象,并单击Ok按钮,则在源代码编辑器中就会打开所选择的数据窗口对象的源代码。结束放映第一页上一页下一页最后一页13.2动态建立数据窗口对象另外还可以用以下方法获得或产生数据窗口对象的源代码:1.使用Describe函数,通过访问数据窗口对象的Syntax属性获得数据窗口对象的源代码,例如语句:mle_1.text=dw_1.Describe(“datawindow.syntax”)其中mle_1是用来显示数据窗口对象源代码的多行编辑器。2.使用LibraryExport函数从PowerBuilderL库文件中导出数据窗口对象的源代码,例如语句:mle_1.text=LibraryExport(“demo.PowerBuilderl”,”d_employee”,ExportDataWindow!)从库文件demo.PowerBuilderl导出数据窗口对象d_employee的源代码。3.在Library画板中,使用导出功能(选择了要导出的对象后,单击PainterBar上的Export按钮或者选择菜单“Entry→LibraryItem→Export”)将数据窗口对象的源代码导出到一个文件中(结果为文本文件)。4.使用DataWindowsSyntax工具获得数据窗口对象的源代码(见13.3节)。5.使用SyntaxFromSQL函数根据SQLSELECT语句生成数据窗口对象的源代码。结束放映第一页上一页下一页最后一页13.3动态修改数据窗口对象一般使用Modify函数动态修改数据窗口对象,该函数的格式是:dwcontrol.Modify(modstring)其中参数dwcontrol是数据窗口控件名:modstring是修改数据窗口对象的源代码(字符串),该参数有三种格式:·Objectname.property=value:修改属性·CREATEobject(settings):添加新对象到数据窗口对象中·DESTROY[COLUMN]object:从数据窗口对象中删除列或对象需要说明的是modstring的语法格式是非常复杂的,让开发人员掌握这种语法几乎是不可能的,但是PowerBuilder提供了一个内置工具DataWindowSyntax可以为我们生成所需要的modstring。DataWindowSyntax工具是PowerBuilder内置的应用程序,它的作用就是为开发人员生成Modify、SyntaxFromSQL、Describe函数所需要的语法。DataWindowSyntax工具被集成在New对话框的Tool标签页中,从Tool标签页中选择DataWindowSyntax则可以启动DataWindowSyntax应用程序,该应用程序为适应Modify、SyntaxFromSQL、Describe函数有若干不同界面,可以通过syntex菜单来选择。结束放映第一页上一页下一页最后一页13.3.1添加对象到数据窗口可以使用Modify函数动态向数据窗口中添加对象(如列、计算域、图片等),添加对象的Modify函数的语法格式如下:dwcontrol.Modify(CREATEobject(Setting))其中CREATE是关键字,表示在数据窗口中建立新对象;object指出新建立的对象类型,如compute(计算列)、Button(命令按钮)等;Setting给出要创建对象的一组属性及其值。参数Setting的指定比较复杂,尽管可以从DataWindowSyntax工具中得到基本语法格式,然后进行编辑修改。例如:某数据窗口中有Salary(工资)列,一般情况下不需要显示工资合计信息,但是在某些情况却需要汇总信息,这时就可以考虑在程序运行时为数据窗口动态增加一个计算域,可以编写如下程序代码:stringls_settingls_setting=compute(band=summaryalignment='0'+&expression='sum(salaryforall)'border='0'color='0'+&x='654'y='64'height='76'width='741'format='[GENERAL]'+&name=compute_1font.face='Arial'font.height='-12'font.weight='400'+&Font.family='2'font.pitch='2'font.charset='0'+&background.mode='2'background.color='16777215')dw_1.Modify(create+ls_setting)结束放映第一页上一页下一页最后一页13.3.2删除数据窗口中的对象程序运行时也可以使用Modify函数动态删除数据窗口中的对象,Modify函数的格式是:dwcontrol.Modify(DESTROY[COLUMN]object)其中DESTROY是关键字,说明要删除数据窗口中的对象;COLUMN也是关键字,说明要删除的是数据列;object指出具体要删除的对象名。例1:假设在数据窗口dw_1中有一个名称为p_1的图片,如下语句可以动态删除该图片:dw_1.Modify(destroyp_1)例2:假设在打开窗口时通过检查用户名,确定该用户不能查看工资信息,那么可以用如下语句删除窗口中的工资(salary)列:dw_1.Modify(“destroycolumnsalary”)结束放映第一页上一页下一页最后一页13.3.3修改数据窗口对象的属性某些应用程序可能需要在运行时能够动态改变数据窗口对象的外部特征(例如在浏览数据窗口中的数据时,为了便于浏览和对比可以使不同范围的值以不同的颜色显示),这些要求可以通过动态修改数据窗口对象的属性来实现。动态修改数据窗口对象属性的Modify函数的格式是:dwcontrol.Modify(“objectname.property=value”)其中objectname指出对象名;property指出属性名;value给出具体的属性值。注意:如果有多层属性,可以用圆点表示法表示下去。动态修改数据窗口对象属性的应用非常广泛,下面通过一个例子加以说明。例1:假设数据窗口数据源的原始SQLSELECT语句不包括WHERE子句,在应用程序运行时通过单行编辑框sle_1输入任意查询条件,然后动态地为原始SQLSELECT语句增加WHERE条件。为此,首先说明一个实例变量:stringoriginal_select在窗口的Open事件中包括了如下语句:dw_1.settransobject(sqlca)//得到原始的SQLSELECT语句original_select=dw_1.Describe(DataWindow.Table.select)在命令按钮下编写如下语句即可实现查询:结束放映第一页上一页下一页最后一页13.3.3修改数据窗口对象的属性stringmod_stringmod_string=DataWindow.Table.Select='&+original_select+where+sle_1.text+'dw_1.Modify(mod_string)dw_1.Retrieve()结束放映第一页上一页下一页最后一页