国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

編寫行選擇函數(shù)

2024-07-21 02:09:18
字體:
供稿:網(wǎng)友
我們在數(shù)據(jù)窗口中需要進(jìn)行行選擇操作,如用戶為了修改數(shù)據(jù)或看到更詳細(xì)的內(nèi)容而選擇了某一行;在另一些情況下,用戶可能要同時刪除或修改多行,這時,我們需要有使用戶在一個數(shù)據(jù)窗口中同時選擇多行的功能。這在powerbuilder中是相當(dāng)容易做到的,但是,如果在一個數(shù)據(jù)窗口祖先中沒有標(biāo)準(zhǔn)的函數(shù)來處理這些,而在每個窗口中重復(fù)編程,就非常麻煩。 我們首先來看一看進(jìn)行行選擇的不同方法。 ·所有行都不加亮通常情況下數(shù)據(jù)窗口不加亮任何行。這對于那些只允許用戶進(jìn)行滾動和查看的數(shù)據(jù)列表或那些單行的數(shù)據(jù)窗口是合適的。 ·單行選擇單行選擇意味著用戶在同一時間只能選擇一行來執(zhí)行一些動作,如刪除或在主從關(guān)系的列表中顯示詳細(xì)信息,這是非常有用的。下面是實現(xiàn)單行選擇功能的代碼: event: rowfocuschangedif getrow() > 0 then selectrow( 0, false ) selectrow( getrow(), true )end if·多行的自動選擇多行的自動選擇表現(xiàn)為:當(dāng)用戶點擊一個未加亮的行時,該行將變亮;反之,用戶點擊一個加亮行,該行將不加亮。為了實現(xiàn)上述功能,在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+鼠標(biāo)的使用windows的文件管理器或其它windows程序中,您可以使用shift、control或control+shift這種鍵盤與鼠標(biāo)的組合來選擇。powerbuilder在數(shù)據(jù)窗口中沒有提供這樣的能力,我們必須自己實現(xiàn)。 我們應(yīng)當(dāng)實現(xiàn)的組合功能是: 要建立這樣的功能,數(shù)據(jù)窗口必須記錄當(dāng)前的起始行。我們聲明這樣一個實例變量: protected long il_ anchor _ row當(dāng)用戶點擊鼠標(biāo)或進(jìn)行了鍵盤操作時,我們要測試用戶是否同時按下了shift或control鍵,方法是用keydown()函數(shù),檢查有沒有keyshift!和keycontrol!,如有這樣的鍵按下則記錄起始行。 編寫行選擇函數(shù) 為了在用戶點擊鼠標(biāo)或進(jìn)行鍵盤操作時使上述行為發(fā)生作用,我們必須在clicked事件和一個映射到pbm _ dwnkey事件的自定義用戶事件中調(diào)用我們自己的行選擇函數(shù)。這樣,不管用戶是點擊鼠標(biāo)還是擊中鍵盤,選擇行為都會發(fā)生。我們也可以將這個功能放入rowfocuschanged事件中。 為了使這個行選擇功能可重用,這里我們建立兩個函數(shù)。一個函數(shù)設(shè)置我們希望的選擇行為類型,另外一個真正執(zhí)行該選擇行為。首先我們使用一個實例變量來設(shè)定選擇行為的值: protected integer ii _ select_ behavior這個變量中將存放下面的一些值。 可能發(fā)生的選擇行為 值 行為 0 不允許選擇行為 1 只允許有一行選中 2 自動實現(xiàn)多行選擇 3 允許使用鼠標(biāo)和鍵盤組合選擇 99 不允許選擇,將鼠標(biāo)變成手型 如果使用的是保護(hù)變量或私有變量,這就意味著本對象以外的程序無法訪問,因此必須為其他程序員建立對這些變量賦值和獲取這些變量值的函數(shù)。 另外,還需要一些函數(shù)來執(zhí)行基于該變量的過程。 函數(shù):uf_setselect(select_behavior)我們要寫的第一個函數(shù)將允許程序員設(shè)置選擇行為。 函數(shù): public integer uf_ setselect( integer ai_ select_ behavior)/* 本函數(shù)設(shè)置數(shù)據(jù)窗口的選擇行為值 下列為有效的選擇行為值 */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 一旦選擇類型被設(shè)置,所有的行都必須被處理。我們把這部分代碼放入一個叫作uf_ processselect的函數(shù)中。這個函數(shù)處理選擇行為。我們需要告訴該函數(shù)要處理的行和該請求是通過鼠標(biāo)還是鍵盤發(fā)出的。下面是該函數(shù)代碼: 函數(shù):uf_ processselect(long al_ row, string as_ input_ type) long l_ row boolean b_ reset_ anchor boolean b_ keyboard, b_ mouse // 鼠標(biāo)動作還是鍵盤動作? if upper(left(as_input_type,1)) = "k" then b_ keyboard = trueelse b_ mouse = trueend if/* 確認(rèn)鼠標(biāo)點在了數(shù)據(jù)窗口的記錄上*/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現(xiàn)在,要執(zhí)行行選擇時,只需調(diào)用uf_processselect()函數(shù)。一般當(dāng)用戶在一個數(shù)據(jù)窗口中點擊了鼠標(biāo)或是按下了上、下箭頭鍵時,調(diào)用這個函數(shù)。另外還有捕獲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")在這個祖先函數(shù)中編寫這樣一個行選擇的函數(shù)只是作為一個簡單的實例,相信讀者一定能因此受到啟發(fā),編寫出更多的函數(shù),以拓展數(shù)據(jù)窗口的基本功能。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 五莲县| 吕梁市| 南汇区| 万山特区| 江都市| 莲花县| 阜南县| 大渡口区| 蓝田县| 科尔| 丹凤县| 滦南县| 探索| 莎车县| 时尚| 西充县| 永靖县| 洛南县| 崇义县| 麟游县| 合江县| 新民市| 道孚县| 松潘县| 洱源县| 辛集市| 盐津县| 祁连县| 浦江县| 云龙县| 财经| 万州区| 麻栗坡县| 象州县| 湖北省| 敖汉旗| 四平市| 古田县| 平江县| 洛南县| 永德县|