一、 运行界面:
二、 设计界面:
1、右面“介绍”页面(P1)
2、右面“节点”页面(P2)
3、右面“控件”页面(P3)
4、右面“拖动”页面(P4)
三、 有关代码:
1、 Form1的Caption: 玩转TreeView 第二版 流星雨
2、 Form1的Icon: f:\temp2\玩转treeview 流星雨第二版\pic\4.ico
3、Form1的Init代码
Declare Long SendMessage in "user32" Long,Long,Long
4、 Form1.Tree的MousePionter: 0-Default
5、 Form1.Tree的Init代码:
#Define TVM_SETBKCOLOR 4381
Declare Integer SendMessage IN User32 Integer hWnd ,Integer wMsg ,Integer wParam ,Integer lParam
= SendMessage(This.Hwnd, TVM_SETBKCOLOR, 0, RGB(230,230,255))
CLEAR DLLS SendMessage
This.Indentation=26
This.HotTracking=.T.
This.HideSelection=.F.
This.LabelEdit= 1
This.ImageList=Thisform.Images
This.lineStyle= 1
Thisform.Images.BackColor = RGB(230,230,255)
SELECT show
GO TOP
SCAN
IF父对象=0
This.Nodes.Add(,,'N'+ALLTRIM(STR(键值)),ALLTRIM(名称))
ELSE
This.Nodes.Add('N'+ALLTRIM(STR(父对象)),4,'N'+ALLTRIM(STR(键值)),ALLTRIM(名称))
ENDIF
IF图标>0
This.Nodes(RECNO()).Image=图标
ENDIF
IF选中图标>0
This.Nodes(RECNO()).SelectedImage=选中图标
ENDIF
IF !EMPTY(值)
This.Nodes(RECNO()).ForeColor=RGB(0,0,255)
ELSE
This.Nodes(RECNO()).ForeColor=0 &&为NodeClick事件中的返回颜色的命令做铺垫,不然会返回一个负值。
ENDIF
This.Nodes(RECNO()).BackColor=RGB(255,255,255) &&正常情况下不需要设定这两个属性。
ENDSCAN
This.NodeClick(This.Nodes(1))
This.Nodes(1).Selected=.T.
This.Tag=ALLTRIM(STR(This.Nodes.Count+1))
This.Nodes(1).BackColor = RGB(230,230,255)
6、Form1.Tree的NodeClick代码:
*** ActiveX Control Event ***
LPARAMETERS node
IF EMPTY(node.Tag)
SELECT show
GO VAL(RIGHT(node.key,LEN(node.key)-1))&&node.index
Thisform.Pf.P1.Edit1.Value=内容
ELSE
Thisform.Pf.P1.Edit1.Value='新增节点'
ENDIF
IF !EMPTY(Thisform.PF.P2.Tree.Tag)
Thisform.PF.P2.Tree.Nodes(VAL(Thisform.PF.P2.Tree.Tag)).Selected=.F.
ENDIF
DO CASE
CASE Thisform.PF.P2.Opt.Value=1
Thisform.PF.P2.Tree.Nodes(node.image).Selected=.T.
CASE Thisform.PF.P2.Opt.Value=2 AND !ISNULL(node.SelectedImage)
IF !EMPTY(node.SelectedImage)
Thisform.PF.P2.Tree.Nodes(node.SelectedImage).Selected=.T.
ENDIF
CASE Thisform.PF.P2.Opt.Value=3 AND !ISNULL(node.ExpandedImage)
IF !EMPTY(node.ExpandedImage)
Thisform.PF.P2.Tree.Nodes(node.ExpandedImage).Selected=.T. ENDIF
ENDCASE
Thisform.PF.P2.Tree.Tag=IIF(VARTYPE(Thisform.PF.P2.Tree.SelectedItem)='O',ALLTRIM(STR(Thisform.PF.P2.Tree.SelectedItem.Index)),'')
Thisform.PF.P2.Text1.Value=node.Text
Thisform.PF.P2.Text2.Value=node.Key
Thisform.PF.P2.Text3.Value=node.index
Thisform.PF.P2.Text4.Value=node.Children
Thisform.PF.P2.Text5.BackColor=node.ForeColor
Thisform.PF.P2.Text6.BackColor=node.BackColor
Thisform.PF.P2.Command9.FontBold=node.Bold
IF node.Expanded
Thisform.Pf.P2.Command8.Caption='折叠节点'
ELSE
Thisform.Pf.P2.Command8.Caption='展开节点'
ENDIF
Thisform.Pf.P2.Text7.Value=node.FullPath
IF !EMPTY(值)
Thisform.Pf.P3.Combo1.Enabled=.T.
Thisform.Pf.P3.Edit1.Value=SUBSTR(ALLTRIM(内容),1,AT('语法',内容))
Thisform.Pf.P3.Text2.Value=SUBSTR(ALLTRIM(值),1,AT(',',值)-1)
Thisform.Pf.P3.Combo1.RowSource=SUBSTR(ALLTRIM(值),AT(',',值)+1,LEN(ALLTRIM(值))-AT(',',值))
Thisform.Pf.P3.Combo1.ListIndex=1
ELSE
Thisform.Pf.P3.Combo1.Enabled=.F.
Thisform.Pf.P3.Edit1.Value=''
ENDIF
7、 Form1.Tree的OLEDragMode: 0
8、 Form1.Tree的OLEDropMode: 0
9、 P1.Caption:介绍
10、 P1中Command1(保存)按钮Click代码:
SELECT show
REPLACE 内容 WITH This.Parent.Edit1.Value
11、 P1中Command1的SpecialEffect: 1- 平面
12、 P2.Caption:节点
13、 P2中的Command4(新增节点)按钮Click代码:
IF This.Parent.Check1.Value=0
Thisform.Tree.Nodes.Add(,,'N'+Thisform.Tree.Tag,'新增节点',5,4)
ELSE
Thisform.Tree.Nodes.Add(Thisform.Tree.SelectedItem.Key,4,'N'+Thisform.Tree.Tag,'新增节点',5,4)
ENDIF
Thisform.Tree.Nodes(VAL(Thisform.Tree.Tag)).Tag='N'
Thisform.Tree.Nodes(VAL(Thisform.Tree.Tag)).BackColor=RGB(255,255,255) &&为返回颜色做铺垫,正常情况不必设
Thisform.Tree.Tag=ALLTRIM(STR(VAL(Thisform.Tree.Tag)+1))
14、 P2中Command4的SpecialEffect: 1- 平面
15、 P2中的Command5(删除节点)按钮Click代码:
IF EMPTY(Thisform.Tree.SelectedItem.Tag)
MESSAGEBOX('不好意思,我还要用这个节点:)',0+64,'系统信息')
ELSE
Thisform.Tree.Nodes.Remove(Thisform.Tree.SelectedItem.Index)
Thisform.Tree.Tag=ALLTRIM(STR(VAL(Thisform.Tree.Tag)-1))
ENDIF
16、 P2中Command5的SpecialEffect: 1- 平面
17、 P2中的Command7(背景)按钮Click代码:
sc=GETCOLOR(This.Parent.Text5.BackColor)
IF sc>=0
This.Parent.Text6.BackColor=sc
Thisform.Tree.SelectedItem.BackColor=This.Parent.Text6.BackColor
ENDIF
18、 P2中Command7的SpecialEffect: 1- 平面
19、 P2中的Command6(字体)按钮Click代码:
sc=GETCOLOR(This.Parent.Text5.BackColor)
IF sc>=0
This.Parent.Text5.BackColor=sc
Thisform.Tree.SelectedItem.ForeColor=This.Parent.Text5.BackColor
ENDIF
20、 P2中Command6的SpecialEffect: 1- 平面
21、 P2中的Command8(展开节点)按钮Click代码:
Thisform.Tree.SelectedItem.Expanded=!Thisform.Tree.SelectedItem.Expanded
IF Thisform.Tree.SelectedItem.Expanded
This.Caption='折叠节点'
ELSE
This.Caption='展开节点'
ENDIF
22、 P2中Command8的SpecialEffect: 1- 平面
23、 P2中的Command9(粗体)按钮Click代码:
This.FontBold=!This.FontBold
Thisform.Tree.SelectedItem.Bold=This.FontBold
24、 P2中Command9的SpecialEffect: 1- 平面
25、 P2中Opt的interactiveChange代码:
Thisform.Tree.NodeClick(Thisform.Tree.SelectedItem)
26、 P2中Opt.option1.Caption: 节点图标
27、 P2中Opt.option2.Caption: 选中图标
28、 P2中Opt.option3.Caption: 展开图标
29、 P3.Caption: 控件
30、 P3的MouseMove代码:
LPARAMETERS nButton, nShift, nXCoord, nYCoord
31、 P3中Combo1的interactiveChange代码:
com='Thisform.Tree.'+SUBSTR(Thisform.Tree.SelectedItem.Text,1,AT(' ',Thisform.Tree.SelectedItem.Text))+'='+This.Value
IF '.Enabled'$com
com=STRTRAN(com,'.Enabled','.Object.Enabled')
ENDIF
&com
Thisform.Tree.Refresh
32、 P4.Caption: 拖动
33、 P4.Shape1 的SpecialEffect: 0- 3维
34、 P4.Tree的Appearance: 0- Flat
35、 P4.Tree的BorderStyle: 1- Fixed Single
36、 P4.Tree的LineStyle: 1- RootLines
37、 P4.Tree的Init代码:
This.ImageList=Thisform.Images
This.HotTracking=.T.
This.HideSelection=.F.
This.LabelEdit= 1
*This.SingleSel=.T.
SELECT show
GO TOP
SCAN
IF父对象=0
This.Nodes.Add(,,'N'+ALLTRIM(STR(键值)),ALLTRIM(名称))
ELSE
This.Nodes.Add('N'+ALLTRIM(STR(父对象)),4,'N'+ALLTRIM(STR(键值)),ALLTRIM(名称))
ENDIF
IF图标>0
This.Nodes(RECNO()).Image=图标
ENDIF
IF选中图标>0
This.Nodes(RECNO()).SelectedImage=选中图标
ENDIF
ENDSCAN
38、 P4.Tree的OLEDragDrop代码:
*** ActiveX Control Event ***
LPARAMETERS data, effect, button, shift, x, y
MESSAGEBOX(This.Tag)
RETURN
IF This.Parent.Tag#This.Name
loNode=This.HitTest(X/96*1440,Y/96*1440)
IF VARTYPE(loNode)='O' &&设置要添加的是根节点还是子节点
lcParent='"'+loNode.Key+'"'
lnRelation='4'
ELSE
lcParent=''
lnRelation=''
ENDIF
*IF VARTYPE(This.Parent.Tree1.SelectedItem)='O' && 加此句是因为有时会产生找不到选定节点的错误,原因不明
lnIndex=This.Parent.Tree1.SelectedItem.Index
*ELSE
* RETURN
*ENDIF
IF This.Parent.Tree1.SelectedItem.Children>0 &&计算要移动的节点总数
IF VARTYPE(This.Parent.Tree1.SelectedItem.Next)#'O'
lnCount=This.Parent.Tree1.Nodes.Count-This.Parent.Tree1.SelectedItem.Index
ELSE
lnCount=This.Parent.Tree1.SelectedItem.Next.Index-This.Parent.Tree1.SelectedItem.Index-1
ENDIF
ELSE
lnCount=0
ENDIF
FOR i=0 TO lnCount &&添加要移动的节点
loNode=This.Parent.Tree1.Nodes(lnIndex+i)
This.Nodes.Add(&lcParent,&lnRelation,loNode.Key,loNode.Text,loNode.Image,IIF(VARTYPE(loNode.SelectedImage)#'N',0,loNode.SelectedImage))
IF i#lnCount
lcParent='"'+This.Parent.Tree1.Nodes(lnIndex+i+1).Parent.Key+'"'
lnRelation='4'
ENDIF
ENDFOR
This.Parent.Tree1.Nodes.Remove(This.Parent.Tree1.SelectedItem.Index) &&删除移动的节点
ENDIF
39、 P4.Tree的OLEDragMode: 1
40、 P4.Tree的OLEDragOver代码:
*** ActiveX Control Event ***
LPARAMETERS data, effect, button, shift, x, y, state
loNode=This.HitTest(X/96*1440,Y/96*1440) &&计算鼠标下的节点
IF VARTYPE(loNode)='O'
This.SelectedItem=loNode
ENDIF
IF EMPTY(This.Tag)
This.Tag=STR(This.SelectedItem.Index)
ENDIF
WAIT '' WINDOW TIMEOUT 0.1 &&滚动延迟
IF y<10 &&向上
SendMessage(This.Parent.Tree.hwnd,0x115,0)
ENDIF
IF y>This.Height-30 &&向下
SendMessage(This.Parent.Tree.hwnd,0x115,1)
ENDIF
IF x<10 && 向左
SendMessage(This.Parent.Tree.hwnd,0x114,0)
ENDIF
IF x>This.Width-30 &&向右
SendMessage(This.Parent.Tree.hwnd,0x114,1)
ENDIF
41、 P4.Tree的OLEDropMode: 1
42、 P4.Tree1的OLEDragDrop代码:
*** ActiveX Control Event ***
LPARAMETERS data, effect, button, shift, x, y
IF This.Parent.Tag#This.Name
loNode=This.HitTest(X/96*1440,Y/96*1440)
IF VARTYPE(loNode)='O'
lcParent='"'+loNode.Key+'"'
lnRelation='4'
ELSE
lcParent=''
lnRelation=''
ENDIF
IF VARTYPE(This.Parent.Tree.SelectedItem)='O'
lnIndex=This.Parent.Tree.SelectedItem.Index
ELSE
RETURN
ENDIF
IF This.Parent.Tree.SelectedItem.Children>0
IF VARTYPE(This.Parent.Tree.SelectedItem.Next)#'O'
lnCount=This.Parent.Tree.Nodes.Count-This.Parent.Tree.SelectedItem.Index
ELSE
lnCount=This.Parent.Tree.SelectedItem.Next.Index-This.Parent.Tree.SelectedItem.Index-1
ENDIF
ELSE
lnCount=0
ENDIF
FOR i=0 TO lnCount
loNode=This.Parent.Tree.Nodes(lnIndex+i)
This.Nodes.Add(&lcParent,&lnRelation,loNode.Key,loNode.Text,loNode.Image,IIF(VARTYPE(loNode.SelectedImage)#'N',0,loNode.SelectedImage))
IF i#lnCount
lcParent='"'+This.Parent.Tree.Nodes(lnIndex+i+1).Parent.Key+'"'
lnRelation='4'
ENDIF
ENDFOR
This.Parent.Tree.Nodes.Remove(This.Parent.Tree.SelectedItem.Index)
ENDIF
43、 P4.Tree1的OLEDragOver代码:
*** ActiveX Control Event ***
LPARAMETERS data, effect, button, shift, x, y, state
IF (EMPTY(This.Tag) OR This.Parent.Tag#This.Name) AND x#0 AND Y#0
loNode=This.HitTest(X/96*1440,Y/96*1440)
This.SelectedItem=loNode
This.Tag='T'
ENDIF
WAIT '' WINDOW TIMEOUT 0.1 &&滚动延迟
IF y<10 &&向上
SendMessage(This.Parent.Tree.hwnd,0x115,0)
ENDIF
IF y>This.Height-30 &&向下
SendMessage(This.Parent.Tree.hwnd,0x115,1)
ENDIF
IF x<10 && 向左
SendMessage(This.Parent.Tree.hwnd,0x114,0)
ENDIF
IF x>This.Width-30 &&向右
SendMessage(This.Parent.Tree.hwnd,0x114,1)
ENDIF
44、 P4.Tree1的OLEDropMode: 1
45、 P4.Tree1的OLEStartDrag代码:
*** ActiveX Control Event ***
LPARAMETERS data, allowedeffects
This.Parent.Tag=This.Name
This.Tag=''
46、 P4.Tree1的Command1.Click代码:
FOR i=1 TO THis.Parent.Tree.Nodes(3).Children
THis.Parent.Tree.Nodes(3).Child.Parent=THis.Parent.Tree1.Nodes(1)
ENDFOR
47、 Command1(退出)按钮的Click代码:
Thisform.Release
四、 附件
1、 show.dbf结构
2、 show.dbf内容如下:
3、 将表show.dbf添加到“数据环境”中
联系客服