第8章VCL组件应用(续二)本章重点树状视图组件TreeView列表视图组件ListView跟踪条组件TrackBar和进度条组件ProgressBarTab组件TabControl和多页面组件PageControl第0节ImageList组件(补充)ImageList组件又称图像列表组件,位于组件板的Win32页,属于非可视组件,用于为其他组件(如TreeView、ListView、工具栏等)提供图片。在设计阶段向ImageList组件中添加图片的方法如下:双击窗体上的ImageList控件,打开图像列表对话框,单击其中的【Add...】按钮,在弹出的【AddImages】对话框中查找并选择适当的图片加入到控件中。加入到控件中的每一幅图片均有一个索引号(下界为0),通过索引号访问其中的图片。第1节TreeView和ListView组件一、TreeView组件TreeView组件又称树状视图组件,位于组件板的Win32页。该组件可显示由一系列Node对象(节点)组成的树状分层结构列表。TreeView常用于显示文档标题、部门分类、文件目录或具有层次结构的其他信息。TreeView组件的常用属性、方法和事件见教材172~174页,下面从实际应用的角度讨论该组件的使用。1.理解Items属性、TTreeNode对象和TTreeNodes对象TreeView控件中的每个列表项都是一个TTreeNode对象(节点),节点可包含文本和图片。节点之间的关系可以是父子关系(filiation)或兄弟关系(sibling)。控件中的所有TTreeNode对象(节点)构成一个数组,即TTreeNodes对象。数组中的每一个节点具有一个惟一的索引(下界为0),利用索引可以访问数组中的每个节点。TTreeNodes对象提供了若干方法,用于操作其中的节点。较常用的方法包括Add、AddChild、AddFirst、AddChildFirst、Insert、Clear和Delete等。TreeView控件的Items属性是对TTreeNodes对象的封装,它的类型为TTreeNodes,代表属于本控件的TTreeNodes对象。设计时或运行时对TTreeNodes对象的操作实际上是通过Items属性实现的。例如,控件中的第二个节点可以表示为:TreeView1.Items[1]2.设置Images属性TreeView控件中的每个节点通常带有两个图片,分别表示选定和未选定状态。节点所需图片由ImageList控件提供。如果需要在节点上显示图片,在添加节点前应将TreeView控件的Images属性指定为窗体上已有的ImageList控件。3.设计时添加节点在设计阶段,节点的添加是通过树状视图编辑器对话框【TreeViewItemsEditor】实现的(参见教材174页图8.4)。打开该对话框的方法如下:方法1:双击窗体上的TreeView控件。方法2:选定TreeView控件,在属性窗口单击Items属性右侧的...按钮。方法3:右击TreeView控件,在弹出的快捷菜单中选择【ItemsEditor...】命令。该对话框左部的【Items】分组框中有4个按钮,功能如下:【NewItem】:添加节点。【NewSubItem】:为当前节点添加子节点。【Delete】:删除当前节点。【Load】:从含有节点列表的文件中导入节点。在对话框右部的【ItemProperties】分组框中设置当前节点的属性:【Text】:节点标签文本。【ImageIndex】:指定当前节点未选定时的图片索引号。【SelectedIndex】:指定当前节点选定时的图片索引号。【StateIndex】:指定当前节点的附加图片索引号,通常设置为-1,表示无附加图片。上述属性中的图片均由ImageList控件提供。4.运行时添加、删除和清空节点TreeView控件的Items属性本身就是一个TTreeNodes对象,可以在代码中直接调用该对象的各种方法,实现节点的添加、删除和清空。(1)Add和AddFirst方法(添加兄弟节点)Add方法格式:TreeView控件名.Items.Add(现有节点,新节点文本);AddFirst方法格式:TreeView控件名.Items.AddFirst(现有节点,新节点文本);这两种方法的功能相似,均可为“现有节点”添加一个兄弟节点,其区别仅在于新节点的位置不同。Add方法添加的新节点位于所有同级节点的最后,而AddFirst方法添加的新节点位于所有同级节点的首位。例如:withTreeView1doItems.Add(Items[0],'NewNode');若控件中尚无节点,应将“现有节点”参数设置为nil。例如:TreeView1.Items.Add(nil,'NewNode');又如:TreeView1.Items.AddFirst(nil,'NewNode');若控件中已有节点,“现有节点”参数亦可为nil,此时将在所有顶层节点之后(Add方法)或之前(AddFirst方法)添加一个顶层节点。这两种方法的返回值都是新添加的节点(TTreeNode对象),可以将它赋值给一个TTreeNode类型的变量,然后设置该节点的属性。例如:procedureTForm1.Button1Click(Sender:TObject);varNode:TTreeNode;//声明节点对象变量beginNode:=TreeView1.Items.Add(nil,'NewNode');//添加节点并赋值给变量Node.ImageIndex:=0;//指定节点未选定状态的图片Node.SelectedIndex:=1;//指定节点选定状态的图片end;(2)AddChild和AddChildFirst方法(添加子节点)AddChild方法格式:TreeView控件名.Items.AddChild(父节点,新节点文本);AddChildFirst方法格式:TreeView控件名.Items.AddChildFirst(父节点,新节点文本);这两种方法的功能相似,均可为“父节点”添加一个子节点,其区别仅在于新节点的位置不同。AddChild方法添加的新节点位于所有同级节点的最后,而AddChildFirst方法添加的新节点位于所有同级节点的首位。两种方法的返回值都是新添加的节点。例如,以下语句为控件中的第一个节点添加子节点:withTreeView1doItems.AddChild(Items[0],'NewChild');以下语句为选中的节点添加子节点:withTreeView1doItems.AddChild(Selected,'NewChild');(3)Insert方法(插入兄弟节点)格式:TreeView控件名.Items.Insert(现有节点,新节点文本);Insert方法在“现有节点”之前插入一个兄弟节点,返回值为新添加的节点。例如:withTreeView1doItems.Insert(Selected,'NewNode');(4)Delete方法(删除节点)格式:TreeView控件名.Items.Delete(现有节点);Delete方法删除“现有节点”及其所有子节点。“现有节点”必须存在,且不得为nil。例如,以下语句删除选定的节点及其子节点:withTreeView1doifSelectednilthenItems.Delete(Selected);(5)Clear方法(清空节点)格式:TreeView控件名.Items.Clear;Delete方法删除控件中的所有节点。例如:TreeView1.Items.Clear;5.示例下面通过实例说明该控件的应用。【示例】在TreeView控件中动态建立系和班级的分层列表。程序运行效果如下图所示。(1)设计界面及设置属性新建工程,在窗体上添加一个TreeView控件和一个ImageList控件,均采用默认名称。在ImageList控件中添加4个图片。选定TreeView控件,在属性窗口将Images属性设置为ImageList1。添加5个命令按钮,将Cpation属性分别设置为“添加系”、“添加班级”、“删除”、“清空”和“退出”。(2)添加系在“添加系”按钮的单击事件过程中首先声明节点对象变量:varNode:TTreeNode;然后加入以下代码:Node:=TreeView1.Items.Add(nil,'X系');//添加节点并为变量赋值Node.ImageIndex:=0;//设置节点图片Node.SelectedIndex:=1;//设置节点被选定时的图片Node.Selected:=True;//选定新节点Node.EditText;//使新节点标签处于编辑状态以便用户修改(3)添加班级在“添加班级”按钮的单击事件过程中首先声明节点对象变量,然后加入以下代码:withTreeView1dobeginifSelected=nilthenExit;//若未选定节点退出本过程{若选定的节点是系节点(无父节点)则添加子节点,否则添加兄弟节点}ifSelected.Parent=nilthenNode:=Items.Addchild(Selected,'X级X班')elseNode:=Items.Add(Selected,'X级X班');end;后续代码如设置节点图片、选定节点以及编辑节点标签等与“添加系”相同。(4)其他操作“删除”和“清空”功能参考前面的介绍。“退出”按钮用于关闭窗体。6.节点对象的Level属性(补充)TTreeNode对象的Level属性表示本节点在TreeView组件中所处的层次。该属性为整数类型,所有顶层节点的Level属性值均为0,它们的子节点的Level属性值均为1,依此类推。例如,前述示例中“添加班级”操作中的代码ifSelected.Parent=nilthen可改为:ifSelected.Level=0then7.响应TreeView组件的OnChange事件OnChange是TreeView组件较常用的事件,该事件在选取节点发生改变时触发。例如,教材177页(10)有如下代码:procedureTfrmMain.tvMajorChange(Sender:TObject;Node:TTreeNode);beginedtDisplay.Text:=tvMajor.Selected.Text;end;上述代码的作用是当用户选择节点时将所选节点的文本显示在编辑框中。OnChange事件过程的Node参数代表所选节点,因此上述事件过程中的代码可改为:edtDisplay.Text:=Node.Text;二、列表视图组件列表视图组件ListView位于组件板的Win32页上,与列表框组件ListBox非常相似。不同的是,列表视图组件可以让用户选择不同的显示方式,如:大图标、小图标、列表和详细资料方式等。Windows操作系统的资源管理器的左边是一个TreeView组件,右边就是一个典型的ListView组件。ListView组件中显示的项目由Items属性设置,其显示方式则由ViewStyle属性确定。(教材误,178页,9行)ListView组件的应用示例见教材178页【例8-2】。第2节跟踪条组件和进度条组件跟踪条组件(TrackBar)和进度条组件(ProgressBar)位于组件板的Win32页,二者均可用于指示一个区域或范围中的位置,它们有很多相似的属性、方法和事件,如Max、Min、Orientation、Positiond属性等;TrackBar最常用的事件是OnChange;ProgressBar最常用的方法是StepIt和StepBy。一、TrackBar组件TrackBar组件是带有刻度和滑块(指针)的轨道条。该组件可指示的刻度是一个连续范围内的整数,拖动滑块或在轨道条内单击可使滑块移动。特殊属性:Max和Min:设置轨道条的