硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1706|回复: 0
收起左侧

C++Builder中ListView控件用法和示例总结整理

[复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2020-8-9 01:59:23 | 显示全部楼层 |阅读模式


C++Builder中ListView控件用法和示例总结整理
示例1(此示例转自ccrun 妖哥):
[size=1em]
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    // 切换ListView的显示风格为详细信息
    ListView1->ViewStyle = vsReport;

    // 清除ListView所有列和行的内容
    ListView1->Columns->Clear();
    ListView1->Items->Clear();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // 添加第一列
    TListColumn *lc = ListView1->Columns->Add();
    lc->Caption = "第一列";
    lc->Width = 120;

    // 添加第二列
    lc = ListView1->Columns->Add();
    lc->Caption = "第二列";
    lc->Width = 80;

    // 添加第三列
    lc = ListView1->Columns->Add();
    lc->Caption = "第三列";
    lc->Width = 100;

    Application->rocessMessages();

    // 修改第二列的标题
    ShowMessage("点击确定后修改第二列的标题");
    if (ListView1->Columns->Count > 1)
    {
        lc = ListView1->Columns->Items[1];

        lc->Caption = "第二列新标题";
        lc->Width = 120;
    }

    // 添加第一行数据
    TListItem *li = ListView1->Items->Add();
    li->Caption = "一行一列";
    li->SubItems->Add("一行二列");
    li->SubItems->Add("一行三列");

    // 添加第二行数据
    li = ListView1->Items->Add();
    li->Caption = "二行一列";
    li->SubItems->Add("二行二列");
    li->SubItems->Add("二行三列");

    // 添加第三行数据
    li = ListView1->Items->Add();
    li->Caption = "二行一列";
    li->SubItems->Add("二行二列");
    li->SubItems->Add("二行三列");
<br data-filtered="filtered">    //加Application->rocessMessages()只是为了让窗口处理一下其他的消息,界面上的显示更新一下而已.在有些情况下,窗口内容变化但界面没有刷新时,可以加这么一句.
    Application->rocessMessages();

    // 修改第三行的数据
    ShowMessage("点击确定后修改第三行的数据");
    if (ListView1->Items->Count > 2)
    {
        li = ListView1->Items->Item[2];

        li->Caption = "二行一列新内容";
        li->SubItems->Strings[0] = "二行二列新内容";
        li->SubItems->Strings[1] = "二行三列新内容";
    }
}



示例2: 
ListView右键点击图标弹出菜单的用法
将ListView的PopupMenu属性设为MyPopupMenu,这样只要选中ListView点右键即可出现我的MyPopupMenu菜单。
但这种方式,无论右击ListView上的任何位置,都会弹出菜单,要想必须选中某个子项后才能进行菜单事件的话,可以在菜单事件中加入判断,没有选中则返回
if(ListView1->Selected == NULL)
  return;

另一种方式是,将ListView的PopupMenu属性留空,在ListView的OnMouseDown事件中处理
[size=1em]
1

2

3

4

5

6

7

8

9

10

11

12

13

14

void __fastcall TMainForm:istView1MouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
{
  //不是右击或者没有点中则返回,不作反应
  if(Button != mbRight || NULL==ListView1->GetItemAt(X, Y))
     return;

  //只点选图标,不能点文字,可以加以下3行
  THitTests ht=ListView1->GetHitTestInfoAt(X,Y);
  if(!ht.Contains(htOnIcon))
     return;

  PopupMenuZW->opup(Mouse->CursorPos.x, Mouse->CursorPos.y);
}




示例3
多个ListView共用一个PopupMenu,菜单事件中要传递被选中的项目信息,如果是数字,可以在点击事件中复制给PopupMenu的Tag,在菜单事件中调用Tag值即可,如果是文字信息,目前想到的是如下方法:
[size=1em]
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

void __fastcall TMainForm::N2Click(TObject *Sender)
{
    if (PopupMenuZW->opupComponent->Name=="ListView1")
    {
      if(ListView1->Selected == NULL)
        return;

      Edit4->Text=ListView1->Selected->Caption;
    }

    if (PopupMenuZW->opupComponent->Name=="ListView2")
    {
      if(ListView2->Selected == NULL)
        return;

      Edit4->Text=ListView2->Selected->Caption;
    }

    if (PopupMenuZW->opupComponent->Name=="ListView3")
    {
      if(ListView3->Selected == NULL)
        return;

      Edit4->Text=ListView3->Selected->Caption;
    }

    if (PopupMenuZW->opupComponent->Name=="ListView4")
    {
      if(ListView4->Selected == NULL)
        return;

      Edit4->Text=ListView4->Selected->Caption;
    }

    if (PopupMenuZW->opupComponent->Name=="ListView5")
    {
      if(ListView5->Selected == NULL)
        return;

      Edit4->Text=ListView5->Selected->Caption;
    }

}




示例4  
获取ListView中某行某列的值,可以
[size=1em]
1

2

3

4

ListView1->Items->Item->Caption = "第i行第1列的值";
ListView1->Items->Item->SubItems->Strings[0]= "第i行第2列的值";
ListView1->Items->Item->SubItems->Strings[1]= "第i行第3列的值";
ListView1->Items->Item->SubItems->Strings[2]= "第i行第4列的值";<br>  



已知某项的值,修改对应的图标,目前想到的方法是
[size=1em]
1

2

3

4

5

6

7

for(int i=0;i<=ListView1->Items->Count-1;i++)
{
    if(ListView1->Items->Item->Caption=="5排8座")<br>     {
     ListView1->Items->Item->ImageIndex=1;
     break;
    }
}




其他搜集到的示例:
[size=1em]
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

转自C++Builder 移动开发研究 (92227302) QQ群
让ListView控件失去焦点后仍保持选中状态:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ListView1->HideSelection = false; // 失去焦点后仍保持选中状态
  //suiTreeView1->HideSelection = false; // 失去焦点后仍保持选中状态
}

对suiDBMemo控件等同样适用,但ListBox控件没有这样的属性。

使用图标:

  //ListView1->LargeImages=ImageList1; // 设置存放大图标的图标列表,当列表处于大图标显示方式时,列表使用这个图标列表中的图标显示
  ListView1->SmallImages=ImageList1; // 设置存放小图标的图标列表,当列表处于小图标显示方式时,列表使用这个图标列表中的图标显示
  //ListView1->StateImages=ImageList1; // 状态图标,用不同的的图像来表示节点的不同状态
  // 如果要在不是当前被选中的节点的左边显示图像,那么应该在编辑框Image Index
  // 中输入图像的索引号。要禁止显示图像可以把这个节点Image Index设置为缺省值-1。
  // 如果要在被选中的节点的左边显示图像,应该在编辑框Selected Index中指定图像的索引号,索引号是从0开始的。要禁止显示图像可以把它设置为缺省值-1。
  // 如果要在节点的左边多显示一个图像,可以在编辑框State Index中输入图像的索引号。这个索引号代表Tree View组件中的StateImages属性所表示的图像列表的索引。要禁止显示图像可以把这个项目设置为缺省值-1。
  // 注意:Image Index与 Selected Index 使用的是Images指定的ImageList;而State Index使用的是StateImages 指定的ImageList。

  ListView1->Items->Item[ListView1->Items->Count-1]->ImageIndex=0; // 最后一个节点是使用第一个图标

1、常用代码:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  //Edit1->Text=ListView1->SelCount; // 取得被选中的节点总数

  //ListView1->Selected->ImageIndex=1; // 改变选中节点图标

    //if(suiListView1->Items->Count<=0) // 判断是否为空

  //Edit1->Text=ListView1->Items->Count; // 取得节点总数

  //ListView2->Items=ListView1->Items; // 在两个ListView控件之间传递结构

  //ListView1->Items->Item[a] = ListView1->Items->Item[a+1]; // 在两个节点之间传递结构

  //ListView1->Items->Add()->Caption = Edit1->Text; // 增加新节点

  //ListView1->Items->Add()->SubItems->Add("str"); // 仅增加子节点

  //ListView1->RowSelect = true; // 允许整行选中

  //ListView1->Clear(); // 清空
  或:
  //ListView1->Items->Clear(); // 清空

  //Edit1->Text=ListView1->Items->Count; // 取得总行数

  //Edit1->Text=ListView1->Selected->Index; // 取得选中行的行号
  或:
  //Edit1->Text=ListView1->Items->IndexOf(ListView1->Selected); // 取得选中行的行号

  //Edit1->Text=ListView1->Selected->SubItems->Text; // 取得选中节点下所有子节点的文本,不同节点的文本之间用空格分开

  //ListView1->Selected->Delete(); // 从ListView视图中将选中的条目删除

  //Memo1->Lines->Add(ListView1->Items->Item[0]->Top); // 指定节点的竖向位置

  //Memo1->Lines->Add(ListView1->Items->Item[0]->Left); // 指定节点的横向位置

  //Edit1->Text=ListView1->Items->Item[0]->Caption; // 取得指定节点的文本

  //Edit1->Text=ListView1->Selected->Caption; // 取得选中节点的文本
  或:
  //Edit1->Text=ListView1->Items->Item[ListView1->Selected->Index]->Caption; // 取得选中节点的文本

  //ListView1->Items->Item[0]->Caption = "sdfs"; // 修改第一层指定节点的文本

  //ListView1->Items->Item[ListView1->Items->Count-1]->SubItems->Add("buffer"); // 在最后一行追加子节点

  //ListView1->Items->Item[0]->SubItems->Add("buffer"); // 在指定行追加子节点
  // 本教程由 C++Builder 移动开发研究 (92227302) QQ群原创并群内首发,转载请注明出处,谢谢合作!
  ListView1->ViewStyle=vsIcon; // 大图标
  //ListView1->ViewStyle=vsSmallIcon; // 小图标
  //ListView1->ViewStyle=vsList; // 列表
  //ListView1->ViewStyle=vsReport; // 详细资料
}

3、追加节点:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //ListView1->Clear(); // 清空
  ListView1->Items->Add(); // 增加节点
  ListView1->Items->Item[ListView1->Items->Count-1]->Caption = "hniuh"; // 给节点命名
}

4、当鼠标指针移动到节点上时,改变字体颜色为蓝色:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ListView1->HotTrack=true; // 当鼠标指针移动到节点上时,改变字体颜色为蓝色
}
  或:
void __fastcall TForm1:istView1CustomDrawItem(TCustomListView *Sender,
      TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
{
  ListView1->HotTrack=true; // 当鼠标指针移动到节点上时,改变字体颜色为蓝色
}

5、禁止用户通过鼠标直接点击的方法修改节点的文本:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ListView1->ReadOnly=true; // 禁止用户直接修改节点的标题
}

6、设置指定的行处于选中状态:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  ListView1->Items->Item[0]->Selected=True; // 设置指定的行处于选中状态,行号从0开始
  ListView1->SetFocus(); // 获得焦点
  或:
  //ListView1->Selected = ListView1->Items->Item[0];
  //ListView1->SetFocus(); // 获得焦点
}

7、在控件中增加新列并显示列图标:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  TListColumn* NewColumn; // 列表列
  //ListView1->RowSelect = true; // 准许可以整行选中
  NewColumn = ListView1->Columns->Add(); // 增加一列
  NewColumn->Caption = "自转周期(天)"; // 列的名称
  NewColumn->Width = 100; // 列的宽度
  NewColumn->ImageIndex=1; // 列头图标号
  //delete NewColumn; // 使用后添加的项目被清除
}

8、添加新节点并指定节点图标:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  //ListView1->Clear(); // 清空
  TListItem * pList = ListView1->Items->Add();
  pList->Caption = Edit1->Text;
  pList->SubItems->Add("str");
  pList->ImageIndex=1;
  //delete pList; // 使用后添加的项目被清除
}

9、更换选中节点的图标:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(ListView1->SelCount>0) // 如果有节点被选中
      ListView1->Selected->ImageIndex=1; // 更换选中节点的图标
}

10、更换所有节点的图标:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    for(int i=0;i<=ListView1->Items->Count-1;i++){
      ListView1->Items->Item->ImageIndex=1;
    }
}






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 03:25 , Processed in 0.152518 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表