选中ImageList1控件,将它的Height和Width属性设置为32。双击ImageList1控件,打开图像列表编辑框。点击Add按钮,选择一个大图标文件。点击打开按钮。然后点击OK按钮。同样方法给ImageList2控件加上小图标。选择TreeView控件,将它的LargeImages属性修改为ImageList1。
将它的SmallImages属性修改为ImageList2。在ListView控件上点击鼠标右键,选择Columns Editor选项(当然我们只要点击属性Columns右边的就可以了)。弹出Columns编辑对话框。点击Add New工具按钮加入四个列表,选中它们,将它们的caption属性修改为名称、大小、类型、修改时间。
关闭列表编辑对话框。
在ListView控件上点击鼠标右键(同样我们只要点击 Itmes属性右边的也一样),选择Items Editor选项。弹出Items编辑对话框(与TreeView的Items Editor差不多),输入树型结构文档。在这里,点击New Item按钮可以新建一个项,NewSubItem按钮用来设置这个项的子项。Delete用来删除某个项,包括它的子项。项司性编辑框中,Caption为这个项的标题,另外两个为项的图标。
编写列表框的OnClick事件代码如下:
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
switch(ListBox1-ItemIndex)
{
case 0: ListView1-ViewStyle=vsIcon;
break;
case 1: ListView1-ViewStyle=vsSmallIcon;
break;
case 2: ListView1-ViewStyle=vsList;
break;
case 3: ListView1-ViewStyle=vsReport;
break;
}
}
//---------------------------------------------------------------------------
把ListView中的ViewStyle属性改为vsReport,否则你将得不到上面的那种显示方式。
最后,编译并运行这个程序,选择不同的类型,我们可以看到TreeView控件的效果。
56)问:在TreeView、ListView中的图标管理能再说一下吗?
答:图形列表组件很难理解的,主要问题是不太容易掌握它使用图标的方式。图形列表组件使用一个名为ImageList的组件管理所有的图标,ImageList给每个图标提供一个索引号,这样在TreeView或ListView组件引用时就不必指出图标的名字而直接指定索引号就可以了。用ImageList集中管理图标,用户使用图标索引号的方式的确从某种角度减轻了编程人员的负担,但是也使得他们在编程时必须记住一大堆编号代表的各是哪一种图标,这就在一定程度上削弱了ImageList的优势,也许在C++Builder以后的版本中能有更好的方法。
57)问:如何动态的创建一个列表视图呢?
答:我们举例说明。我先建立如图的界面。
并编写如下的代码:
//---------------------------------------------------------------------------
#include vcl.h
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
const char Names[6][3][10] =
{{"广东省","广州市","华南"},
{"上海市", "上海市","华东"},
{"北京市", "北京市","华北"},
{"辽宁省", "沈阳市","东北"},
{"湖北省", "武汉市","华中"},
{"云南省", "昆明市","西南"}};//准备各项的文字
TListColumn *NewColumn;//创建一个栏
TListItem *ListItem;//创建一个Items
ListView1-ViewStyle = vsReport;//定义显示方式
Button3-Enabled=false;
NewColumn = ListView1-Columns-Add();//增加栏
NewColumn-Caption = "省份";//添置栏的名称
NewColumn = ListView1-Columns-Add();
NewColumn-Caption = "省会";
NewColumn = ListView1-Columns-Add();
NewColumn-Caption = "方位";
for (int i = 0; i 6; i++)
{
ListItem = ListView1-Items-Add();
ListItem-Caption = Names[i][0];//添置父节点
ListItem-SubItems-Add(Names[i][1]);//添置子节点
ListItem-SubItems-Add(Names[i][2]);
}
}/*此处有些朋友总感觉为什么还要创建TListColumn *NewColumn;
TListItem *ListItem;其实我们只要这样想就可以了,我们再手功创建时打开Columns、Items时等于又创建了一个项目,他们并不存在,我们却要用,所以只能用这种方法来动态创建了J*/
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TListItem *temp;
temp=ListView1-Items-Add();
temp-Caption=Edit1-Text;
temp-SubItems-Add(Edit2-Text);
temp-SubItems-Add(Edit3-Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ListView1-Items-Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
ListView1-ViewStyle = vsReport;
Button3-Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
ListView1-ViewStyle = vsIcon;
Button3-Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ListView1-AlphaSort(); //这个函数的作用是把列表视图中的项按照它们的标签字母顺序排列,成功返回true。
}
//---------------------------------------------------------------------------
58)问:我要想对TreeView、ListView里面的项进行操作如何来进行呢?
答:我们一般都是通过OnChange或OnChangeing事件来完成的,我们通过一个例子来看一下他们的应用及区别,我们在窗体中放上一个TreeView和一个Memo组件,并在TreeView的OnChange和OnChangeing分别写如下代码:
//---------------------------------------------------------------------------
#include vcl.h
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::tvwChange(TObject *Sender, TTreeNode *Node)
{
if(Node-Text=="辽宁")
Memo1-Lines-Add("I'm change!") ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::tvwChangeing(TObject *Sender, TTreeNode *Node,
bool &AllowChange)
{
AllowChange=false;
if(Node-Text=="辽宁")
Memo1-Lines-Add("I'm changeing!") ;
}
//---------------------------------------------------------------------------