VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

Tree使用說明(轉貼)

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 1 樓

發表發表於: 星期三 十二月 03, 2003 5:19 pm    文章主題: Tree使用說明(轉貼) 引言回覆

VFP6.0中ActiveX控制項TreeView 使用實例
河南金融管理幹部學院電腦教研室 陳學軍 
http://ly-www.sd.cninfo.net/Anetroom/Asheji/505.htm
  ActiveX控制項早已為大多數程式開發人員作為一重要工具來使用。由於它與開發語言無關,任何支援ActiveX控制項的軟體平臺上,都可以使用ActiveX控制項。就像使用WINDOWS控制項一樣自如。然而,ActiveX控制項在具體到某種開發工具中去使用時會遇到很多問題,這一點在許多刊物的文章都經常被提出討論,但大多數都是針對Vc,Delphi,VB,PB等開發平臺下的ActiveX控制項。其實,在上述平臺中使用ActiveX控制項基本上能在其幫助功能中,開發人員依照其示例最終能找到ActiveX控制項的屬性,方法,事件的使用說明。甚至有些開發工具已將部分ActiveX控制項作為其常用表單控制項,使開發人員使用起來感到非常方便。

  可是在VFP開發平臺下,去使用ActiveX控制項就不如上述開發工具那樣的幸運,因為VFP對其根本就未涉及到相關語法說明和示例,使VFP開發者感到尷尬與茫然。又因,很少有介紹這方面文章。因此,筆者就以正在開發“樓盤銷售軟體”為例介紹一下TreeView控制項在VFP中的具體使用,以供與筆者同感的VFP同仁參考。

一、 首先介紹TreeView 控制項
TreeView 控制項顯示 Node 物件的分層列表,每個 Node 物件均由一個標籤和一個可選的點陣圖組成。TreeView 一般用於顯示文檔標題、索引入口、磁片上的檔和目錄、或能被有效地分層顯示的其他種類資訊。
Node 物件是 TreeView 控制項中的一項,它包含圖像和文本。Nodes 集合包含一個或多個 Node 物件。 語法:treeview.Nodes,treeview.Nodes.Item(index)。可以使用標準的集合方法(例如 Add 和 Remove 方法)操作 Node 物件。可以按其索引或存儲在 Key 屬性中的唯一鍵來訪問集合中的每個元素。為選擇指定的 Node 物件,必須通過它的 Index 屬性或 Key 屬性的值去引用它。
在 Treeview 控制項的 Nodes 集合中添加一個 Node 物件:object.Add(relative, relationship, key, text, image, selectedimage) Nodes 集合是一個基於 1 的集合。在添加 Node 物件時,它被指派一個索引號,該索引號被存儲在 Node 物件的 Index 屬性中。這個最新成員的 Index 屬性值就是 Node 集合的 Count 屬性的值。因為 Add 方法返回對新建立的 Node 物件的引用,所以使用這個引用來設置新 Node 的屬性十分方便。下面介紹一下節點幾個屬性:
relative 是可選的。它表示已存在的 Node 物件的索引號或鍵值。而新節點與已存在的節點間的關係,可在下一個參數 relationship 中找到。
relationship 是可選的。它表示指定的 Node 物件的相對位置,如設置值中所述。relationship 的設置值是:
tvwFirst為常數 ,0 為值。它表示首的節點。該 Node 和在 relative 中被命名的節點位於同一層,並位於所有同層節點之前。
TvwLast為常數,1 為值。它表示最後的節點。該 Node 和在 relative 中被命名的節點位於同一層,並位於所有同層節點之後。任何連續地添加的節點可能位於最後添加的節點之後
TvwNext為常數,2 為缺省值。它表示下一個節點。該 Node 位於在 relative 中被命名的節點之後。
TvwPrevious為常數, 3為值。它表示前一個節點。該 Node 位於在 relative 中被命名的節點之前。
TvwChild為常數, 4 為缺省值。它表示子節點。該 Node 成為在 relative 中被命名的節點的子節點。
注意 如果在 relative 中沒有被命名的 Node 物件,則新節點被放在節點頂層的最後位置。
key 是可選的。它表示節點中唯一的字串,可用於用 Item 方法檢索 Node。
text 是必需的。它表示在 Node 中出現的字串,即節點的名稱。
index 是整數或字串,它唯一地標識 Nodes 集合的一個成員。整數是 Index 屬性的值,字串是 Key 屬性的值。
FullPath 屬性,這個屬性返回在 TreeView 控制項中引用的 Node 物件的完整限定路徑。當賦予該屬性為字串變數時,該字串被設為具有指定索引的 FullPath 節點。
Indentation 屬性返回或設置控制項中物件的縮進寬度。
LabelEdit 屬性返回或設置一個值,它確定是否可以編輯在 TreeView 控制項中的 Node 物件的標籤。
二、根源程式示例
在該程式中TreeView控制項能夠實現專案、樓宇、單元、樓層這樣四層逐級包含的關係。用戶只要簡單地單擊每層節點“+”/“-”就能很直觀地觀察到一個項目中包含幾幢樓,一幢樓包含幾個單元,一個單元又有多少樓層。通過與頁框PAGEFRAME中每一頁的表格GRID聯合使用,只要雙擊每層節點就可在相應的表中增加記錄並在GRID中顯示相應的詳細資訊。值得說明的是該程式可以實現多個專案的顯示,專案節點與專案節點之間是平行同級的關係,僅僅是第二個項目首節點排在第一個之後。而樓宇節點是專案節點的子節點,單元節點是樓宇節點的子節點,樓層節點是單元節點的子節點。效果如圖1所示。
根源程式1實現TreeView 控制項初始化工作,即表單中的Olecontrol1.init事件填寫根源程式1中所有代碼。根源程式2實現與頁框配合,顯示節點相應的詳細內容,即表單中的Olecontrol1.NodeClick事件填寫根源程式2中所有代碼。
圖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 &&清除所有節點
THIS.LABELEDIT=1 &&節點標籤可以編輯
THIS.Indentation=10 &&縮進寬度為10個象素
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) &&向節點集合加入第一個節點KEY=XM,TEXT=項目名稱
M.L_NODES.EXPANDED=.T. &&所有節點可以折疊
M.L_NODES.FORECOLOR=RGB(0,0,255) &&設置所有節點的前景顏色
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()
&&向‘項目‘父節點加入子節點‘樓宇‘KEY=LY,TEXT=樓宇實際編號
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()
&&向‘樓宇‘父節點加入子節點‘單元‘KEY=DY,TEXT=單元實際編號
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()
&&向‘單元‘父節點加入子節點‘樓層‘KEY=LC,TEXT=樓層實際編號
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=‘專案資訊‘
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

以上程式已經測試通過。

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 2 樓

發表發表於: 星期三 十二月 03, 2003 5:19 pm    文章主題: 引言回覆

在VFP6.0中實現TREEVIEW功能

2001年2月19日18:11:4 華好網景 蔡可訓
http://tech.163.com/tm/001013/001013_9540.html

    有些資料庫中保存著資料之間的從屬關係如:財務科目庫、組織關係庫等,如何在視窗中有效地表示出來,這就要用到TreeView功能。在VISUAL FOXPRO 6.0中插入實現該功能的ActiveX控制項即可。插入ActiveX控制項方法:在主功能表的“工具|選項”對話方塊中,選擇“控制項”,點擊“ACTIVEX控制項”,在“選定”框中選中“Microsoft TreeView Control,version 5.0”和“Microsoft ImageList Control,version 5.0”。
  一、創建含有如下控制項的表單:效果如圖1所示。
  label1(局機構一覽表)、label2(部門說明)、edit1、ActiveX控制項(olecontrol1)、ActiveX控制項( olecontrol2)
  二、設置ImageList控制項的屬性:效果如圖2所示。
  在屬性對話方塊中插入四個圖示,設置各圖示的Key屬性分別為:root、open、close、leaf。點擊“Insert Picture”按鈕,在“Image”框中插入選中所需的bmp或ico文件。
  三、程式清單:
  Olecontrol1.init
  sele nodes
  go top
  this.nodes.add(,,'K'+nodes.單位代碼,rtrim(nodes.單位名稱))
  skip
  do while .not.eof()
  if right(nodes.單位代碼,1)='0'
  dm="000"
  else
  dm=left(nodes.單位代碼,2)+'0'
  endi
  *add是nodes的方法,用於向TreeView中添加節點。
  this.nodes.add('K'+dm,4,'K'+nodes.單位代碼,rtrim(nodes.單位名稱))
  skip
  endd
  *利用Treeview的ImageList屬性和Node的Image屬性為不同性質的節點指定不同的圖示。
  go top
  this.imagelist=thisform.olecontrol2.object
  this.nodes(1).image='root'
  for imagelist=2 to this.nodes.count
  if this.nodes(imagelist).children>0
  this.nodes(imagelist).image='close'
  this.nodes(imagelist).expandedimage='open'
  else
  this.nodes(imagelist).image='leaf'
  endi
  endf
  olecontrol.nodeclick
  LPARAMETERS node
  sele nodes
  loca for nodes.單位代碼==subs(node.key,2)
  thisform.refresh
  以上程式在WINDOWS98、VISUAL FOXPRO 6.0中運行通過。

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作