马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
限制,如果WHERE子句的查询条件里有不等号(WHEREcoloum!=),MySQL将无法使用索引。类似地,如果WHERE子句的查询条件里使用了函数(WHEREDAY(column)=),MySQL也将无法使用索引。函数我们在数据窗口中必要举行行选择操纵,如用户为了修正数据或看到更具体的内容而选择了某一行;在另外一些情形下,用户大概要同时删除或修正多行,这时候,我们必要有利用户在一个数据窗口中同时选择多行的功效。这在PowerBuilder中是相称简单做到的,可是,假如在一个数据窗口先人中没有尺度的函数来处置这些,而在每一个窗口中反复编程,就十分贫苦。我们起首来看一看举行行选择的分歧办法。・一切行都不加亮一般情形下数据窗口不加亮任何行。这关于那些只同意用户举行转动和检察的数据列表或那些单行的数据窗口是符合的。・单行选择单行选择意味着用户在统一工夫只能选择一行来实行一些举措,如删除或在主从干系的列表中显现具体信息,这长短常有效的。上面是完成单行选择功效的代码:Event:RowFocusChangedifGetRow()>0thenSelectRow(0,FALSE)SelectRow(GetRow(),TRUE)endif・多行的主动选择多行的主动选择体现为:当用户点击一个未加亮的行时,该即将变亮;反之,用户点击一个加亮行,该即将不加亮。为了完成上述功效,在RowFocusChanged事务中到场以下代码:Event:RowFocusChangedObject:AnyDataWindowifGetRow()>0thenifIsSelected(GetRow())thenSelectRow(GetRow(),FALSE)elseSelectRow(GetRow(),TRUE)endifendif大概简化成为上面的一行代码:ifGetRow()>0thenSelectRow(GetRow(),NOTIsSelected(GetRow()))・shift、control或control+shift+鼠标的利用Windows的文件办理器或别的Windows程序中,您可使用Shift、Control或Control+Shift这类键盘与鼠标的组合来选择。PowerBuilder在数据窗口中没有供应如许的才能,我们必需本人完成。我们应该完成的组合功效是:要创建如许的功效,数据窗口必需纪录以后的肇端行。我们声明如许一个实例变量: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_behaviorCASE0,1,2,3,99ii_select_behavior=ai_select_behavior//最少一即将被选中ifai_select_behavior=1thenuf_process_select(GetRow(),"Keyboard")endififai_select_behavior=99thenSetRowFocusIndicator(Hand!)elseSetRowFocusIndicator(OFF!)endifreturn0CASEELSEreturn-1ENDCHOOSE一旦选择范例被设置,一切的行都必需被处置。我们把这部分代码放进一个叫作uf_ProcessSelect的函数中。这个函数处置选择举动。我们必要告知该函数要处置的行和该哀求是经由过程鼠标仍是键盘收回的。上面是该函数代码:函数:uf_ProcessSelect(longal_row,stringas_input_type)longl_rowbooleanb_reset_anchorbooleanb_keyboard,b_mouse//鼠标举措仍是键盘举措?ifUpper(left(as_input_type,1))="K"thenb_keyboard=TRUEelseb_mouse=TRUEendif/*确认鼠标点在了数据窗口的纪录上*/ifal_row<1ThenReturn-1/*是不是要断定肇端行*/b_reset_anchor=TRUESetRedraw(FALSE)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_rowthenFORl_row=il_anchor_rowTOal_rowSTEP-1this.selectrow(l_row,TRUE)NEXTelseFORl_row=il_anchor_rowTOal_rowthis.selectrow(l_row,TRUE)NEXTendifelseifKeyDown(KeyShift!)thenSelectRow(0,FALSE)IFil_anchor_row>al_rowthenFORl_row=il_anchor_rowTOal_rowSTEP-1this.selectrow(l_row,TRUE)NEXTelseFORl_row=il_anchor_rowTOal_rowthis.selectrow(l_row,TRUE)NEXTendifb_reset_anchor=FALSEelseifKeydown(KeyControl!)thenSelectRow(al_row,NOTIsSelected(al_row))elseSelectRow(0,FALSE)SelectRow(al_row,TRUE)endifENDCHOOSESetRedraw(TRUE)ifb_reset_anchorthenil_anchor_Row=al_rowreturn0如今,要实行行选择时,只需挪用uf_ProcessSelect()函数。一样平常当用户在一个数据窗口中点击了鼠标或是按下了上、下箭头键时,挪用这个函数。别的另有捕捉home和end键的代码。上面是we_keydown用户事务映照到Pbm_dwnkey事务中的代码:Event:we_keydown(pbm_dwnkey)Object:AnyDataWindowifKeyDown(KeyDownArrow!)andGetRow()<>RowCount()thenuf_processSelect(GetRow()+1,"Keyboard")elseifKeyDown(KeyUpArrow!)andGetRow()<>1thenuf_processSelect(GetRow()-1,"Keyboard")elseifKeyDown(KeyHome!)andRowCount()>0thenuf_processSelect(1,"KeyBoard")elseifKeyDown(KeyEnd!)andRowCount()>0thenuf_processSelect(RowCount(),"Keyboard")endif最初,我们必要在clicked事务中到场:uf_processSelect(GetClickedRow(),"Mouse")在这个先人函数中编写如许一个行选择的函数只是作为一个复杂的实例,信任读者必定能因而遭到启示,编写出更多的函数,以拓展数据窗口的基础功效。如果WHERE子句的查询条件里使用比较操作符LIKE和REGEXP,MySQL只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说,如果查询条件是LIKEabc%‘,MySQL将使用索引;如果查询条件是LIKE%abc’,MySQL将不使用索引。 |