

常用属性
更多详见:https://www.2ccc.com/news/Html/?1327.html
更多用法见listview使用示例,
//常用属性,以下属性也可以用代码实现
ViewStyle 设为vsReport //以表格的方式显示, 也可用代码ListView1.ViewStyle := vsReport;
ReadOnly 设为true //只读
GridLInes 设为true //显示表格线
RowSelect 设为True //鼠标点击时自动选择一行,否则显示为标题单元格选中
ListView1.HideSelection:= True; //失去焦点时,选中行不高亮
========================================================================================
添加列标题,设置列宽度
//设置表格列标题
ListView1.Columns.Add.Caption := 'Name';
ListView1.Columns.Add.Caption := 'Size';
ListView1.Columns.Add.Caption := 'Date';
//设置每列的宽度
ListView1.Column[0].Width:=200;
ListView1.Column[1].Width:=100;
ListView1.Column[2].Width:=200;
====================================================================================
//获取总行数,列数,选择的行号,某行某列所有值
ListView1.Items.count //获取总行数
ListView1.Items[1].SubItems.Count //获取指定行总列数
//获取选择行号
for i := 0 to ListView1.Items.Count - 1 do
if ListView1.Items[i].Selected then Memo1.Lines.Add('选择的行号是:' + inttostr(i));
//获取某列的所有值
for i:=0 to ListView1.items.Count-1 do
begin
Memo1.Lines.add(ListView1.Items[i].SubItems[0]);
end;
//获取某行所有值
Memo1.Lines.Add(ListView1.Items[1].Caption); //每行第一列是标题列要单独获取,
for i:=0 to ListView1.Items[1].SubItems.Count-1 do //再循环获取该标题列下所有子项
begin
Memo1.Lines.Add(ListView1.Items[1].SubItems[i]);
end;
//上下移选择的行
ListView1.SetFocus;
ListView1.Items.Item[i - 1].Selected := True;
ListView1.Items.Item[i + 1].Selected := True;
=========================================================================================
添加,编辑,删除,保存,清空数据
//添加内容
procedure TForm1.Button2Click(Sender: TObject);
var
Item: TListItem;
begin
Item := ListView1.Items.Add;
Item.Caption := 'File1.txt';
Item.SubItems.Add('1 KB');
Item.SubItems.Add(DateTimeToStr(Now));
end;
//编辑
procedure TForm1.Button8Click(Sender: TObject);
var
SelectedItem:TListItem;
begin
SelectedItem := ListView1.Selected;
if SelectedItem <> nil then
begin
Edit1.Text := SelectedItem.Caption;
DateTimePicker1.Time := StrToTime(SelectedItem.SubItems[0]);
Edit3.Text := SelectedItem.SubItems[1];
Edit4.Text := SelectedItem.SubItems[2];
end;
end;
//保存编辑或添加新项
procedure TForm1.Button9Click(Sender: TObject);
var
SelectedItem: TListItem;
begin
SelectedItem := ListView1.Selected; // 获取当前选中的行
if SelectedItem <> nil then
begin
// 更新选中行的数据
SelectedItem.Caption := Trim(Edit1.Text);
if SelectedItem.SubItems.Count > 0 then
begin
SelectedItem.SubItems[0] := (TimeToStr(DateTimePicker1.Time));
SelectedItem.SubItems[1] := (Trim(Edit3.Text));
SelectedItem.SubItems[2] := (Trim(Edit4.Text));
end
else
begin
SelectedItem.SubItems.Add(TimeToStr(DateTimePicker1.Time));
SelectedItem.SubItems.Add(Trim(Edit3.Text));
SelectedItem.SubItems.Add(Trim(Edit4.Text));
end;
end
else
begin
ShowMessage('No item selected');
end;
end;
//删除
ListView1.DeleteSelected; //删除选择的行
ListView1.Items.Delete(0); //删除指定行
ListView_DeleteColumn(ListView1.Handle, 2);//删除指定列,2是要删除的列的序号,从0开始 , 不是实际删除,只是不显示 ,要先引用CommCtrol单元
ListView1.Items.Clear; //清空数据
=====================================================================================
保存到文件,从文件读取
//将ListView控件内容保存到ini文件
procedure SaveListViewToFile(ListView: TListView; const FileName: string);
var
IniFile: TIniFile;
i, j: Integer;
SectionName: string;
begin
IniFile := TIniFile.Create(FileName);
try
for i := 0 to ListView.Items.Count - 1 do
begin
SectionName := 'Item' + IntToStr(i);
IniFile.WriteString(SectionName, 'Text', ListView.Items[i].Caption);
// 保存子项
for j := 0 to ListView.Items[i].SubItems.Count - 1 do
begin
IniFile.WriteString(SectionName, 'SubItem' + IntToStr(j), ListView.Items[i].SubItems[j]);
end;
end;
finally
IniFile.Free;
end;
end;
//程序关闭时调用SaveListViewToFile过程保存到ini文件
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
str:string;
begin
str:=ExtractFilePath(Application.ExeName) + 'ListViewData.ini';
if FileExists(str) then DeleteFile(str);
SaveListViewToFile(ListView1, ExtractFilePath(Application.ExeName) + 'ListViewData.ini'); // 然后继续保存新数据
end;
//从ini文件加裁到listview文件
procedure LoadListViewFromFile(ListView: TListView; const FileName: string);
var
IniFile: TIniFile;
i, j: Integer;
SectionName: string;
ItemText: string;
SubItemText: string;
begin
IniFile := TIniFile.Create(FileName);
try
i := 0;
while IniFile.SectionExists('Item' + IntToStr(i)) do
begin
SectionName := 'Item' + IntToStr(i);
ItemText := IniFile.ReadString(SectionName, 'Text', '');
with ListView.Items.Add do
begin
Caption := ItemText;
// 加载子项
j := 0;
while IniFile.ValueExists(SectionName, 'SubItem' + IntToStr(j)) do
begin
SubItemText := IniFile.ReadString(SectionName, 'SubItem' + IntToStr(j), '');
SubItems.Add(SubItemText);
Inc(j);
end;
end;
Inc(i);
end;
finally
IniFile.Free;
end;
end;
//程序运行时从ini文件加载listview中
procedure TForm1.FormCreate(Sender: TObject);
begin
ListView1.ViewStyle := vsReport;
ListView1.Columns.Add.Caption := 'Name';
ListView1.Columns.Add.Caption := 'Size';
ListView1.Columns.Add.Caption := 'Date';
ListView1.Column[0].Width:=200;
ListView1.Column[1].Width:=100;
ListView1.Column[2].Width:=200;
LoadListViewFromFile(ListView1, ExtractFilePath(Application.ExeName) + 'ListViewData.ini');
end;
//选择行上移,下移
procedure TForm1.Button10Click(Sender: TObject);
//这是个通用的过程,用于调用该过程上移或下移当前行
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;
begin
ListViewItemMoveUpDown(ListView1, ListView1.Selected, True, True);//上移
ListViewItemMoveUpDown(ListView1, ListView1.Selected, False, True);//下移当前行
end;
============================================================================================
点击列标题,正排序或倒排序,分别在列的ColumnClick与Compare事件下加入如下代码
//设置排序功能的
procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn);
begin
SortCol := Column.Index;
if (SortWay = 1) then SortWay := -1 else SortWay := 1;
(Sender as TCustomListView).AlphaSort;
end;
//设置排序功能的
procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
var
t: Integer;
begin
if (SortCol = 0) then
begin
Compare := SortWay * CompareText(Item1.Caption, Item2.Caption);
end else
begin
t := SortCol - 1;
Compare := SortWay * CompareText(Item1.SubItems[t], Item2.SubItems[t]);
end;
end;
=============高级功能=====================================================================
//循环获取系统指定路径下的文件或目录显示到指定Listview
procedure ListFilesInFolder(const AFolder: string; AListView: TListView);
var
SR: TSearchRec;
ListViewItem: TListItem;
begin
AListView.Items.Clear;
if FindFirst(IncludeTrailingPathDelimiter(AFolder) + '*.*', faAnyFile, SR) = 0 then
begin
repeat
if (SR.Name <> '.') and (SR.Name <> '..') then
begin
ListViewItem := AListView.Items.Add;
ListViewItem.Caption := SR.Name;
ListViewItem.SubItems.Add(Format('%d KB', [SR.Size div 1024]));
ListViewItem.SubItems.Add(DateTimeToStr(FileDateToDateTime(SR.Time)));
// You can add more file details to display
end;
until FindNext(SR) <> 0;
FindClose(SR);
end;
end;
调用: ListFilesInFolder('C:\', ListView1); //需要先添加列标题,设置列宽
//显示数据库里的内容,未测试
procedure viewchange(listv:tlistview;table:tcustomadodataset;var i:integer);
begin
tlistview(listv).Items.BeginUpdate; {listv:listview名}
try
tlistview(listv).Items.Clear;
with table do {table or query名}
begin
active:=true;
first;
while not eof do
begin
listitem:=tlistview(listv).Items.add;
listitem.Caption:=trim(table.fields[i].asstring);
// listitem.ImageIndex:=8;
next;
end;
end;
finally
tlistview(listv).Items.EndUpdate;
end;
end;