pb数据窗口其他_第1页
pb数据窗口其他_第2页
pb数据窗口其他_第3页
pb数据窗口其他_第4页
pb数据窗口其他_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PB-数据窗口其他 / 标识当前行 标识当前行也就是给当前行加上醒目的标记,以便用户更清楚当前要对哪一 行数据进行操作,尤其当用户的操作中间有停顿时,继续进行操作就特别需要 知道哪个是当前行。这里的当前行不要狭隘地理解成仅仅是光标所在行。当翻 页时如果光标所在行不在当前页中,这时应该将当前页中的第一行置为当前行, 否则容易造成错觉;当删除数据时,不能自动改变当前行,此时应该使用脚本 设置当前行。 标识当前行的函数和方法很多,比较常用的有 SelectRow,SetRowFocusIndicaTor,数据窗口对象中的函数 CurrentRow 和 GetRow 等,还有很多可以在数据窗口对象中实现的方法。 使用 SelectRow 函数 这是最常用的一种方法。函数 SelectRow 的语法比较简单,重点要掌握需要在 哪些事件中编写脚本。函数 SelectRow 的语法是: dw_1.SelectRow(row,boolean) 其中,dw_1 是数据窗口控件名称;row 是要操作的行号,如果取值为 0 则表示 对数据窗口 dw_1 中的所有数据进行操作;boolean 表示是否选中数据,如果为 True 则表示选中 row 指定的行,如果为 False 则表示取消选中 row 指定的行。 函数正确执行返回 1,否则返回-1,如果有参数为 NULL 则返回 NULL。 当选中数据窗口中的一行数据时,数据行以蓝底白字显示。当用户在数据窗口 中使用上下光标键、或者 Tab 键、或者鼠标点击时,如果改变了光标所在行号 则这些操作都会触发数据窗口控件的 RowFocusChanged 事件。所以,在数据窗 口控件的 RowFocusChanged 事件中编写脚本来标识当前行,比仅在数据窗口的 Clicked 事件中编写脚本要全面得多。脚本如下: if currentrow 0 then dw_1.selectrow(0,false) dw_1.selectrow(currentrow,true) end if 另外,由于滚动垂直滚动条操作不能触发 RowFocusChanged 事件,如果翻页后 当前行不在当前页中,这样容易造成错觉,应该将当前页中的第一行设置为当 前行。在数据窗口控件的 ScrollVertical 事件中编写如下脚本: long ll_row ll_row = long(describe(“datawindow.firstrowonpage“) /当前页中第一行 的行号 if ll_row 0 then dw_1.setrowfocusindicator(hand!) dw_1.setrow(1) end if 在 ScrolVertical 事件中编写的脚本和上面的“使用 SelectRow 函数”中介绍 的完全相同。 使用 CurrentRow 和 GetRow 两个函数 在数据窗口对象中实现标识当前数据行的方法和在窗口中编程类似,也是通过 数据窗口控件的 RowfocusChanged 事件来触发函数,只是触发的是数据窗口对 象中的函数。所以,在数据窗口对象中放置函数后,还得在窗口的 ScrollVertical 事件中编写脚本,事件和上面介绍的完全相同。程序运行时的 效果和在数据窗口对象中编程效果完全相同。 GetRow()函数返回的是表达式触发的行号,CurrentRow 函数返回的是当前行的 行号,他们都没有参数,返回值都是 long 类型的行号。使用这两个函数并配合 其他的部件可以标识当前行。 通过修改当前行上 text 控件的可视性实现标识当前行,给用户的感觉好象当前 行的边框发生了改变。首先,在 Detail band 中放置一个 Text 控件,删除该控 件中的“text”,设置其外观为 3d Rasied,将其背景修改为和字段中的数据 不同的颜色,将 Text 控件的 sent to back 选中,在该 Text 控件的属性视窗中 为 visible 属性输入如下表达式: if(currentrow() = getrow(),1,0) 该表达式的作用是在当前行获得焦点时显示 Text 控件,否则禁止显示 Text 控 件,加宽该 Text 控件使其正好能够覆盖所有的字段,最好 Text 的边框能够显 示出来,不被字段覆盖;设置所有字段的边框类型以增强显示效果,设置为无 边框。注意,如果字段边框和 Text 边框设置不当,则显示效果不一定明显。 这种显示风格可以使用户很清楚当前要处理的是哪一行,尤其在处理工作中间 有停顿的情况下特别有用。当然,要观看这种效果,数据窗口中至少应该有一 个字段的 Tab Order 值不为 0,否则不能改变当前行,也就无法获得运行效果 了。 对上面的方法稍微变通一下,可以直接为所有要显示的字段的 Border 属性定义 表达式。当前行获得焦点时所有字段是一种边框风格,当失去焦点时又是另外 一种风格。这样也可以实现标识当前行,但是如果字段较多,设置起来就比较 烦琐。比如,可以为所有字段定义如下表达式: if(currentrow()=getrow(),1,0) 该表达式的含义是当前行字段的边框类型为 1(即 Shadowbox 类型),非当前行 则为 0(即无边框)。 改变背景或者前景 和上面的方法类似,也是利用 GetRow 和 CurrentRow 两个函数在数据窗口对象 中实现改变背景或前景颜色。需要为每个字段都规定前景和背景颜色,在每个 字段的 Background.color 属性中都输入表达式: if(getrow()=currentrow(),rgb(255,0,0),rgb(255,255,255) 然后,在数据窗口控件的 ScrollVertical 事件中编写和上述作用 SelectRow 函 数中介绍的完全相同的代码即可。 / 显示指定条件的数据 将符合特定条件的数据全部显示在数据窗口中,在大多数情况下是可以的,这 不需要做什么工作。但是要同时将符合特定条件的和不符合这些条件的数据显 示在数据窗口中,以便比较分析,这就需要一定的编程。关键是使用一定的方 法来标识符合条件的数据。 通过修改前景、背景颜色 要以特殊背景(或前景)颜色显示符合固定条件的数据行时,这种情况比较简 单。可以在数据窗口创建时在字段的属性中把前景和背景颜色赋予固定的表达 式。比如某数据窗口要醒目显示女职工信息,正常显示为黑色前景、灰色背景, 醒目显示为红色前景、灰色背景,可输入如下表达式: BackGroundColor:If(sex=“女“,RGB(255,0,0),RGB(0,255,0) 当需要特殊显示背景(或前景)颜色的数据行的条件是由用户动态指定时,就 需要做一些编程工作。在用户改变查询条件的操作中,同时动态修改数据窗口 的前景和背景表达式,这样就可以做到背景颜色和条件一起变化。例如,在窗 口 w_browse 中有两个控件:下拉列表框 ddlb_filter 用来列出数据库中所有的 职称;数据窗口 dw_1 显示相应的数据。当用户在下拉列表框 ddlb_filter 中选 择不同的职称(在数据窗口中职称字段名称为 zc)时,数据窗口 dw_1 中就用特 殊背景颜色标识相应职称的职工数据,可在下拉列表框 ddlb_filter 的 SelectionChanged 事件中编写如下脚本来实现该功能: Int li_count,li_index String ls_ErrMsg dw_1.SetRedraw(False) /首先得到该数据窗口的列数 li_count = Integer(dw_1.Object.DataWindow.Column.Count) /对每一列的前景、背景表达式进行修改 For li_index = 1 To li_count ls_ErrMsg = dw_1.ModIfy(“#“ + String(li_index) + “.Background.Mode = 0“) If ls_ErrMsg “ Then MessageBox(“提示“,“不能改变字段的背景颜色rn“ + ls_ErrMsg) End If Next dw_1.SetRedraw(True) 通过修改设置位图 通过修改设置位图显示指定条件的数据时也有查询条件固定和不固定两种情况。 对于固定条件的可以在数据窗口创建时输入位图的 Visible 表达式,对于条件 不固定的可以在用户更换查询条件后使用函数 ModIfy()动态地修改数据窗口中 位图属性的表达式来实现。 在数据窗口的最左边放置一个位图部件,并修改其 Visible 属性为一个条件表 达式即可。例如,在显示职工数据的数据窗口对象中放置 picture 控件后,需 要在所有女职工数据行上显示该 picture,可以在定义 picture 的 Visible 属 性中输入如下表达式:If(sex=女,1,0) 通过修改边框类型 当查询条件固定时,可以在数据窗口创建时输入边框(Border)表达式。比如, 可以在字段的 Border 属性中输入如下表达式来标识女职工:If(sex=女,5,0) 当字段比较多时逐个设置所有的字段比较烦琐。可以像前面介绍的那样,通过 放置一个可以覆盖所有字段的计算域、并为该计算域的 Visible 属性定义相关 的表达式即可。注意,需要将该计算域的数据颜色和背景颜色设置为相同颜色, 并且边框类型设置为和字段反差比较大的类型,比如,当字段都没有边框类型 时将该计算域的边框设置为 Rasied 类型。这样也可以实现类似的效果。比如, 要标识所有女职工,可以定义计算域的 Visible 属性为如下表达式:If(sex= 女,1,0) *这里只能放置计算域,或者放置数据表中其他不需要显示数据的字段,而不能 放置其他控件。因为,需要为每一行创建一个对象,每一行相同的控件的属性 是相同的,而不同行的字段或者计算域的属性可以不同。 通过选中标记来标识符合条件的行 对所有符合特定条件的数据逐行选中,以选中标记来标识符合特定条件的数据。 比如,可以为用户提供一个查询窗口,在该窗口中用户选择了不同的查询条件 后,首先使其他所有行处于不选中状态,然后再根据用户条件选中所有符合条 件的数据行。比如下拉列表框 ddlb_filter 中放的是数据库中所有职工的职称 (zc),用户选择不同的职称可以在数据窗口 dw_1 中用选中标记来标识具有该 职称的所有职工的数据。在下拉列表框的 SelectChanged 事件中编写如下脚本: Int li_index dw_1.SelectRow(0,False) For li_index = 1 To dw_1.RowCount() If dw_1.GetItemString(li_index,“name“) = This.Text Then dw_1.SelectRow(li_index,True) End If Next / 用回车键代替 Tab 键 创建一用户事件来响应数据窗口的 pbm_dwnprocessenter 事件,在该事件中加 入下面程序: Send(Handle(this),256,9,long(0,0) /发送处理 Tab 键的信息 Return 1 /忽略 Enter 键的处理 例如,下面的脚本在相应数据窗口的 pbm_dwnprocessenter 用户事件中编写, 用来检查数据窗口中录入数据的各种情况,并执行相应的程序。 (1)当返回负值时 肯定某列存在错误,这时既不处理 Enter 键也不处理 Tab 键。 (2)当返回非负值时 a)如果是最后的行列则应该在按回车键时插入一行,并使光标定位到新行的第 一列上。 b)如果不是最后行列则应该发送 Tab 信息,屏蔽 Enter 键的处理。 if this.accepttext() 180,0,1) 但是用户如何知道哪行可修改哪行不可以呢?可以使用前面介绍的标识特定条 件的数据技术来标识这些不能修改的数据。例如,把可修改行的背景颜色改为 红色,不可修改的背景改为灰色,可以在字段的 BackgroudColor 属性中输入表 达式: If(gwgz 0 Or dw_1.DeletedCount() il_LastRow Then For ll_index = il_LastRow To Ll_CurRow /逐行选中 This.SelectRow(ll_index,True) Next Else For ll_index = Ll_CurRow To il_LastRow This.SelectRow(ll_index,True) Next End If Else /原来没有选中过数据 This.SelectRow(Ll_CurRow,True) /只选中当前行 End If il_LastRow = Ll_CurRow /保存当前行 Elseif KeyDown(KeyControl!) Then /如果按下了 Ctrl 键 If This.IsSelected(Ll_CurRow) Then /如果是已选中行 SelectRow(Ll_CurRow,False) /取消该行 Else /如果不是选中行 SelectRow(Ll_CurRow,True) /选中该行 End If il_LastRow = Ll_CurRow /保存当前行 Else /什么键也没有按下 This.SelectRow(0,False) /取消其他所有行 This.SelectRow(Ll_CurRow,True) /选中当前行 il_LastRow = Ll_CurRow /保存当前行 End If #如何处理选中的数据 允许多行选择时,从数据窗口的第一行扫描到末行,判断每行是否选中,如果 选中则提取相应字段;只允许选择一行时只要取当前行中的相应字段即可。比 如,下面的脚本读取数据窗口 dw_1 中所有选中行的 name 字段的取值: Long ll_CurRow String ls_name For ll_CurRow = 1 To dw_1.RowCount If dw_1.IsSelected(ll_CurRow) Then ls_temp = dw_1.GetItemString(ll_CurRow, “name“) /再进行其他相关的处理 End If Next #还有一种提取所有选中数据的方法是使用数据窗口对象属性来获得。例如,要 读取所有选中行的 salary 字段的值: Long ld_salary ld_salary = dw_1.Object.salary.Selected /再进行其他相关的处理 经过以上选择处理,数据窗口已经完全具备了列表框的功能了,只需在窗口的 Open 事件中给数据窗口设置事务对象然后检索就可以提取数据了,当要动态改 变其中的数据时,只要设置过滤规则进行过滤即可。因为可以在数据窗口控件 中提供多行数据,其中一行作为对应列表框中的数据,其他作为解释或者提示 信息即可,这样才能更大地发挥数据窗口作为列表框的优势。 / 当数据窗口中的数据来自不同的数据表时,一般只让用户查看数据,或者只让 用户修改其中一个数据表中的数据,这样可以不用编写任何脚本就能实现。但 是,特殊情况下需要修 改多个数据表中的数据,因为数据窗口对象不能同时修改两个数据表,只能编 写脚本来实现该功能。 用脚本实现一个数据窗口对象修改多个数据表的数据,编程思想是动态修改数 据窗口的 Update 相关属性。实际上,数据窗口修改数据表是根据在 DataWindow 画板中 指定的属性进 行修改的,这些属性在运行时可以由脚本修改,从而让数据窗口修改完一个数 据表后再修改另一个数据表,直到修改完所有需要修改的数据表。需要注意的 一点是,数据窗口中每一行都有一个修改标志(可以使用函数 GetItemStatus 来 读取该标志),当数据提交后数据窗口自动清除该标志,所以当需要修改多个数 据表时,在没有修改完所有的数据表之前不能清除每一行的标志。函数 dwcontrol.Update(accept,resetflag)中的参数 resetflaf 为 boolean 类 型,取值为 False 表示不修改数据行的行标志。下面的脚本示例了在一个 DataWindow 中修改它所对应的多个表,该数据窗口的字段来自两个表,语句如 下: select department.dept_id,department.dept_name,employee.emp_id,employee.emp_ fname,employee.emp_lname from department,employee 在创建数据窗口时设置为 Department 表可修改。所以,程序运行时可以首先修 改 Department 表,如果修改数据表成功,则进行第二个数据表的修改。首先设 置要修改第二个数据表的哪些字段、哪些字段作为主键、要修改的数据表表名, 然后使用 update 语句开始修改数据表。如果第二个数据表修改成功,则再修改 第三个数据表,直到修改完所有的数据表。在本例中只有两个数据表要修改, 脚本如下: integer li_resultupdate li_resultupdate = dw_1.update(true,false) /接受最后一个字段内容,并 不清 /除行修改标志,如果对 department 表的修改成功,下一步就要修改另 一个表 employee if li_resultupdate = 1 then /首先,关掉对 department 表的修改 dw_1.modify(department_dept_name.update = “no“) dw_1.modify(department_dept_id.update = “no“) dw_1.modify(department_dept_id.key = “no“) /使 employe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论