[转]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判断。

原文地址:https://www.cnblogs.com/ufindme/p/4433037.html