Database 版 (精华区)
发信人: lizhenguo (夸父·追日), 信区: Database
标 题: 17
发信站: 哈工大紫丁香 (2001年09月26日18:43:50 星期三), 站内信件
bbs.hit.edu.cn
PowerBuilder专栏
[回到开始][上一层][下一篇]
----------------------------------------------------------------------------
----
发信人: carsam (独自偷...), 信区: Database
标 题: PowerBuilder应用开发系列讲座(17)
发信站: 逸仙时空 Yat-sen Channel (Wed Jan 5 11:39:10 2000), 站内信件
PowerBuilder应用开发系列讲座(17)
----------------------------------------------------------------------------
----
编写行选择函数
上期我们介绍了使用自定义用户对象取代系统自身的数据窗口的技术,采用这种办法我们
可以把对数据窗口经常做的操作编写成为对象函数,在数据窗口的祖先对象中进行定义,
并将其封装起来,而不必在每一个使用数据窗口的窗口之中重复编程。在数据窗口中我们
经常要使用对各条记录的选择操作,本期我们介绍如何将这一功能在对象函数中实现,以
拓展数据窗口的基本功能。
进行选择的不同方法
我们在数据窗口中需要进行行选择操作,如用户为了修改数据或看到更详细的内容而选择
了某一行;在另一些情况下,用户可能要同时删除或修改多行,这时,我们需要有使用户在
一个数据窗口中同时选择多行的功能。这在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这种键盘与鼠标的组合来选择。PowerBuilde
r在数据窗口中没有提供这样的能力,我们必须自己实现。
我们应当实现的组合功能是:
要建立这样的功能,数据窗口必须记录当前的起始行。我们声明这样一个实例变量:
protected long il_ anchor _ row当用户点击鼠标或进行了键盘操作时,我们要测试用
户是否同时按下了Shift或Control键,方法是用KeyDown()函数,检查有没有KeyShift!和
KeyControl!,如有这样的键按下则记录起始行。
编写行选择函数
编写行选择函数
为了在用户点击鼠标或进行键盘操作时使上述行为发生作用,我们必须在Clicked事件和
一个映射到Pbm _ dwnkey事件的自定义用户事件中调用我们自己的行选择函数。这样,不
管用户是点击鼠标还是击中键盘,选择行为都会发生。我们也可以将这个功能放入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 = TRUEend if/* 确认鼠标点在了数据窗口的记录上*/if al_ row < 1 Then
Return -1/* 是否要确定起始行 */b_ reset_ anchor = TRUESetRedraw(FALSE)CHOOS
E 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 t
hen il_ anchor_ Row = al_ rowreturn 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!) an
d GetRow() <> 1 then
uf_ processSelect( GetRow() - 1 , "Keyboard") elseif KeyDown(KeyHome!) and R
owCount() > 0 then
uf_ processSelect( 1, "KeyBoard") elseif KeyDown(KeyEnd!) and RowCount() >
0 then
uf_ processSelect( RowCount(), "Keyboard") end if最后,我们需要在clicked事件中
加入:
uf_ processSelect(GetClickedRow(), "Mouse")在这个祖先函数中编写这样一个行选择
的函数只是作为一个简单的实例,相信读者一定能因此受到启发,编写出更多的函数,以拓
展数据窗口的基本功能。
--
我想自由自在地飞......
飞过大海...
飞过沙漠...
飞翔在星的夜空......
※ 来源:.逸仙时空 Yat-sen Channel bbs.zsu.edu.cn.[FROM: 202.116.90.29]
----------------------------------------------------------------------------
----
[回到开始][上一层][下一篇]
欢迎访问Cterm主页
--
《列子·汤问》:“夸父不量力,欲追日影,逐之于隅谷之际。渴欲 得饮,赴饮河渭
。河渭不足,将走北饮大泽。未至,道渴而死。”
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.154]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.581毫秒