[转]Delphi 常用控件之TlistView总结
Delphi 常用控件之TlistView总结
要用到的(大部分是TListView的ViewStyle属性设为vsReport下的):
TListView 组件的常用属性
(3)Column 属性
此属性可以访问列表视图中每一栏,Index 指定栏的序号。此属性仅当ViewStyle 属性设为vsReport时有效。
(4)ColumnClick 属性
如果此属性设为True,栏的表头(如果有的话)将同时作为按钮用,按下这些按钮,将触发OnColumnClick 事件,通常用于对列表视图中的项进行重新排序。
(10)RowSelect 属性
在ViewStyle 属性设为vsReport 的前提下,如果把此属性设为True,用户可以一次选择一整行。
(11)Selected 属性
此属性用于设置返回列表视图中被选择的项。如果有多项被选择,返回的是当前有输入焦点的项。
(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 参数可以对用户选中的栏进行访问及设置。
(5)OnSelectItem 事件
当列表视图中一个项被选择时,将触发这个事件。OnSelectItem 事件中有一个TListItem 类型的参数Item,利用此参数可以对用户编辑的项进行访问;OnSelectItem 事件中还有一个Boolean 类型的参数Selected。每次选择一个新项时将两次触发此事件,一次是释放以前被选择的项,Selected 参数取值为False,代表释放Item 参数指定的项;另外一次是选择新的项,Selected 参数取值为True,代表选择Item 参数指定的项。
TListView 组件常用的方法
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判断。