ActiveX控件早已為大多數(shù)程序開(kāi)發(fā)人員作為一重要工具來(lái)使用。由于它與開(kāi)發(fā)語(yǔ)言無(wú)關(guān),任何支持ActiveX控件的軟件平臺(tái)上,都可以使用ActiveX控件。就像使用WINDOWS控件一樣自如。然而,ActiveX控件在具體到某種開(kāi)發(fā)工具中去使用時(shí)會(huì)遇到很多問(wèn)題,這一點(diǎn)在許多刊物的文章都經(jīng)常被提出討論,但大多數(shù)都是針對(duì)Vc,Delphi,VB,PB等開(kāi)發(fā)平臺(tái)下的ActiveX控件。其實(shí),在上述平臺(tái)中使用ActiveX控件基本上能在其幫助功能中,開(kāi)發(fā)人員依照其示例最終能找到ActiveX控件的屬性,方法,事件的使用說(shuō)明。甚至有些開(kāi)發(fā)工具已將部分ActiveX控件作為其常用表單控件,使開(kāi)發(fā)人員使用起來(lái)感到非常方便。
可是在VFP開(kāi)發(fā)平臺(tái)下,去使用ActiveX控件就不如上述開(kāi)發(fā)工具那樣的幸運(yùn),因?yàn)閂FP對(duì)其根本就未涉及到相關(guān)語(yǔ)法說(shuō)明和示例,使VFP開(kāi)發(fā)者感到尷尬與茫然。又因,很少有介紹這方面文章。因此,筆者就以正在開(kāi)發(fā)“樓盤銷售軟件”為例介紹一下TreeView控件在VFP中的具體使用,以供與筆者同感的VFP同仁參考。
一、 首先介紹TreeView 控件
TreeView 控件顯示 Node 對(duì)象的分層列表,每個(gè) Node 對(duì)象均由一個(gè)標(biāo)簽和一個(gè)可選的位圖組成。TreeView 一般用于顯示文檔標(biāo)題、索引入口、磁盤上的文件和目錄、或能被有效地分層顯示的其它種類信息。
Node 對(duì)象是 TreeView 控件中的一項(xiàng),它包含圖像和文本。Nodes 集合包含一個(gè)或多個(gè) Node 對(duì)象。 語(yǔ)法:treeview.Nodes,treeview.Nodes.Item(index)??梢允褂脴?biāo)準(zhǔn)的集合方法(例如 Add 和 Remove 方法)操作 Node 對(duì)象??梢园雌渌饕虼鎯?chǔ)在 Key 屬性中的唯一鍵來(lái)訪問(wèn)集合中的每個(gè)元素。為選擇指定的 Node 對(duì)象,必須通過(guò)它的 Index 屬性或 Key 屬性的值去引用它。
在 Treeview 控件的 Nodes 集合中添加一個(gè) Node 對(duì)象:object.Add(relative, relationship, key, text, image, selectedimage) Nodes 集合是一個(gè)基于 1 的集合。在添加 Node 對(duì)象時(shí),它被指派一個(gè)索引號(hào),該索引號(hào)被存儲(chǔ)在 Node 對(duì)象的 Index 屬性中。這個(gè)最新成員的 Index 屬性值就是 Node 集合的 Count 屬性的值。因?yàn)?Add 方法返回對(duì)新建立的 Node 對(duì)象的引用,所以使用這個(gè)引用來(lái)設(shè)置新 Node 的屬性十分方便。下面介紹一下節(jié)點(diǎn)幾個(gè)屬性:
relative 是可選的。它表示已存在的 Node 對(duì)象的索引號(hào)或鍵值。而新節(jié)點(diǎn)與已存在的節(jié)點(diǎn)間的關(guān)系,可在下一個(gè)參數(shù) relationship 中找到。
relationship 是可選的。它表示指定的 Node 對(duì)象的相對(duì)位置,如設(shè)置值中所述。relationship 的設(shè)置值是:
tvwFirst為常數(shù) ,0 為值。它表示首的節(jié)點(diǎn)。該 Node 和在 relative 中被命名的節(jié)點(diǎn)位于同一層,并位于所有同層節(jié)點(diǎn)之前。
TvwLast為常數(shù),1 為值。它表示最后的節(jié)點(diǎn)。該 Node 和在 relative 中被命名的節(jié)點(diǎn)位于同一層,并位于所有同層節(jié)點(diǎn)之后。任何連續(xù)地添加的節(jié)點(diǎn)可能位于最后添加的節(jié)點(diǎn)之后
TvwNext為常數(shù),2 為缺省值。它表示下一個(gè)節(jié)點(diǎn)。該 Node 位于在 relative 中被命名的節(jié)點(diǎn)之后。
TvwPrevious為常數(shù), 3為值。它表示前一個(gè)節(jié)點(diǎn)。該 Node 位于在 relative 中被命名的節(jié)點(diǎn)之前。
TvwChild為常數(shù), 4 為缺省值。它表示子節(jié)點(diǎn)。該 Node 成為在 relative 中被命名的節(jié)點(diǎn)的子節(jié)點(diǎn)。
注意 如果在 relative 中沒(méi)有被命名的 Node 對(duì)象,則新節(jié)點(diǎn)被放在節(jié)點(diǎn)頂層的最后位置。
key 是可選的。它表示節(jié)點(diǎn)中唯一的字符串,可用于用 Item 方法檢索 Node。
text 是必需的。它表示在 Node 中出現(xiàn)的字符串,即節(jié)點(diǎn)的名稱。
index 是整數(shù)或字符串,它唯一地標(biāo)識(shí) Nodes 集合的一個(gè)成員。整數(shù)是 Index 屬性的值,字符串是 Key 屬性的值。
FullPath 屬性,這個(gè)屬性返回在 TreeView 控件中引用的 Node 對(duì)象的完整限定路徑。當(dāng)賦予該屬性為字符串變量時(shí),該字符串被設(shè)為具有指定索引的 FullPath 節(jié)點(diǎn)。
Indentation 屬性返回或設(shè)置控件中對(duì)象的縮進(jìn)寬度。
LabelEdit 屬性返回或設(shè)置一個(gè)值,它確定是否可以編輯在 TreeView 控件中的 Node 對(duì)象的標(biāo)簽。
二、源程序示例
在該程序中TreeView控件能夠?qū)崿F(xiàn)項(xiàng)目、樓宇、單元、樓層這樣四層逐級(jí)包含的關(guān)系。用戶只要簡(jiǎn)單地單擊每層節(jié)點(diǎn)“+”/“-”就能很直觀地觀察到一個(gè)項(xiàng)目中包含幾幢樓,一幢樓包含幾個(gè)單元,一個(gè)單元又有多少樓層。通過(guò)與頁(yè)框PAGEFRAME中每一頁(yè)的表格GRID聯(lián)合使用,只要雙擊每層節(jié)點(diǎn)就可在相應(yīng)的表中增加記錄并在GRID中顯示相應(yīng)的詳細(xì)信息。值得說(shuō)明的是該程序可以實(shí)現(xiàn)多個(gè)項(xiàng)目的顯示,項(xiàng)目節(jié)點(diǎn)與項(xiàng)目節(jié)點(diǎn)之間是平行同級(jí)的關(guān)系,僅僅是第二個(gè)項(xiàng)目首節(jié)點(diǎn)排在第一個(gè)之后。而樓宇節(jié)點(diǎn)是項(xiàng)目節(jié)點(diǎn)的子節(jié)點(diǎn),單元節(jié)點(diǎn)是樓宇節(jié)點(diǎn)的子節(jié)點(diǎn),樓層節(jié)點(diǎn)是單元節(jié)點(diǎn)的子節(jié)點(diǎn)。
源程序1實(shí)現(xiàn)TreeView 控件初始化工作,即表單中的Olecontrol1.init事件填寫源程序1中所有代碼。源程序2實(shí)現(xiàn)與頁(yè)框配合,顯示節(jié)點(diǎn)相應(yīng)的詳細(xì)內(nèi)容,即表單中的Olecontrol1.NodeClick事件填寫源程序2中所有代碼。
源程序1代碼如下:
LOCAL M.L_XMCOUNT,I,J,K,L,M.L_NODES,M.L_LYCOUNT,M.L_DYCOUNT,M.L_LCCOUNT
THIS.NODES.CLEAR &&清除所有節(jié)點(diǎn)
THIS.LABELEDIT=1 &&節(jié)點(diǎn)標(biāo)簽可以編輯
THIS.Indentation=10 &&縮進(jìn)寬度為10個(gè)象素
SELECT SF_XMXX
set dele on
M.L_XMCOUNT=RECCOUNT()
FOR I=1 TO M.L_XMCOUNT
SELECT SF_XMXX
GO I
if !delete()
M.L_NODES=THIS.NODES.ADD(,,'XM'+XM_BH,XM_MC) &&向節(jié)點(diǎn)集合加入第一個(gè)節(jié)點(diǎn)KEY=XM,TEXT=項(xiàng)目名稱
M.L_NODES.EXPANDED=.T. &&所有節(jié)點(diǎn)可以折疊
M.L_NODES.FORECOLOR=RGB(0,0,255) &&設(shè)置所有節(jié)點(diǎn)的前景顏色
M.P_XMBH=XM_BH
=REQUERY('VIEW_XMLY')
M.L_LYCOUNT=RECCOUNT('VIEW_XMLY')
IF M.L_LYCOUNT>0
FOR J=1 TO M.L_LYCOUNT
SELECT VIEW_XMLY
GO J
if !delete()
&&向'項(xiàng)目'父節(jié)點(diǎn)加入子節(jié)點(diǎn)'樓宇'KEY=LY,TEXT=樓宇實(shí)際編號(hào)
THIS.NODES.ADD('XM'+SF_XMXX.XM_BH,4,'LY'+VIEW_XMLY.LY_BH,VIEW_XMLY.LY_SJBH)
M.P_LYBH=VIEW_XMLY.LY_BH
=REQUERY('VIEW_XMDY')
M.L_DYCOUNT=RECCOUNT('VIEW_XMDY')
IF M.L_DYCOUNT>0
FOR K=1 TO M.L_DYCOUNT
SELECT VIEW_XMDY
GO K
if !delete()
&&向'樓宇'父節(jié)點(diǎn)加入子節(jié)點(diǎn)'單元'KEY=DY,TEXT=單元實(shí)際編號(hào)
THIS.NODES.ADD('LY'+VIEW_XMLY.LY_BH,4,'DY'+VIEW_XMDY.DY_BH,ALLTRIM(STR(VIEW_XMDY.DY_SJBH))+'單元')
M.P_DYBH=VIEW_XMDY.DY_BH
=REQUERY('VIEW_XMLC')
M.L_LCCOUNT=RECCOUNT('VIEW_XMLC')
IF M.L_LCCOUNT>0
FOR L=1 TO M.L_LCCOUNT
SELECT VIEW_XMLC
GO L
if !delete()
&&向'單元'父節(jié)點(diǎn)加入子節(jié)點(diǎn)'樓層'KEY=LC,TEXT=樓層實(shí)際編號(hào)
THIS.NODES.ADD('DY'+VIEW_XMDY.DY_BH,4,'LC'+VIEW_XMLC.LC_BH,ALLTRIM(STR(VIEW_XMLC.LC_SJCH))+'層')
endif
ENDFOR
ENDIF
endif
ENDFOR
ENDIF
endif
ENDFOR
ENDIF
endif
ENDFOR
源程序2如下:
*** ActiveX 控件事件 ***
LPARAMETERS node
*** ActiveX Contro1l Event ***
LOCAL M.L_NODES,M.L_SELECTED,L_INDEX
M.L_SELECTED=THISform.Olecontrol1.SELECTEDITEM.INDEX
M.L_NODES=THISFORM.OLECONTROL1.NODES(M.L_SELECTED)
THISFORM.PAGEFRAME1.PAGE1.CAPTION='項(xiàng)目信息'
THISFORM.PAGEFRAME1.PAGE2.CAPTION='樓宇信息'
THISFORM.PAGEFRAME1.PAGE3.ENABLED=.F.
THISFORM.PAGEFRAME1.PAGE3.CAPTION='單元信息'
THISFORM.PAGEFRAME1.PAGE4.ENABLED=.F.
THISFORM.PAGEFRAME1.PAGE4.CAPTION='樓層信息'
DO CASE
CASE M.L_NODES.KEY='XM'
THISFORM.PAGEFRAME1.ACTIVEPAGE=1
CASE M.L_NODES.KEY='LY'
THISFORM.PAGEFRAME1.ACTIVEPAGE=2
CASE M.L_NODES.KEY='DY'
THISFORM.PAGEFRAME1.PAGE3.ENABLED=.T.
THISFORM.PAGEFRAME1.ACTIVEPAGE=3
CASE M.L_NODES.KEY='LC'
THISFORM.PAGEFRAME1.PAGE4.ENABLED=.T.
THISFORM.PAGEFRAME1.ACTIVEPAGE=4
ENDCASE
if M.L_NODES.KEY<>'XM'
DO CASE
CASE M.L_NODES.KEY='LY'
M.P_XMBH=substr(M.L_NODES.KEY,3,2)
M.P_LYBH=RIGHT(M.L_NODES.KEY,LEN(M.L_NODES.KEY)-2)
=REQUERY('VIEW_XMDY')
IF RECCOUNT('VIEW_XMDY')=0
SELE SF_LYXX
SET ORDER TO LYBH
SEEK M.P_LYBH
IF FOUND()
DYZS=SF_LYXX.LY_DYZS
ENDIF
FOR I=1 TO DYZS
SELECT VIEW_XMDY
APPEND BLANK
THISFORM.PAGEFRAME1.PAGE3.GRID1.afterROWCOLCHANGE
ENDFOR
GO TOP
THISFORM.PAGEFRAME1.PAGE3.GRID1.refresh
ENDIF
THISFORM.PAGEFRAME1.PAGE2.CAPTION=ALLTRIM(M.L_NODES.TEXT)
THISFORM.PAGEFRAME1.PAGE3.ENABLED=.T.
THISFORM.PAGEFRAME1.PAGE1.CAPTION=ALLTRIM(LEFT(this.nodes(M.L_SELECTED).FULLPATH,AT('\',this.nodes(M.L_SELECTED).FULLPATH)))
=REQUERY('VIEW_XMLY')
sele view_xmly
CASE M.L_NODES.KEY='DY'
M.P_XMBH=substr(M.L_NODES.KEY,3,2)
M.P_lyBH=substr(M.L_NODES.KEY,3,4)
M.P_DYBH=RIGHT(M.L_NODES.KEY,LEN(M.L_NODES.KEY)-2)
=REQUERY('VIEW_XMLC')
IF RECCOUNT('VIEW_XMLC')=0
SELE SF_DYXX
SET ORDER TO DYBH
SEEK M.P_DYBH
IF FOUND()
LCZS=SF_DYXX.DY_LCS
ENDIF
FOR I=1 TO LCZS
SELECT VIEW_XMLC
APPEND BLANK
THISFORM.PAGEFRAME1.PAGE4.GRID1.afterROWCOLCHANGE
ENDFOR
GO TOP
ENDIF
THISFORM.PAGEFRAME1.PAGE3.CAPTION=ALLTRIM(M.L_NODES.TEXT)
THISFORM.PAGEFRAME1.PAGE4.ENABLED=.T.
THISFORM.PAGEFRAME1.PAGE1.CAPTION=ALLTRIM(LEFT(this.nodes(M.L_SELECTED).FULLPATH,AT('\',this.nodes(M.L_SELECTED).FULLPATH)))
=REQUERY('VIEW_XMdy')
sele view_xmdy
CASE M.L_NODES.KEY='LC'
M.P_XMBH=substr(M.L_NODES.KEY,3,2)
M.P_lyBH=substr(M.L_NODES.KEY,3,4)
M.P_dyBH=substr(M.L_NODES.KEY,3,6)
M.P_LCBH=RIGHT(M.L_NODES.KEY,LEN(M.L_NODES.KEY)-2)
THISFORM.PAGEFRAME1.PAGE4.CAPTION=ALLTRIM(M.L_NODES.TEXT)
THISFORM.PAGEFRAME1.PAGE1.CAPTION=ALLTRIM(LEFT(this.nodes(M.L_SELECTED).FULLPATH,AT('\',this.nodes(M.L_SELECTED).FULLPATH)))
=REQUERY('VIEW_XMlc')
sele view_xmlc
ENDCASE
ELSE
THISFORM.PAGEFRAME1.PAGE1.CAPTION=ALLTRIM(this.nodes(M.L_SELECTED).TEXT)
L_INDEX=M.L_SELECTED
M.P_XMBH=RIGHT(this.NODES(M.L_SELECTED).KEY,LEN(this.NODES(M.L_SELECTED).KEY)-2)
=REQUERY('VIEW_XMLY')
IF RECCOUNT('VIEW_XMLY')=0
SELE SF_XMXX
SET ORDER TO XMBH
SEEK M.P_XMBH
IF FOUND()
ZLS=SF_XMXX.XM_ZLS
ENDIF
FOR I=1 TO ZLS
SELECT VIEW_XMLY
APPEND BLANK
THISFORM.PAGEFRAME1.PAGE2.GRID1.AFTERROWCOLCHANGE
ENDFOR
GO TOP
ENDIF
ENDIF
THISFORM.REFRESH
================================================
控件的使用率
的,
就應(yīng)該好好
一下了。在梅子這兒有
TreeView控件的“玩轉(zhuǎn)系列”。
!我也
把她里面的
精華截下來(lái),給大家少作說(shuō)明而已。
你想系統(tǒng)的學(xué)一下呢,就下
“玩轉(zhuǎn)系列”吧!
簡(jiǎn)單的介紹:
TreeView控件用來(lái)顯示信息的分級(jí)視圖,如同Windows里的資源管理器的目錄。TreeView控件中的
信息都有
與之
的Node
。TreeView顯示Node
的分層目錄結(jié)構(gòu),每個(gè)Node
均由
Label
和其
的位圖組成。在
TreeView控件后,
可以展開(kāi)和折疊、顯示或隱藏
的節(jié)點(diǎn)。TreeView控件
用來(lái)顯示文件和目錄結(jié)構(gòu)、文檔中的類層次、索引中的層次和
分層目錄結(jié)構(gòu)的信息。
TreeView控件有3個(gè)屬性頁(yè),General頁(yè)、Font頁(yè)、Picture頁(yè)。
TreeView控件屬性
1。LineStyle屬性
該屬性設(shè)置本項(xiàng)控件中Node
之間顯示的線條類型。格式:
表單.TreeView名.LineStyle=值
值的范圍:
0-TvwTreeLines (缺省)三線顯示兄弟節(jié)點(diǎn)和父子節(jié)點(diǎn)之間的連線
1-TvwRootLines 根(Root)線。除了上述的連線以外,還顯示根目錄之間的連線
需要注意的是:在設(shè)置該屬性前,
設(shè)置Style屬性為TreeLine(三線)。
2。Style屬性
該屬性返回和設(shè)置
在TreeView控件
中Node
的圖形類型和文本類型。格式:
表單.TreeView名.Style=值
值的范圍:
0-TvwTextOnly 文本
1-TvwPictureText 圖象和文本
2-TvwPlusMinusText +/-
文本
3-TvwPlusPictureText +/-、圖象
文本
4-TvwTreeLinesText 連線和文本
5-TvwTreeLinesPictureText 連線、圖象和文本
6-TvwTreeLinesPlusMinueText 連線、+/-和文本
7-TvwTreeLinesPlusMinusPictureText (缺省)連線、+/-、圖象和文本
3。Indentation屬性
該屬性設(shè)置各個(gè)新的Node
縮進(jìn)的量度。格式如下:
表單.TreeView名.Indentation=值
值的范圍:
大于0的數(shù),缺省值為38.00,默認(rèn)
是磅
4。Nodes屬性和Index屬性
該屬性設(shè)置訪問(wèn)TreeView控件使用Nodes
集合,Index指定Nodes集合中的某
節(jié)點(diǎn)。訪問(wèn)格式:
表單.TreeView名.Nodes(index)
例如要表示當(dāng)前表單中Treenode1控件的Nodes的
個(gè)節(jié)點(diǎn)為:
thisform.treenode1.Nodes(3)
Nodes集合的屬性
1。Nodes集合的屬性
該屬性指定當(dāng)前Nodes集合中的節(jié)點(diǎn)個(gè)數(shù)。格式:
表單.TreeView名.Nodes.Count
2。Text屬性
該屬性指定Nodes集合中某個(gè)節(jié)點(diǎn)的文字信息。格式:
表單.TreeView名.Nodes(index).Text
3。Key屬性
該屬性指定Nodes集合中某個(gè)節(jié)點(diǎn)的關(guān)鍵字。格式:工作幫手網(wǎng) www.yxtvg.com
表單.TreeView名.Nodes(index).Key
4。
還有對(duì)Nodes集合中某個(gè)節(jié)點(diǎn)
操作的屬性Root(返回當(dāng)前節(jié)點(diǎn)的根結(jié)節(jié))、FirsSibling(
個(gè)兄弟節(jié)點(diǎn))和Next(下
兄弟節(jié)點(diǎn))。
例如:
thisform.treeview1.Nodes(3).Root.Key
thisform.treeview1.nodes(3).firstsibling.key
thisform.treeview1.nodes(3).next.key
上面的語(yǔ)句就分別返回了當(dāng)前表單中treeview1控件的
個(gè)節(jié)點(diǎn)的根結(jié)節(jié)、
個(gè)兄弟節(jié)點(diǎn)和下
兄弟節(jié)點(diǎn)的關(guān)鍵字。
Nodes集合的方法
1。Clear方法
該方法清除當(dāng)前Nodes集合中的所有節(jié)點(diǎn)。格式:
表單.TreeView名.Nodes.Clear