[转]Delphi 常用控件之TlistView总结
TlistView组件功能:
(1) TListView 控件可以用来显示各项带图标的列表,包括大图标和小图标的;也可以用来显示带有子项的列表,Windows操作系统的资源管理器中文件夹窗口就是最好的应用例子,就是我们打开"我的电脑"后能够看到各个盘符的界面
( 2) TListView控件基本能实现和DBGrid控件一样的功能,很多时候根据程序需要可以完全用TListView来替换DBGrid;只要将TListView的ViewStyle属性设为vsReport,然后再配合其他几个属性(这个稍后说明),就可以实现DBGrid中的绑定数据库、数据添加、修改、删除、不同列的不同颜色显示及单击标题排序等等一系列常用的功能;
TListView 组件的常用属性
(1)BoundingRect 属性
此属性返回一个能把列表视图中所有项包住的矩形。此属性仅在ViewStyle 属性设为vsIcon 或vsSmallIcon 时有效。
(2)CheckBoxed 属性
当ViewStyle 属性设为vsList 或vsReport 时,如果把CheckBoxes 属性设为True,列表视图中项的旁边将显示复选框,如同TCheckListBox 组件一样。
(3)Column 属性
此属性可以访问列表视图中每一栏,Index 指定栏的序号。此属性仅当ViewStyle 属性设为vsReport时有效。
(4)ColumnClick 属性
如果此属性设为True,栏的表头(如果有的话)将同时作为按钮用,按下这些按钮,将触发OnColumnClick 事件,通常用于对列表视图中的项进行重新排序。
(5)Columns 属性
如果ViewStyle 属性设为vsReport,列表视图的每一项将分成多栏,每一栏都是一个TListColumn对象,所有的栏构成TListColumn 对象。
在设计期,可以单击Columns 属性旁的省略号"…"按钮打开"Editing Columns"窗口,然后建立和编辑栏的属性。
(6)HideSelection 属性
如果此属性设为True,当输入焦点从列表视图移到其他组件上时,原先选择的节点将不再处于被选择状态。如果此属性设为False,当输入焦点移走时仍然保持选择状态。
(7)ItemFocused 属性
此属性指定或返回列表视图中具有输入焦点的项。一个列表视图中可以同时有多个项被选择,但只能有一个项具有输入焦点。
(8)Items 属性
此属性代表列表视图中的所有项。列表视图中的每一项是一个TListItem 对象。在设计期,可以按下Items 属性旁的"..."按钮打开"ListView Items"编辑器,然后建立和编辑列表视图中的每一项.
(9)MultiSelect 属性
如果此属性设为True,用户可以同时选择多个项。
(10)RowSelect 属性
在ViewStyle 属性设为vsReport 的前提下,如果把此属性设为True,用户可以一次选择一整行。
(11)Selected 属性
此属性用于设置返回列表视图中被选择的项。如果有多项被选择,返回的是当前有输入焦点的项。
(12)ShowWorkAreas 属性
在ViewStyle 属性设为vsIcon 或vsSmallIcon 的情况下,通过定义工作区,可以把图标分组,如果ShowWorkAreas 属性设为True,列表视图将把客户区分成几个工作区,每个工作区的颜色由TWorkArea的Color 属性指定,标签由TWorkArea 的DisplayName 属性指定。
(13)SortType 属性
此属性用于设置什么情况下列表视图中的项将重新排列。它设定了如下4 个用户可选值。
�6�1 stNone:不重新排序。
�6�1 stData:项的Data 属性发生变化时重新排序。
�6�1 stText:项的Caption 属性发生变化时重新排序。
�6�1 stBoth:项的Data 属性或Caption 属性发生变化时重新排序。
(14)ViewStyle 属性
ListView 控件作为一个可以显示图标或者子项的列表控件,它最重要的属性就是 ViewStyle 属性,该属性决定了以哪种视图模式显示控件的项,这四种视图模式分别如下:
1. vsIcon:大图标视图模式,在项的文本旁显示大的图标,在控件宽度足够的情况下,项是优先以平行排列的,排列不完的则自动换行显示在新行中。这个属性要和TListView的LargeImages属性一起使用;
2. vsSmallIcon:小图标视图模式,与大图标模式一样,但是显示的是小的图标;要和TListView的SmallImages属性一起使用;
3. vsList:列表视图模式,可以显示小图标,但是项是垂直排列的,只显示单列,不能进行拖放操作;
4. vsReport:详细资料视图模式,是最丰富的选项,可以基本实现DBGrid的所有功能;它不但允许您查看项,还允许您查看为各项指定的任何子项。各项在网格中显示,它们垂直排列且其子项会显示在列中(带有列标头)。对应地,只有在Details 视图模式中起作用的控件属性为:GridLines 和 FullRowSelect,GridLines 属性指示在包含控件中项及其子项的行和列之间是否显示网格线。FullRowSelect 属性指示单击某项是否选择其所有子项(即整行选中)
Columns属性是用来设置有哪些列,这个可以在设计时事先设定,也可以在程序中设定:ListView1.Columns.Items[0].Caption:= '列1';
ListView1.Columns.Items[1].Caption:= '列2';//添加列
ListView1.Columns.Items[2].Caption:= '列3';
ListView1.Columns.Items[2].Width:=300; //这里设定列的宽度
TListView的Items属性也是很重要的,用来向ListView中添加数据, Items属性是一个TListItem类,在进行数据添加时一般先定义个TListItem类。
TListView 组件的常用事件
(1)OnColumnClick 事件
当用户单击栏的表头时,将触发该事件。这样就可以对项进行排序。在OnColumnClick 事件中有一个TListColumn 类型的参数Column,此参数返回用户单击的栏,利用Column 参数可以对用户选中的栏进行访问及设置。
(2)OnColumnDragged 事件
当用户用鼠标左键拖动某一栏到一个新的位置时,将触发该事件。在使用此事件之前必须将TListView 组件的FullTrag 属性设置为True,表示可以拖动栏的位置,否则不能拖动,也就不能触发此事件。
(3)OnEdited 事件
当用户直接编辑修改了项的标签后,将触发该事件。OnEdited 事件中有一个TListItem 类型的参数Item,利用此参数可以对用户编辑的项进行访问;OnEdited 事件中还有一个String 类型的参数S,它是用户更改项的标签后,显示标签的内容。
(4)OnInfoTip 事件
通过这个事件可以为列表视图中的每一项加上提示。OnInfoTip 事件中有一个TListItem 类型的参数Item,利用此参数可以对用户编辑的项进行访问;OnInfoTip 事件中还有一个String 类型的参数InfoTip,更改它的值就可以为每一项加上提示。
例如将每一项的提示设置为项的标签内容,就可以在OnInfoTip 事件中添加如下代码:
InfoTip:=Item.Caption;
如果要显示提示信息,必须将TListView 组件的ShowHind 属性设置为True。
(5)OnSelectItem 事件
当列表视图中一个项被选择时,将触发这个事件。OnSelectItem 事件中有一个TListItem 类型的参数Item,利用此参数可以对用户编辑的项进行访问;OnSelectItem 事件中还有一个Boolean 类型的参数Selected。每次选择一个新项时将两次触发此事件,一次是释放以前被选择的项,Selected 参数取值为False,代表释放Item 参数指定的项;另外一次是选择新的项,Selected 参数取值为True,代表选择Item 参数指定的项。
TListView 组件常用的方法
(1)AlphaSort 方法
此方法可以将列表视图中的项按标签的字母顺序排序。例如使用下面的代码就能够将ListView1组件的项按标签的字母顺序排序:
ListView1.AlphaSort;
(2)Arrange 方法
此方法用于重排图标。Arrange 方法只有在ViewStyle 属性为vsIcon 或vsSmallIcon 时才起作用。
Arrange 方法中有一个TListArrangement 类型的参数Code,此参数用于指定图标的排列方式,其取值及功能如下。
�6�1 arAlignBottom:图标底部对齐排列。
�6�1 arAlignLeft:图标左侧对齐排列。
�6�1 arAlignRight:图标右侧对齐排列。
�6�1 arAlignTop:图标顶部对齐排列。
�6�1 arDefault:按照窗口刚建立时的风格将图标从顶部排列。
�6�1 arSnapToGrid:将图标对齐到最近的网格,此值不支持虚拟模式。
(3)FindCaption 方法
此方法的调用可以搜索并返回一个TListItem 类型的项。FindCaption 方法中有5 个参数,功能如下。
�6�1 StartIndex:Integer 类型,用于指定开始搜索的起始位置。
�6�1 Value:String 类型,指定要搜索的项的标题符合的内容。
�6�1 Partial:Boolean 类型,取True 值,查找标题开头为Value 参数指定的项;取False 值,查找标题与Value 参数指定的内容相同的项。
�6�1 Inclusive:Boolean 类型,取True 值,被StartIndex 指定的项是第1 个被选中的;取False 值,开始查找的位置从StartIndex 拟定的下一个位置开始。
�6�1 Warp:Boolean 类型,取True 值,搜索将从开始找到最后;取False 值,搜索从StartIndex 位开始查找,找到最后。
FindCaption 方法返回的是第1 个被找到的符合条件的项,如果没找到符合条件的,则返回列表中的第1 项。
(4)Scroll 方法
此方法可以使列表视图滚动。Scroll 方法有两个Integer 类型的参数。
�6�1 DX:控制视图的左右一次移动的像素数,正数代表向右移动,负数代表向左移动。
�6�1 DY:控制视图的上下一次移动的像素数,正数代表向下移动,负数代表向上移动。
(5)StringWidth 方法
此方法用于返回字符串的宽度。StringWidth 方法中用到一个String 类型的参数S,StringWidth 方法是根据当前TListView 组件的字体、字号返回参数S 指定的字符串宽度的像素数。
此方法可以重画指定范围内的项。UpdateItems 有两个Integer 类型的参数:
�6�1 FirstIndex:用于指定重画项的开始位置。
�6�1 LastIndex:用于指定重画项的最后位置。
TlistView组件的使用方法
引用CommCtrl单元
(1)赋值
with ListView1.Items.Add do
begin
Caption:=caption; //添加第一项
SubItems.add(aaaaa); //
SubItems.add(1234);
SubItems.add(1234);
end;
with ListView1 do
begin
ListItem:=Items.Add;
ListItem.Caption:='第一列内容';
ListItem.SubItems.Add('第二列内容');
end;
(2)取值
Edit1.Text := listview1.Items[i].Caption; //读第i行第1列
Edit2.Text := listview1.Items[i].SubItems.strings[0]; //读第i行第2列
Edit3.Text := listview1.Items[i].SubItems.strings[1]; //读第i行第3列
listview1.Items.Item[i].Caption 取得某条数据标题
listview1.Items.Item[i].SubItems.Strings[j] 取得某条数据内容
listview1.Items.Item[i].SubItems.CommaText 一条记录的全部内容,格式: "标题","内容1","内容2",....
listview1.Items.Item[i].SubItems.Text 一条记录的全部内容,格式: 标题,内容,内容2....
(3)删除
listview1.Items.Item[i].Delete; 删除一条数据
(4)数据类型(长度)定义
i:=ListView1.Items.Count 数据条数
listview1.Items.Item[i].Selected 该条数据选中否(MultiSelect决定单选复选)
(5) 清除数据
ListView1.Items.Clear; 清除数据
(6)插入一列
DestItem := lvList.Items.Insert(CurItem.Index );//在当前列前面插入一列
DestItem := lvList.Items.Insert(CurItem.Index + 1);//在当前列后面插入一列
然后对DestItem按(1)中的方法赋值,注意对于每条记录Item,其Item.SubItems.Count可能不同。
(7)删除一列
lvList.Items.Delete(tItem.Index);//删除当前列
lvList.Items.Delete(tItem.Index + 1);//删除当前列后面一列,要先判断其存在
//这是个通用的过程
procedure ListViewItemMoveUpDown(lv : TListView; Item : TListItem; MoveUp, SetFocus : Boolean);
var
DestItem : TListItem;
begin
if (Item = nil) or
((Item.Index - 1 < 0) and MoveUp) or
((Item.Index + 1 >= lv.Items.Count) and (not MoveUp))
then Exit;
lv.Items.BeginUpdate;
try
if MoveUp then
DestItem := lv.Items.Insert(Item.Index - 1)
else
DestItem := lv.Items.Insert(Item.Index + 2);
DestItem.Assign(Item);
lv.Selected := DestItem;
Item.Free;
finally
lv.Items.EndUpdate;
end;
if SetFocus then lv.SetFocus;
DestItem.MakeVisible(False);
end;
//此为调用过程,可以任意指定要移动的Item,下面是当前(Selected)Item
ListViewItemMoveUpDown(ListView1, ListView1.Selected, True, True);//上移
ListViewItemMoveUpDown(ListView1, ListView1.Selected, False, True);//下移
TlistView组件常用技巧
实现不同行颜色不一样
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin //OwnerDraw应该设置为False
if Item.Index mod 2 =0 then
Sender.Canvas.Brush.Color :=clSkyBlue
else
Sender.Canvas.Brush.Color :=clWhite;
end;
实现单击列表标题进行排序
function CustomSortProc(Item1, Item2: TListItem; ColumnIndex: integer): integer; stdcall;
begin
if ColumnIndex = 0 then
Result := CompareText(Item1.Caption,Item2.Caption)
else
Result := CompareText(Item1.SubItems[ColumnIndex-1],Item2.SubItems[ColumnIndex-1])
end;
procedure TFrmMain.TypeLvColumnClick(Sender: TObject; Column: TListColumn);
begin
TypeLv.CustomSort(@CustomSortProc,Column.Index);
end;
判断当前单击的哪一行
GetCursorPos(p);
p := lvList.ScreenToClient(p);
CurItem := lvList.GetItemAt(p.X, p.Y);
ARect:= CurItem.DisplayRect(drBounds);
根据存入的Data找到指定的Item
curItem := lvRoomList.FindData(0, AData, True, False);
在vsReport模式下第一列插入两个图标
lvList.SmallImages,lvListStateImages分别关联一个TimageList对象,TimageList对象对象中存入所有要显示的图标,对与TlistView 的vsReport模式下的每一条记录TlistItem对象tItem,可分别通过tItem.ImageIndex和tItem.StateIndex来控制显示TimageList对象中的哪个图标,一般tItem.StateIndex显示的图标在前,tItem.ImageIndex显示的图标在后,若要判断单击事件是鼠标单击哪个图标的,可通过GetCursorPos(p);获得鼠标坐标后判断横坐标即P.X判断。