分享
 
 
 

编写行选择函数

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

我们在数据窗口中需要进行行选择操作,如用户为了修改数据或看到更详细的内容而选择了某一行;在另一些情况下,用户可能要同时删除或修改多行,这时,我们需要有使用户在一个数据窗口中同时选择多行的功能。这在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")在这个祖先函数中编写这样一个行选择的函数只是作为一个简单的实例,相信读者一定能因此受到启发,编写出更多的函数,以拓展数据窗口的基本功能。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有