转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件使用 >> 常用软件 >> 正文
PowerBuilder应用开发系列讲座(17)         

PowerBuilder应用开发系列讲座(17)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:899 更新时间:2009/4/24 21:43:43
?b>编写行选择函数

  上期我们介绍了使用自定义用户对象取代系统自身的数据窗口的技术,采用这种办法我们可以把对数据窗口经常做的操作编写成为对象函数,在数据窗口的祖先对象中进行定义, 并将其封装起来,而不必在每一个使用数据窗口的窗口之中重复编程。在数据窗口中我们 经常要使用对各条记录的选择操作,本期我们介绍如何将这一功能在对象函数中实现,以 拓展数据窗口的基本功能。进行选择的不同方法 我们在数据窗口中需要进行行选择操作,如用户为了修改数据或看到更详细的内容而选择 了某一行;在另一些情况下,用户可能要同时删除或修改多行,这时,我们需要有使用户在 一个数据窗口中同时选择多行的功能。这在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 if

end if

或者简化成为下面的一行代码:

  if GetRow() > 0 then SelectRow( GetRow(), NOT IsSelected( GetRow()))

  shift 、control或control+shift+鼠标的使用Windows的文件管理器或其它Windows程序中,您 可以使用Shift、Control或Control+Shift这种键盘与鼠标的组合来选? PowerBuilde r在数据窗口中没有提供这样的能力,我们必须自己实现。我们应当实现的组合功能是: 要建立这样的功能,数据窗口必须记录当前的起始行。我们声明这样一个实例变量: protected long il_ anchor _ row当用户点击鼠标或进行了键盘操作时,我们要测试用户是否同时按下了Shift或Control键,方法是用KeyDown()函数,检查有没有KeyShift!和 KeyControl!,如有这样的键按下则记录起始行。

编写行选择函数

  为了在用户点击鼠标或进行键盘操作时使上述行为发生作用,我们必须在Clicked事件和一个映射到Pbm_wnkey事件的自定义用户事件中调用我们自己的行选择函数。这样,不管用户是点击鼠标还是击中键盘,选择行为都会发生。我们也可以将这个功能放入RowFo cusChanged事件中。为了使这个行选择功能可重用,这里我们建立两个函数。一个函数设置我们希望的选择行为类型,另外一个真正执行该选择行为。首先我们使用一个实例变量来设定选择行为的值 :

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_ Pro cessSelect的函数中。这个函数处理选择行为。我们需要告诉该函数要处理的行和该请 求是通过鼠标还是键盘发出的。下面是该函数代码:

函数:

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 = TRUE

end if
/* 确认鼠标点在了数据窗口的记录上*/
if al_ row < 1 Then Return -1/* 是否要确定起始行 */
b_ reset_ anchor = TRUE
SetRedraw(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 if

END
CHOOSESetRedraw(TRUE)
if b_ reset_ anchor then il_ anchor_ Row = al_ row
return 0

  现在,要执行行选择时,只需调用uf_ProcessS elect()函数。一般当用户在一个数据窗口中点击了鼠标或是按下了上、下箭头键时,调用这个函数。另外还有捕获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")在这个祖先函数中编写这样一个行选择的函数只是作为一个简单的实例,相信读者一定能因此受到启发,编写出更多的函数,以拓展数据窗口的基本功能。


[办公软件]在sybase中插入图片、PDF、文本文件  [办公软件]安装Sybase ASE
[办公软件]linux指令大全(完整篇)  [办公软件]Linux新手入门常用命令大全
[办公软件]在RedHat Linux 9里安装gaim0.80  [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法
[办公软件]Linux程序员必读:中文化与GB18030标准  [办公软件]linux指令大全
[办公软件]制作Linux启动盘的四种方法  [办公软件]Linux文件系统的反删除方法
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 办公软件  · 系统软件
    · 常用软件  · 聊天工具
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台