分享
 
 
 

C++ Builder 初学问与答(七)

王朝c/c++·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

53)问:能介绍一下TTreeNodes与TTreeNode?

答:在BCB中,树状视图的节点是通过TTreeNodes对象来治理的,通过这个对象可以对树状视图进行动态的增加、删除、插入、移动节点等操作。而每一个节点都是一个TTreeNode对象。

TTreeNode的主要属性和函数:

Count:这个属性用来返回某个节点所拥有的子节点的数目。它不包括其子节点。

Item:其声明为:_PRoperty TTreeNode* Item[int Index];这个属性用来访问该节点的某个子节点。其中参数Index为其子节点在所有子节点中的位置。

Index:这个属性用来返回该节点在其父节点的所有子节点中的位置。

Text:这个属性用来设置或者返回节点的标签。

Delete:这个函数用来删除该节点本身。

DeleteChildren:这个函数用来删除该节点的所有子节点。

EditText:这个函数用来对节点进行就地编辑。

IndexOf:其声明为:int _fastcall IndexOf(TTreeNode* Value);这个函数将返回该节点的某个子节点的序号。子节点由参数value指定。假如参数value指定的节点不是该节点的子节点,函数将返回-1。

TTreeNodes的主要属性和函数:

Count:这个属性用来返回树状视图中节点的数目。

Add:其声明为:TTreeNode *_fastcall Add(TTreeNode,const System::AnsiString S);这个函数将在树状视图中增加一个节点,新节点成为参数Node 指定的节点的父节点的最后一个子节点,参数S为新节点的标签。

AddChild:其声明为: TTreeNode *_fastcall AddChild(TTreeNode,const System::AnsiString S);增加的新节点为参数Node指定的节点的最后一个子节点。

AddChildFirst:其声明为: TTreeNode *_fastcall AddChildFirst(TTreeNode,const System::AnsiString S);这个函数与AddChild不同的是新增加的节点为Node节点的第一个子节点。

AddFirst :其声明为:TTreeNode *_fastcall AddFirst(TTreeNode,const System::AnsiString S);这个函数与Add 相似,不同的是新节点成为Node节点的父节点的第一个子节点。

Clear:这个函数将把整个树状视图都清空。

Delete:其声明:void _fastcall Delete(TTreeNode *Node);这个函数将删除参数Node 指定的节点。

Insert:其声明为:TTreeNode _fastcall Insert (TTreeNode* Node,const System::AnsiString S);这个函数用来在参数Node 指定的节点之后插入一个新的节点,新节点的标签由参数S指定。

7.图形列表组件ListView

54)问:TreeView组件能够实现资源治理器左边显示区的内容,可是它右边显示区能将列表用各种不同的方式显示,例如大图标方式、小图标方式、简单列表方式和具体列表方式。这在C++Builder应该怎样来实现?

答:这可以用ListView组件来实现,ListView组件从功能上讲与列表框相似,但是从组件的属性来看与TreeView相似。ListTiew组件所建立的列表可以用各种不同的方式显示,例如大图标方式、小图标方式、简单列表方式和具体列表方式。

ListView组件中的一部分属性与TreeView组件中的属性是相同的,例如Items,StateImages等。还有一些属性是ListView特有的。

更多内容请看C/C++技术专题专题,或

LargeImages属性用来设置存放大图标的图标列表,当列表处于大图标显示方式时,列表使用这个图标列表中的图标显示。

SmallImages属性用来设置存放小图标的图标列表,当列表处于小图标显示方式时,列表使用这个图标列表中的图标显示。

MultiSelected属性可确定用户是否可以同时选择多个项目。缺省值为false。

属性ViewStyle确定了显示风格,可以取这样一些值。

vsIcon:列表以大图标方式显示,可以进行拖放操作。只显示第一层节点,放置方式由Arrangement决定。

vsSmallIcon:列表以小图标方式显示,可以进行拖放操作。只显示第一层节点,放置方式由Arrangement决定。

vsList:以简单列表的方式显示,不能进行拖放操作。节点是竖向放置的,只显示第一层节点,Arrangement不起作用。

vsReport:以具体列表的方式显示,显示的信息可以分成多列。最左边的列显示图标和文字,其余的列显示具体信息。节点是竖向放置的,每一层均已经展开,只有此时Columns的设置才起作用,Arrangement不起作用。

属性Columns 当属性ViewStyle被设置为vsReport时,列表中的每一项可以分成多列显示,这个属性用于设置列数和列的标题。

在设计时,按下Columns属性Value列中的省略号按钮可以打开一个ListView Columns编辑器,在这个编辑器中可以生成和编辑列及列的标题。

属性ColumnClick的值为True时,列表中的标题可以作为按钮使用, 这个属性最常见的应用是在Windows 95的资源治理器中,单击文件名或者其它几个列标题,列表中的文件就会按照文件名重新排序。

属性Items 包含列表中所有项目的集合。与TreeView组件中的Items属性类似,这个属性也有一个项目编辑器,你可以使用这个编辑器在设计时增加、删除项目,设置项目的图标索引以及标题等。它的使用方法与TreeView组件的Items编辑器基本相同。

IconOptions属性用来设置图标的显示方式。它还包含几个子属性:

(1)Arrangement属性:当该属性等于iaTop时,表示图标从左到右排列在ListView组件的顶部;等于iaLeft时,表示图标从上到下排列在组件的左边。

(2)AutoArrange属性:等于True时,表示增加、删除或移动图标时图标将自动重排。

(3)WrapText属性:等于True时,表示当项目的标题超过图标的宽度时标题将换行。

此外,还有运行时态属性

Selected属性用来返回列表中被选中的项目。

TopItem属性用来返回列表中当前可见的最顶端的项目。

55)问:请您编写一个程序来帮助我理解和记忆ListView控件好吗?

答:好的,选择File菜单的New application菜单项,打开一个空的工程,在窗体上放置一个ListView控件,两个ImageList控件,一个ListBox控件。

选中ImageList1控件,将它的Height和Width属性设置为32。双击ImageList1控件,打开图像列表编辑框。点击Add按钮,选择一个大图标文件。点击打开按钮。然后点击OK按钮。同样方法给ImageList2控件加上小图标。选择TreeView控件,将它的LargeImages属性修改为ImageList1。

更多内容请看C/C++技术专题专题,或

将它的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)问:如何动态的创建一个列表视图呢?

答:我们举例说明。我先建立如图的界面。

更多内容请看C/C++技术专题专题,或

并编写如下的代码:

//------------------------------

#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 = "省会";

更多内容请看C/C++技术专题专题,或

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;

}

更多内容请看C/C++技术专题专题,或

//------------------------------

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!") ;

}

更多内容请看C/C++技术专题专题,或

//------------------------------

void __fastcall TForm1::tvwChangeing(TObject *Sender, TTreeNode *Node,

bool &AllowChange)

{

AllowChange=false;

if(Node->Text=="辽宁")

Memo1->Lines->Add("I'm changeing!") ;

}

//------------------------------

运行效果如下:

只有OnChangeing起了作用,为什么呢?再看下面代码:

//------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

更多内容请看C/C++技术专题专题,或

//------------------------------

#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;这与把此句写成AllowChange=true是一样的

if(Node->Text=="辽宁")

Memo1->Lines->Add("I'm changeing!") ;

两个事件都起作用了,并且OnChangeing先于Onchange发生,所以原因很显然:这一切都是OnChangeing的参数AllowChange造成的,所以要注重对这个参数的使用。

在ListView中只要把上面的Node->Text改成Item->Caption就可以了。

(待续)

更多内容请看C/C++技术专题专题,或

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有