為PB的TreeView完成同步選擇
發(fā)表時(shí)間:2024-06-13 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]廣州中山大學(xué)信息管理系2001級(jí) 梁冠超(510275)TreeView控件能夠清晰地表示層次關(guān)系,因而贏得了眾多程序員的喜愛(ài)。在TreeView編程中,常見(jiàn)的一個(gè)問(wèn)題是同步選擇(即選擇一個(gè)節(jié)點(diǎn)時(shí),同時(shí)選擇該節(jié)點(diǎn)的所有子節(jié)點(diǎn);不選一個(gè)節(jié)點(diǎn),同時(shí)去除該節(jié)點(diǎn)的祖先節(jié)點(diǎn)選擇標(biāo)志)。要實(shí)現(xiàn)這種效果,本來(lái)不...
廣州中山大學(xué)信息管理系2001級(jí) 梁冠超(510275)
TreeView控件能夠清晰地表示層次關(guān)系,因而贏得了眾多程序員的喜愛(ài)。在TreeView編程中,常見(jiàn)的一個(gè)問(wèn)題是同步選擇(即選擇一個(gè)節(jié)點(diǎn)時(shí),同時(shí)選擇該節(jié)點(diǎn)的所有子節(jié)點(diǎn);不選一個(gè)節(jié)點(diǎn),同時(shí)去除該節(jié)點(diǎn)的祖先節(jié)點(diǎn)選擇標(biāo)志)。
要實(shí)現(xiàn)這種效果,本來(lái)不難,只需要在檢測(cè)到節(jié)點(diǎn)選擇狀態(tài)變化時(shí),遍歷節(jié)點(diǎn)的祖先或者后代節(jié)點(diǎn)進(jìn)行同步即可。但是PB并沒(méi)有提供檢測(cè)節(jié)點(diǎn)選擇狀態(tài)變化的事件。怎么辦呢?
讓我們來(lái)看看PB中TreeView節(jié)點(diǎn)選擇狀態(tài)的表示。當(dāng)TreeView的CheckBoxes屬性為T(mén)rue時(shí),每個(gè)節(jié)點(diǎn)包含一個(gè)復(fù)選框。選中復(fù)選框時(shí),StatePictureIndex屬性為2,未選中則為1。當(dāng)選擇某個(gè)節(jié)點(diǎn)時(shí),首先觸發(fā)TreeView的Clicked事件,處理完Clicked事件后再對(duì)StatePictureIndex進(jìn)行設(shè)置。顯然,如果我們能夠?qū)licked事件前后節(jié)點(diǎn)的StatePictureIndex屬性值進(jìn)行比較,我們就可以判斷節(jié)點(diǎn)的選擇狀態(tài)是否發(fā)生了變化。按照這個(gè)思路,疏理PB的事件模型,發(fā)現(xiàn)采用Post的調(diào)用事件方法,可以實(shí)現(xiàn)將一個(gè)事件加入控件消息序列,在處理完當(dāng)前事件后再對(duì)新加入的事件進(jìn)行處理。至此,我們得到了如下的解決方案:
1. 為T(mén)reeView控件添加一個(gè)用戶事件ue_synchronizechildren(long handle, integer state),代碼如下:
long childitem
treeviewitem tvitem
getitem(handle, tvitem)
tvitem.statepictureindex=state
setitem(handle, tvitem)
childitem=this.finditem(ChildTreeItem!, handle)
do while(childitem<>-1)
this.Event ue_synchronizechildren(childitem, state) //遞歸遍歷后代結(jié)點(diǎn)
childitem=this.finditem(NextTreeItem!, childitem)
loop
添加一個(gè)用戶事件ue_synchronizeparent(long handle, integer state),如下:
long parentitem
treeviewitem tvitem
getitem(handle, tvitem)
tvitem.statepictureindex=state
setitem(handle, tvitem)
parentitem=this.finditem(ParentTreeItem!, handle)
if parentitem<>-1 then
this.Event ue_synchronizeparent(parentitem, state)
end if
2. 添加一個(gè)用戶事件ue_statechanged(long handle, integer prevstate)檢測(cè)節(jié)點(diǎn)的選擇狀態(tài), 如果發(fā)生了變化則調(diào)用ue_synchronizechildren同步后代節(jié)點(diǎn),并根據(jù)需要通過(guò)ue_synchronizeparent同步祖先節(jié)點(diǎn)。代碼如下:
treeviewitem tvitem
getitem(handle, tvitem)
if tvitem.statepictureindex=prevstate then
return
else
this.Event ue_synchronizechildren(handle, tvitem.statepictureindex)
if tvitem.statepictureindex=1 then //如需實(shí)現(xiàn)文末提及的功能,可在此處添加代碼。
this.Event ue_synchronizeparent(handle, tvitem.statepictureindex)
end if
end if
3. 在Clicked事件中,添加如下調(diào)用:
treeviewitem tvitem
getitem(handle, tvitem)
post event ue_statechanged(handle, tvitem.statepictureindex)
為了簡(jiǎn)單起見(jiàn),上面的代碼并沒(méi)有考慮當(dāng)選上一個(gè)結(jié)點(diǎn)時(shí),它的所有兄弟已被選擇,因此父結(jié)點(diǎn)也應(yīng)該被選擇的情況,如有需要,請(qǐng)讀者自己完成。