TreeView详解(转载)

TreeView详解(转载)
TreeView 控件响应一些我们觉的VFP 控件的方法和事件: Click, DblClick, Drag, DragDrop, DragOver, GotFocus, KeyDown, KeyPress, KeyUp, LostFocus, MouseDown, MouseMove, MouseUp, Move, Refresh, SetFocus, ShowWhatsThis, 和 ZOrder。 有一个很大的例外: 没有 RightClick 事件。在稍后,你会看到如何处理这种情况。
除这些方法和事件外,TreeView 控件有一些它自己的方法和事件(帮助文件中列出的 Clear 和 Remove 方法, 实际上是属性节点集合而不是 TreeView 控件自己的):
BeforeLabelEdit 和 AfterLabelEdit 发生在标签被用户修改前和修改后(就象在 Windows 的资源管理器中, 你可以单击选定的节点并修改它的文本(在稍后你可以看到如何废止该自动编辑功能)。 该事件中的代码通常用于在某处保存新的文本, 如一个表中的字段。
Collapse 和 Expand 当用户收缩或扩展一个节点时激发。 它们接受的参数是选定节点的对象。 收缩或扩展一个节点不会使该节点成为活动的节点, 这一点通常会使用户糊涂。 添加以下代码到 Collapse 和 Expand 事件来确保存该节点成为活动的节点(调用了我将在稍解释的 NodeClick(), 它们只在你在这些方法中有一些自定义代码是才是必须的):
lparameters node
Node.Selected = .T.
This.NodeClick(Node)
GetVisibleCount 显示控件中全部可见的节点数。 如果控件可以显示最后的节点,该数可能看起来会很小。
HitTest :如果传递的 X 和 Y 座标上存在节点,它返回一个节点对象引用,否则返回 .NULL. 这里有一个新的问题: HitTest 期待 X 和 Y 座标值是缇(twips) (用于 Visual Basic), 但 VFP 使用象素。 以下代码将转换象素值到缇。TREEVIEW 示例表单的 INIT 中有这些代码, 并有两个自定义属性来保存计算值: nTreeFactorX 和 nTreeFactorY。
local liHWnd, ;
liHDC, ;
liPixelsPerInchX, ;
liPixelsPerInchY
* 定义一些常数。
#define cnLOG_PIXELS_X      88
* 来自 WINGDI.H
#define cnLOG_PIXELS_Y      90
* 来自From WINGDI.H
#define cnTWIPS_PER_INCH  1440
* 每英寸1440 缇
* 定义一些 Windows API 函数
declare integer GetActiveWindow in WIN32API
declare integer GetDC           in WIN32API ;
integer iHDC
declare integer GetDeviceCaps   in WIN32API ;
integer iHDC, integer iIndex
* 为 VFP 取得图形设备(device context)。
liHWnd = GetActiveWindow()
liHDC  = GetDC(liHWnd)
* 取得每英寸象素值。
liPixelsPerInchX = GetDeviceCaps(liHDC, cnLOG_PIXELS_X)
liPixelsPerInchY = GetDeviceCaps(liHDC, cnLOG_PIXELS_Y)
* 取得每象素缇并保存到表单属性中。
with This
.nTreeFactorX = cnTWIPS_PER_INCH/liPixelsPerInchX
.nTreeFactorY = cnTWIPS_PER_INCH/liPixelsPerInchY
endwith
HitTest() 有助于解决一个处理鼠标右击事件。 你可能想在用户在节点上右击时显示弹式菜单, 但在节点上右击时不会使它成为选定节点。 在控件的 MouseDown 事件中用以下代码来处理这一点(因为没有 RightClick 事件,所以这是你能处理右击的唯一办法)。 同时, 调用 NodeClick() 仅当你在该方法中放有代码时才是必须的:
lparameters Button, Shift, X, Y
local loNode
if Button = 2
* 如果这是右鼠标键, 取得鼠标下的节点的引用。
loNode = This.HitTest(X * Thisform.nTreeFactorX, ;
  Y * Thisform.nTreeFactorX)
* 如果有可用的节点, 选择它。
if not isnull(loNode)
  loNode.Selected = .T.
  This.NodeClick(loNode)
endif not isnull(loNode)
* 现在显示右击快捷菜单
else
* 处理必要的鼠标左击
endif Button = 2
NodeClick: 当用户在节点上单击时激活 (在 Click 事件之前)。 NodeClick 接受一个选定节点的对象引用作为参数。 该方法被典型地用于在一个节点被选定时更新一些东西(例如其它控件的值)。 如果 NodeClick 中的代码执行时花的时间太长, 选定项会被高亮显示但以前的项会被断续线包围。 移动鼠标(即使没有单击鼠标按钮) 会恢复以前项的高亮显示。 要避免这一问题, 可以在 NodeClick 事件中放入以下代码来保证节点被单击而成为选定项:
Node.Selected = .T.
StartLabelEdit: 通常被用于编辑节点的标签。 它用于 LabelEdit 属性被设置为1-手动时。
TreeView 控件节点集合方法
以下是TreeView 控件的节点集合的方法(被指定的 <Object>.Nodes 引用, 其中 <Object> 是 TreeView 控件名):
Add: 添加一个新节点并返回它的引用。 它使用以下语法
<Object>.Nodes.Add(Relative, Relationship, Key, Text, Image, ;
  SelectedImage)
其中:
Relative: 一个已存在节点的索引或键值。 如果未指定, 新节点放在顶级节点的末端。
Relationship: 新节点放置的相对于第一个参数中指定的节点的位置,可以是以下值:
1: 节点放在相对节点所在级的所有节点的末端。
2: 节点放在相对节点的后面。
3: 节点放在相对节点的前面。
4: 节点成为相对节点的子节点。
Key: 用于指明节点的唯一串。 如果显示内容是从一个表的记录中载入的, 可使用记录的主关键字段值 (如果不是字符型的,还需要转换为字符型)。 否则, 可使用一个转换为串的顺序号。
Text: 控件节点中显示的文本。
Image: 相关 ImageList 控件中的图象索引。
SelectedImage: 当节点选定时,要显示的相关 ImageList 控件中的图象索引。
Clear: 清除全部节点。
Remove: 移去指定索引号的节点。
TreeView 控件节点集合属性
以下是节点集合属性:
Count: 节点号。
[<Index>]: 一个节点号的对象引用。
Treeview(续2)
TreeView 控件节点对象方法
以下是节点对象方法:
CreateDragImage: 该方法不能用于 VFP ,因为该方法返回一个图象时, DragIcon 需要一个 CUR 文件名。
EnsureVisible: 确保指定节点是可见的。 该方法在必要时卷动 TreeView 控件并扩展所有指定节点的父节点。
TreeView 控件节点对象属性
以下是节点对象属性:
Children: 如果节点对象拥有子节点,该值为.T.。
Expanded: 如果节点对象已经扩展,该值为.T.。
FullPath: 该节点的所有父节点(祖节点,曾祖节点等)的文本串接, 各节点的文本间用控件的 PathSeparator 属性中指定的分隔符分隔。它非常类似于带路么的文件名。
Image, ExpandedImage 和 SelectedImage: 相关ImageList 控件中的适当的图象号。
Index: 节点集合中的节点对象的索引。
Key: 当节点添加时指定的唯一键值。
Child, FirstSibling, LastSibling, Previous, Parent, Next 和 Root: 指向与指定节点相关的节点对象。
Selected: 如果节点对象是选定的,该值为.T.。 设置该属性为 .T. 会自动高亮显示该节点并设置先前选定的节点的 Selected 属性为 .F.
Text: 控件中显示的文本。
TreeView 控件属性
如同事件一样, TreeView 控件支持一些其它控件所拥有的属性, 包括 DragIcon, DragMode, Enabled 和 Visible。 许多 TreeView 特定属性可以在设计时在 TreeView 控件上单击鼠标右键调出的 TreeView 控件属性表中设置。 包括 Style, LineStyle, Indentation, PathSeparator 和 HideSelection。
在属性表中可编辑的属性中, 你最需要改变其默认值的是:
Style: 指明 TreeView 控件显示什么。 可以选择是否显示图像,线条, 加号/减号等。
LineStyle: 指明显示根线。 如果没有设置该属性为 1-根线, 无论 Style 是如何设置的,顶级对象上都不会有加号/减号标记。
LabelEdit: 如果你不想让用户修改各节点上的文本, 设置该属性为 1-手动。
ImageList: 一个 ImageList 控件对象引用,它包括了控件中的节点使用的图象; 参见本文 ImageList 一章中关于该简单控件的说明。 不幸的是,该属性不能可视化地进行设置; 你必须以编程方式用代码进行设置,象下面一样在表单的 Init 方法中:
This.oTree.ImageList = This.oImageList.Object
***********************以下代码为我Appler整理*********************
在表单上添加一个TreeView,把TreeView的 NAME 值修改为 TreeView1,
然后再在在表单中添加一个ImageList控件(Microsoft ImageList Control),
然后把这个ImageList控件的 NAME 值改为ImageList1
右击这个控件,在ImageListCtrl Properties中的Images中添加几个图片
最后在表单的INIT事件:
This.TreeView1.ImageList=This.ImageList1.Object
this.TreeView1.Nodes.Add(,,,"Node 1")
this.TreeView1.Nodes.Add(,,,"Node 2")
THIS.TreeView1.Nodes(1).IMAGE=1 &&这里1表示节点图片为Images控件中的第1个图片
THIS.TreeView1.Nodes(2).IMAGE=2 &&这里2表示节点图片为Images控件中的第2个图片
THIS.TreeView1.Nodes(3).IMAGE=3 &&这里1表示节点图片为Images控件中的第3个图片
THIS.TreeView1.Nodes(4).IMAGE=4 &&这里2表示节点图片为Images控件中的第4个图片

FOR I=1 TO THIS.TreeView1.GetVisibleCount &&取得的节点数最小为4
 THIS.TreeView1.Nodes(I).IMAGE=1
ENDFOR
******************************************************************
***********************以下代码为我Appler整理*********************
使TreeView控件不可用:
THISFORM.TreeView1.OBJECT.ENABLED=.F. &&即在Enabled属性前加OBJECT
******************************************************************
注意你需要在表单的 Init 事件中而不是 TreeView 的 Init 事件中进行上述设置, 因为 TreeView 可能会在 ImageList 之前实例化, 如果这样,试着设置 ImageList 属性为一个尚不存在的对象将会失败。 同时, 注意上述代码中的"object" 关键字; 这是必须的。
Indentation: 子节点缩进多少。
HideSelection: 如果没有关闭这一选项, 当 TreeView 控件失去焦点时,选定节点不会保持高亮度。 这很容易把用户糊涂。
Font: 用于节点文本的字体名字, 字号和字型。该属性可从属性表中修改(注意帮助文件中说明了 ScrollBars 属性, 但没有该属性)。
DropHighlight: 该属性用于支持TreeView 控件的 DragOver 事件, 因此可以在鼠标经过一个节点时,高亮显示该节点。 但是, 这只会在 VFP 6 中的版本 6 的 TreeView 控件中才实现了; 在老版本的控件中设置该属性为节点对象时,会引发一条"类型失配" 错误。 在这种情况下, 要达到同样目的,可用 HitTest() 来检查鼠标经过的是哪一节点并设置该节点的 Selected 属性为 .T. TREEVIEW 示例表单在 DragOver 事件中使用了该技术。
Nodes: 控件中的节点集合引用。
SelectedItem: 当前选定节点对象的引用。
数据库加密程序(源码)
*******************************************
*加解密程序filename文件名jm为1加密0解密
*加密思想:用低级文件函数改写数据库第一个字节
*******************************************
parameters filename,jm
*处理文件名
if at('.',filename)=0
filename=filename+'.dbf'
endif
if jm=1  &&加密
handle=fopen(filename,2) &&打开文件
keybite=fread(handle,1)  &&读表头第一个字节
=fseek(handle,0)         &&指针移回第一个字节
=fwrite(handle,chr(asc(keybite)+2))  &&用比原来高2的ASCII字符改写
=fclose(handle)          &&关闭文件
else     &&解密
handle=fopen(filename,2)
keybite=fread(handle,1)
=fseek(handle,0)
=fwrite(handle,chr(asc(keybite)-2))  &&用比原来低2的ASCII字符改写
=fclose(handle)
endif
*****************************************
*经过这样处理过的表就不能用USE打开,优点是加密速度快,但不彻底但用
*一个文本编辑器打开还是可以看到一些东西,怎样进一步加密还有待探讨。
*****************************************
TreeView 控件是在VFP的数据处理中很有用的一个ActiveX 控件,但是VFP的帮助中却没有相关的说明,为帮助大家对这一控件有一个详细的了解,现将TreeView 控件应用详解如下:
�▲�
一、概述
�▲�TreeView 控件显示 Node 对象的分层列表,每个 Node 对象均由一个标签和一个可选的位图组成。TreeView 一般用于显示文档标题、索引入口、磁盘上的文件和目录、或能被有效地分层显示的其它种类信息。创建了 TreeView 控件之后,可以通过设置属性与调用方法对各 Node 对象进行操作,这些操作包括添加、删除、对齐和其它操作。可以编程展开与折回 Node 对象来显示或隐藏所有子节点。Collapse、Expand 和 NodeClick 三个事件也提供编程功能。
�▲�Node 对象使用 Root、Parent、Child、FirstSibling、Next、Previous 和 LastSibling 属性。在代码中可通过检索对 Node 对象的引用,从而在树上定位。也可以使用键盘定位。UP ARROW 键和 DOWN ARROW 键向下循环穿过所有展开的 Node 对象。从左到右、从上到下地选择 Node 对象。若在树的底部,选择便跳回树的顶部,必要时滚动窗口。RIGHT ARROW 键和 LEFT ARROW 键也穿过所有展开的 Node 对象,但是如果选择了未展开的 Node之后再按 RIGHT ARROW 键,该 Node 便展开;第二次按该键,选择将移向下一个 Node。相反,若扩展的 Node 有焦点,这时再按 LEFT ARROW 键,该 Node 便折回。如果按下 ANSI 字符集 中的键,焦点将跳转至以那个字母开头的最近的 Node。后续的按该键的动作将使选择向下循环,穿过以那个字母开头的所有展开节点。

�▲】丶�的外观有八种可用的替换样式,它们是文本、位图、直线和 +/- 号的组合,Node 对象可以任一种组合出现。

�▲�TreeView 控件使用由 ImageList 属性指定的 ImageList 控件,来存储显示于 Node 对象的位图和图标。任何时刻,TreeView 控件只能使用一个 ImageList。这意味着,当 TreeView 控件的 Style 属性被设置成显示图象的样式时,TreeView 控件中每一项的旁边都有一个同样大小的图象。

�▲》⑿凶⒁� TreeView 控件是 COMCTL32.OCX 文件中的一组 ActiveX 控件的一部分。为了在应用程序中使用 TreeView 控件,必须将 COMCTL32.OCX 文件添加到工程中。在发行应用程序时,要在用户的 Microsoft Windows System 或 System32 目录中安装 COMCTL32.OCX 文件。
Treeview(续3)
二、常用属性
�▲�1、Nodes属性返回对 TreeView 控件的 Node 对象的集合的引用。
�▲� 语法:object.Nodes
�▲�object 所在处代表一个对象表达式,其值是“应用于”列表中的一个对象。
�▲∷得鳎嚎梢允褂帽曜嫉募�合方法(例如 Add 和 Remove 方法)操作 Node 对象。可以按其索引或存储在 Key 属性中的唯一键来访问集合中的每个元素。
�▲�2、Style属性返回或设置图形类型(图象、文本、+/- 号、直线)以及出现在 TreeView 控件中每一 Node 对象上的文本的类型。
�▲∮锓ǎ�object.Style [ = number]
�▲�Style 语法包含下面部分:
�▲〔糠著▲▲▲� 描述
�▲�object 对象表达式,其值是“应用于”列表中的一个对象。
�▲�number 指定图形类型的整数,请参阅“设置值”中的描述。
�▲∩柚弥�
�▲�number 的设置值是:
�▲∩柚弥� 描述
�▲�0 �▲〗鑫�文本。
�▲�1 �▲⊥枷蠛臀谋尽�
�▲�2 �▲�+/- 号和文本。
�▲�3 �▲�+/- 号,图象和文本。
�▲�4 �▲≈毕吆臀谋尽�
�▲�5 �▲≈毕撸�图象和文本。
�▲�6 �▲≈毕撸�+/- 号和文本。
�▲�7 �▲。ㄈ笔。┲毕撸�+/- 号,图象和文本。
�▲∷得鳎喝� Style 属性设置为包含直线的值,则 LineStyle 属性就确定了直线的外观。如果 Style 属性设置为不含直线的值,则 LineStyle 属性将被忽略。

�▲�3、Sorted属性返回或设置一值,此值确定 Node 对象的子节点是否按字母顺序排列;返回或设置一值,此值确定 TreeView 控件的根层节点是否按字母顺序排列。
�▲∮锓ǎ�object.Sorted [ = boolean]
Sorted 属性语法包含下面部分:
部分 �▲∶枋�
object �▲《韵蟊泶锸剑�其值是“应用于”列表中的一个对象。
boolean �▲〔级�表达式,表示 Node 对象是否已被排序如“设置值”中描述。
boolean 的设置值是:
设置值 �▲∶枋�
True �▲�Node 对象根据它们的 Text 属性按字母顺序排列。其 Text 属性由数字开始的 Node 对象也作为字符串排序,第一个数字确定在排序中的初始位置,后面的数字确定以后的排序。
False �▲�Node 对象不排序。
说明:Sorted 属性有两种用法,第一,在 TreeView 控件的根(顶)层排列 Node 对象,第二,对任何单个 Node 对象的立即子节点排序。例如,下面的代码是对 TreeView 控件的根节点排序:
TreeView1.Sorted = True '顶层 Node 对象被排序。
下面的例子表示创建 Node 对象时如何设置 Sorted 属性:
Dim nodX As Node
Set nodX = TreeView1.Nodes.Add(,,,"Parent Node")
nodX.Sorted = True
设置 Sorted 属性为 True 仅对当前 Nodes 集合排序。在 TreeView 控件中添加新的 Node 对象时,必须再次设置 Sorted 属性为 True,以便对添加的 Node 对象排列。�▲�
Treeview(续4)
�▲�
三、常用方法
�▲�1、Add 方法在 Treeview 控件的 Nodes 集合中添加一个 Node 对象。
语法:
object.Add(relative, relationship, key, text, image, selectedimage)
Add 方法的语法包含下面部分:
部分 �▲▲▲∶枋�
object �▲▲▲”匦璧摹6韵蟊泶锸剑�其值是“应用于”列表中的一个对象
relative �▲▲▲】裳〉摹R汛嬖诘� Node 对象的索引号或键值。新节点与已存在的节点间的关系,可在下一个参数 relationship 中找到。
relationship �▲】裳〉摹V付ǖ� Node 对象的相对位置,如设置值中所述。
key �▲▲▲】裳〉摹Nㄒ坏淖址�串,可用于用 Item 方法检索 Node。
text �▲▲▲”匦璧摹T� Node 中出现的字符串。
image �▲▲▲】裳〉摹T诠亓�的 ImageList 控件中的图象的索引。
selectedimage �▲】裳〉摹T诠亓�的 ImageList 控件中的图象的索引,在 Node 被选中时显示。
设置值
relationship 的设置值是:
常数 �▲▲▲≈� �▲∶枋�
tvwFirst �▲▲▲�0 �▲∈椎慕诘恪8� Node 和在 relative 中被命名的节点位于同一层,并 位于所有同层节点之前。
tvwLast �▲▲▲�1 �▲∽詈蟮慕诘恪8� Node 和在 relative 中被命名的节点位于同一层,并 位于所有同层节点之后。任何连续地添加的节点可能位于最后添加的节点之后
tvwNext �▲▲▲�2 �▲。ㄈ笔。┫乱桓鼋诘恪8� Node 位于在 relative 中被命名的节点之后。
tvwPrevious �▲�3 �▲∏耙桓鼋诘恪8� Node 位于在 relative 中被命名的节点之前。
tvwChild �▲▲▲�4 �▲。ㄈ笔。┳咏诘恪8� Node 成为在 relative 中被命名的节点的子节点。
注意如果在 relative 中没有被命名的 Node 对象,则新节点被放在节点顶层的最后位置。
说明:
Nodes 集合是一个基于 1 的集合。
在添加 Node 对象时,它被指派一个索引号,该索引号被存储在 Node 对象的 Index 属性中。这个最新成员的 Index 属性值就是 Node 集合的 Count 属性的值。
因为 Add 方法返回对新建立的 Node 对象的引用,所以使用这个引用来设置新 Node 的属性十分方便。
�▲�2、GetVisibleCount方法返回固定在 TreeView 控件的内部区域的 Node 对象的个数。
语法:object.GetVisibleCount
object 所在处代表一个对象表达式,其值是“应用于”列表中的一个对象。
说明: Node 对象的个数取决于在一个窗口中能固定多少行。总的行数取决于控件的高度和 Font 对象的 Size 属性。该计数包括列表底部的只能看到一局部的项。
可以使用 GetVisibleCount 属性确保可视的最小行数,这样可以精确地访问一个层。如果最小行数是不可视的,可以用 Height 属性重新设置 TreeView 的大小。
�▲�
四、常用事件
�▲�NodeClick 事件在一个 Node 对象被单击时,这个事件便发生。语法:Private Sub object_NodeClick(ByVal node As Node)
NodeClick 事件的语法包含下面部分::
部分 描述
object 对象表达式,其值是“应用于”列表中的一个对象。
node 对被点取的 Node 对象的引用。
说明:
在单击节点对象之外的 TreeView 控件的任何部位,标准的 Click 事件发生。当单击某个特定的 Node 对象时,NodeClick 事件发生;NodeClick 事件也返回对特定的 Node 对象的引用,在下一步操作之前,这个引用可用来使这个 Node 对象可用。
NodeClick 事件发生在标准的 Click 事件之前。

你可能感兴趣的:(职场,详解,treeview,休闲)