编写行选择函数

函数

我们在数据窗口中需要进行行选择操作,如用户为了修改数据或看到更详细的内容而选择了某一行;在另一些情况下,用户可能要同时删除或修改多行,这时,我们需要有使用户在一个数据窗口中同时选择多行的功能。这在PowerBuilder中是相当容易做到的,但是,如果在一个数据窗口祖先中没有标准的函数来处理这些,而在每个窗口中重复编程,就非常麻烦。 我们首先来看一看进行行选择的不同方法。 ·所有行都不加亮通常情况下数据窗口不加亮任何行。这对于那些只允许用户进行滚动和查看的数据列表或那些单行的数据窗口是合适的。 ·单行选择单行选择意味着用户在同一时间只能选择一行来执行一些动作,如删除或在主从关系的列表中显示详细信息,这是非常有用的。下面是实现单行选择功能的代码: Event: RowFocusChangedif GetRow() > 0 then SelectRow( 0, FALSE ) SelectRow( GetRow(), TRUE )end if·多行的自动选择多行的自动选择表现为:当用户点击一个未加亮的行时,该行将变亮;反之,用户点击一个加亮行,该行将不加亮。为了实现上述功能,在RowFocusChanged事件中加入如下代码: Event:RowFocusChangedObject: Any DataWindowif GetRow() > 0 then if IsSelected( GetRow() ) then SelectRow( GetRow(), FALSE ) else SelectRow( GetRow(), TRUE ) end ifend if或者简化成为下面的一行代码: if GetRow() > 0 then SelectRow( GetRow(), NOT IsSelected( GetRow()))·shift、control或control+shift+鼠标的使用Windows的文件管理器或其它Windows程序中,您可以使用Shift、Control或Control+Shift这种键盘与鼠标的组合来选择。PowerBuilder在数据窗口中没有提供这样的能力,我们必须自己实现。 我们应当实现的组合功能是: 要建立这样的功能,数据窗口必须记录当前的起始行。我们声明这样一个实例变量: protected long il_ anchor _ row当用户点击鼠标或进行了键盘操作时,我们要测试用户是否同时按下了Shift或Control键,方法是用KeyDown()函数,检查有没有KeyShift!和KeyControl!,如有这样的键按下则记录起始行。 编写行选择函数 为了在用户点击鼠标或进行键盘操作时使上述行为发生作用,我们必须在Clicked事件和一个映射到Pbm _ dwnkey事件的自定义用户事件中调用我们自己的行选择函数。这样,不管用户是点击鼠标还是击中键盘,选择行为都会发生。我们也可以将这个功能放入RowFocusChanged事件中。 为了使这个行选择功能可重用,这里我们建立两个函数。一个函数设置我们希望的选择行为类型,另外一个真正执行该选择行为。首先我们使用一个实例变量来设定选择行为的值: protected integer ii _ select_ behavior这个变量中将存放下面的一些值。 可能发生的选择行为 值 行为 0 不允许选择行为 1 只允许有一行选中 2 自动实现多行选择 3 允许使用鼠标和键盘组合选择 99 不允许选择,将鼠标变成手型 如果使用的是保护变量或私有变量,这就意味着本对象以外的程序无法访问,因此必须为其他程序员建立对这些变量赋值和获取这些变量值的函数。 另外,还需要一些函数来执行基于该变量的过程。 函数:uf_SetSelect(Select_behavior)我们要写的第一个函数将允许程序员设置选择行为。 函数: public integer uf_ SetSelect( integer ai_ select_ behavior)/* 本函数设置数据窗口的选择行为值 下列为有效的选择行为值 */CHOOSE CASE ai_select_behavior CASE 0, 1, 2, 3, 99 ii_ select_ behavior = ai_ select_ behavior // 至少一行将被选中 if ai_ select_ behavior = 1 then uf_ process_ select( GetRow(), "Keyboard" ) end if if ai_ select_ behavior = 99 then SetRowFocusIndicator(Hand!) else SetRowFocusIndicator(OFF!) end if return 0 CASE ELSE return -1 END CHOOSE 一旦选择类型被设置,所有的行都必须被处理。我们把这部分代码放入一个叫作uf_ ProcessSelect的函数中。这个函数处理选择行为。我们需要告诉该函数要处理的行和该请求是通过鼠标还是键盘发出的。下面是该函数代码: 函数:uf_ ProcessSelect(long al_ row, string as_ input_ type) long l_ row boolean b_ reset_ anchor boolean b_ keyboard, b_ mouse // 鼠标动作还是键盘动作? if Upper(left(as_input_type,1)) = "K" then b_ keyboard = TRUEelse b_ mouse = TRUEend if/* 确认鼠标点在了数据窗口的记录上*/if al_ row < 1 Then Return -1/* 是否要确定起始行 */b_ reset_ anchor = TRUESetRedraw(FALSE)CHOOSE CASE ii_ select_ behavior CASE 0, 99 // 无 CASE 1 // 单行选中 SelectRow(0,FALSE) SelectRow(al_row,TRUE) CASE 2 // 多行选中 if b_ mouse then SelectRow(al_ row, NOT IsSelected( al_ row )) end if CASE 3 if keyDown(KeyShift!) and KeyDown(KeyControl!) then if il_anchor_row > al_row then FOR l_ row = il_ anchor_ row TO al_ row STEP -1 this.selectrow(l_row,TRUE) NEXT else FOR l_ row = il_ anchor_ row TO al_ row this.selectrow(l_row,TRUE) NEXT end if elseif KeyDown(KeyShift!) then SelectRow(0,FALSE) IF il_ anchor_ row > al_ row then FOR l_ row = il_ anchor_ row TO al_ row STEP -1 this.selectrow(l_ row,TRUE) NEXT else FOR l_ row = il_ anchor_ row TO al_ row this.selectrow(l_row,TRUE) NEXT end if b_ reset_ anchor = FALSE elseif Keydown(KeyControl!) then SelectRow( al_row, NOT IsSelected( al_row ) ) else SelectRow(0,FALSE) SelectRow(al_ row,TRUE) end ifEND CHOOSESetRedraw(TRUE)if b_ reset_ anchor then il_ anchor_ Row = al_ rowreturn 0现在,要执行行选择时,只需调用uf_ProcessSelect()函数。一般当用户在一个数据窗口中点击了鼠标或是按下了上、下箭头键时,调用这个函数。另外还有捕获home和end键的代码。下面是we_keydown用户事件映射到Pbm_dwnkey事件中的代码: Event: we_ keydown (pbm_dwnkey) Object: Any DataWindow if KeyDown(KeyDownArrow!) and GetRow() <> RowCount() then uf_ processSelect( GetRow() + 1 , "Keyboard") elseif KeyDown(KeyUpArrow!) and GetRow() <> 1 then uf_ processSelect( GetRow() - 1 , "Keyboard") elseif KeyDown(KeyHome!) and RowCount() > 0 then uf_ processSelect( 1, "KeyBoard") elseif KeyDown(KeyEnd!) and RowCount() > 0 then uf_ processSelect( RowCount(), "Keyboard") end if最后,我们需要在clicked事件中加入: uf_ processSelect(GetClickedRow(), "Mouse")在这个祖先函数中编写这样一个行选择的函数只是作为一个简单的实例,相信读者一定能因此受到启发,编写出更多的函数,以拓展数据窗口的基本功能。

时间: 2024-08-31 05:24:10

编写行选择函数的相关文章

jquery ezUI 双击行记录弹窗查看明细

第一步:给DataGrid绑定onDblClickRow事件: <table title="" id="dataTable" class="easyui-datagrid" style="height: 500px;" data-options="  url: '/ajaxget.aspx?_t='+new Date().getTime()+'&_action=SVNGetHandler.GetSear

jquery ezUI 双击行记录弹窗查看明细的实现方法_jquery

第一步:给DataGrid绑定onDblClickRow事件: <table title="" id="dataTable" class="easyui-datagrid" style="height: 500px;" data-options=" url: '/ajaxget.aspx?_t='+new Date().getTime()+'&_action=SVNGetHandler.GetSearc

如何编写Python脚本替换文件中的多行字符?

 问题描述  解题思路  代码实现  Python的特点  1.问题描述 项目源码很大,属于C/C++混合的那种,编程风格也很多样,有'.c'.'.cc'.'cpp'.'.h'.'.hh'等文件.我要完成的任务是:把包含特定几行内容的注释删掉,如(声明:下面的内容只是我随便举的一个例子,项目源码中不涉及下面的内容.) /*  * Copyright 2002 Sun Microsystems, Inc. All rights reserved. * * Redistribution and us

需求驱动学习之Python(如何编写Python脚本替换文件中的多行字符?)

当一个人太执着于某一个东西的时候, 会错过很多美好的东西! Python值得学习的一个工具,不要局限在当前使用的语言中. 在大概3个月之前,Python对我来说一直是个迷.然而,就在3个月前我经理给我一个任务--删除(替换)所有项目源码文件中包含特定几行内容的 所有注释.整个项目源码的大小有1G,在Linux服务器(中高档)上编译需要半个多小时,可见代码量之大,不可能手动去一个一个改.肯定得用脚本去处 理,于是我想到了Python.在这之前没有接触过Python,花了2个星期一顿恶补之后,总算顺

汇编类问题-汇编语言求助 编写一拷贝程序,要求在命令行指定源文件名和目标文件名

问题描述 汇编语言求助 编写一拷贝程序,要求在命令行指定源文件名和目标文件名 如题 怎么搞...汇编只学了一点点,毫无头绪啊 最好有简单易懂一点的代码贴上来,求讲解思路,急求啊!

编写程序,生成并输出杨辉三角形(10行)。

问题描述 编写程序,生成并输出杨辉三角形(10行). 在C语言中,运用数组,编写程序,生成并输出杨辉三角形(10行). 解决方案 http://blog.sina.com.cn/s/blog_49fb2853010004lt.html 解决方案二: 杨辉三角形的第n行的第m个元素等于n!/((n-m)!*m!) 因此编程如下 int x = 10; for (int n = 1; n < x; n++) { for (int m = 1; m <= n; m++) printf("%

编写像网上商城这样的项目,用得到面向对象么?用面向对象有什么好处?感觉都是数据库就行了

问题描述 编写像网上商城这样的项目,用得到面向对象么?用面向对象有什么好处?感觉都是数据库就行了 编写像网上商城这样的项目,用得到面向对象么?用面向对象有什么好处?感觉都是数据库就行了 解决方案 面向对象主要是封装和重用,你编写一个大型的软件,经常需要维护它,那么封装的代码减少了模块之间的耦合.编写一个通用的业务逻辑,那么面向对象构建的类库就很容易移植到别的项目中. 解决方案二: 网上商城有自己的框架,先了解这些.等到具体的实现时,才会用到面向对象的东东. 设计一个东东,选好框架后应该用什么就很

c语言 发彩信 模块-PC直接控制GPRS模块,用VC6.0编写程序发送彩信,简单就行,有的大侠拜托了

问题描述 PC直接控制GPRS模块,用VC6.0编写程序发送彩信,简单就行,有的大侠拜托了 电脑连接一个 GPRS模块,要求用C语言编程控制GPRS模块发送彩信,应该包含彩信封装等内容,希望能有人帮帮忙,可以的话程序发我邮箱:Lzm11211109@163.com.并告知使用的硬件是什么, 谢谢各位大侠了. 解决方案 http://download.csdn.net/download/qianshuyuankk/4800261 解决方案二: 短信猫如何发彩信? 短信猫可以发彩信吗? 这个,得看短

使用Python编写类UNIX系统的命令行工具的教程_python

引言 您是否能编写命令行工具?也许您可以,但您能编写出真正好用的命令行工具吗?本文讨论使用 Python 来创建一个强健的命令行工具,并带有内置的帮助菜单.错误处理和选项处理.由于一些奇怪的原因,很多人并不了解 Python? 的标准库具有制作功能极其强大的 *NIX 命令行工具所需的全部工具. 可以这样说,Python 是制作 *NIX 命令行工具的最佳语言,因为它依照"batteries-included"的哲学方式工作,并且强调提供可读性高的代码.但仅作为提醒,当您发现使用 Py