|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
支持大型的数据库。可以处理拥有上千万条记录的大型数据库。数据
我们在数据窗口中需要进行行选择操作。如用户为了修改数据或看到更详细的内容而选择了某一行;在另一些情况下,用户可能要同时删除或修改多行,这时,我们必要有使用户在一个数据窗口中同时选择多行的功能。这在PowerBuilder中是相当容易做到的,但是,如果您在一个数据窗口祖先中没有标准的函数来处理这些,而在每个窗口中重复的编程,这当然就要麻烦多了。
我们首先来看一看进行行选择的不同方法。
所有行都不加亮
数据窗口的标准行为是不加亮任何行。这当然实现起来很简单了,您什么也不需要做。这种做法关于那些只允许用户进行滚动和查看的数据列表或那些单行的数据窗口是合适的。
单行选择
单行选择意味着用户在同一时间只能选择一行。在用户选择一行来执行一些动作,如删除或是在主从关系的列表中显现详细信息,这是非常有用的。下面是实现允许单行选择功能所应编写的代码:
Event:RowFocusChanged
ifGetRow()>0then
SelectRow(0,FALSE)
SelectRow(GetRow(),TRUE)
endif
多行的自动选择
多行的自动选择时,当用户点击一个未加亮的行时,该行将变亮。如果用户点击一个加亮行,该即将不加亮。
为了实现上述行为,您可以将以下的代码放进RowFocusChanged事件中:
Event:RowFocusChanged
Event:RowFocusChanged
Object:AnyDataWindow
ifGetRow()>0then
ifIsSelected(GetRow())then
SelectRow(GetRow(),FALSE)
else
SelectRow(GetRow(),TRUE)
endif
endif
大概简化成为上面的一行代码:
ifGetRow()>0thenSelectRow(GetRow(),NOTIsSelected(GetRow()))
按住shift,control或control+shift点击鼠标的利用
windows的文件管理器或其它windows程序中,您能够使用按住shift,control或control+shift这种键盘与鼠标的组合来改变选择行为。PowerBuilder在数据窗口中没有提供这样的能力,我们必须自己实现。
我们应当实现的组合功能是:
按下键
动作
无
只加亮当前行,将其它行的显现设为正常
Control
保持其它行的状态,并将当前行也加亮
Shift
加亮起始行至当前行之间的一切行,将其它行的显示设为正常
Control-Shift
保持其它行的状态,并加亮肇端行至当前行之间的一切行,
建立这样的功能,我们首先必要对起始行进行跟踪。在用户使用shift或control-shift键时,系统应当把当前用户用鼠标点击或键盘选中的行与在此之前进行操作的起始行之间的所有行全部加亮。因此,数据窗口必须记录当前的起始行。我们声明这样一个实例变量:
protectedlongil_anchor_row
当用户点击鼠标或进行了键盘操作时,我们要测试用户是否同时按下了shift或control键,使用的是KeyDown()函数,检查有没有KeyShift!和KeyControl!,若有这样的键按下则记录起始行。
编写行选择函数
为了在用户点击鼠标或进行键盘操作时使上述行为发生作用,我们必须在Clicked事件和一个映照到Pbm_dwnkey事件的自定义用户事件中调用我们自己的行选择函数。这样,不管用户是点击鼠标还是击中键盘,选择行为都会发生。您也可以将这个功能放进RowFocusChanged事件中。
为了使这个行选择功能可重用,这里我们建立两个函数。一个函数设置我们希看的选择行为类型,另外一个真正执行该选择行为。起首我们使用一个实例变量来设定选择行为的值:
protectedintegerii_select_behavior
这个变量中将存放下面的一些值。
可能发生的选择行为
值
行为0
不允许选择行为1
只允许有一行选中2
自动实现多行选择3
允许使用鼠标和键盘组合选择99
不允许选择,将鼠标变成手型如果您使用的是保护变量或私有变量,这就意味着本对象以外的程序无法访问,因此您必须为其他程序员建立对这些变量赋值和获取这些变量值的函数。别的,您还需要一些函数来执行基于该变量的过程。
函数:uf_SetSelect(Select_behavior)
我们要写的第一个函数将允许程序员设置选择行为。
函数:publicintegeruf_SetSelect(integerai_select_behavior)
/*本函数设置数据窗口的选择行为值
下列为有效的选择行为值*/
CHOOSECASEai_select_behavior
CASE0,1,2,3,99
ii_select_behavior=ai_select_behavior
//至少一行将被选中
ifai_select_behavior=1then
uf_process_select(GetRow(),"Keyboard")
endif
ifai_select_behavior=99then
SetRowFocusIndicator(Hand!)
else
SetRowFocusIndicator(OFF!)
endif
return0
CASEELSE
return-1
ENDCHOOSE
函数:uf_ProcessSelect(longal_row,stringas_input_type)
一旦选择类型被设置,所有的行都必须被处理。我把这部分代码放进一个叫作uf_ProcessSelect的函数中。这个函数处理选择行为。您需要告诉该函数您想要处理的行和该请求是通过鼠标还是键盘收回的。下面是该函数:
longl_row
booleanb_reset_anchor
booleanb_keyboard,b_mouse
//鼠标动作还是键盘动作?
ifUpper(left(as_input_type,1))="K"then
b_keyboard=TRUE
else
b_mouse=TRUE
endif
/*确认鼠标点在了数据窗口的记录上*/
IFal_row<1THENReturn1/*是否要确定起始行*/b_reset_anchor="TRUE"SetRedraw(FALSE)/*有效的操作值0="不"允许选择行为1="只"允许有一行选中2="自"动实现多行选择3="允"许使用鼠标和键盘组合选择99="不"允许选择,将鼠标变成手型*/CHOOSECASEii_select_behaviorCASE0,99//无CASE1//单行选中SelectRow(0,FALSE)SelectRow(al_row,TRUE)CASE2//多行选中ifb_mousethenSelectRow(al_row,NOTIsSelected(al_row))endifCASE3IFkeydown(KeyShift!)ANDKeyDown(KeyControl!)THENIFil_anchor_row>al_rowthen
FORl_row=il_anchor_rowTOal_rowSTEP-1
this.selectrow(l_row,TRUE)
NEXT
ELSE
FORl_row=il_anchor_rowTOal_row
this.selectrow(l_row,TRUE)
NEXT
ENDIF
ELSEIFKeyDown(KeyShift!)Then
SelectRow(0,FALSE)
IFil_anchor_row>al_rowthen
FORl_row=il_anchor_rowTOal_rowSTEP-1
this.selectrow(l_row,TRUE)
NEXT
ELSE
FORl_row=il_anchor_rowTOal_row
this.selectrow(l_row,TRUE)
NEXT
ENDIF
b_reset_anchor=FALSE
ELSEIFKeydown(KeyControl!)THEN
SelectRow(al_row,NOTIsSelected(al_row))
ELSE
SelectRow(0,FALSE)
SelectRow(al_row,TRUE)
ENDIF
ENDCHOOSE
SetRedraw(TRUE)
ifb_reset_anchorthenil_anchor_Row=al_row
return0
现在,当我们希看执行行选择时,所要做的全部操作就是调用uf_ProcessSelect()函数。一般当用户在一个数据窗口中点击了鼠标或是按下了上、下箭头键时,调用这个函数。另外还有捕捉home和end键的代码。下面是we_keydow用户事件(映射到Pbm_dwnkey事件)中的代码:
Event:we_keydown(pbm_dwnkey)
Object:AnyDataWindow
ifKeyDown(KeyDownArrow!)andGetRow()RowCount()then
uf_processSelect(GetRow()+1,"Keyboard")
elseifKeyDown(KeyUpArrow!)andGetRow()1then
uf_processSelect(GetRow()-1,"Keyboard")
elseifKeyDown(KeyHome!)andRowCount()>0then
uf_processSelect(1,"KeyBoard")
elseifKeyDown(KeyEnd!)andRowCount()>0then
uf_processSelect(RowCount(),"Keyboard")
endif
最后,我们需要在clicked事件中加进:
uf_processSelect(GetClickedRow(),"Mouse")
在这个祖先函数中编写这样一个行选择的函数只是作为一个复杂的实例,相信您一定能因此收到启发,编写出更多的函数,以拓展数据窗口的基本功能。
mysql的原来开发者又开发了MariaDB,MariaDB适合用来替代mysql吗 |
|