用户名:  密码:   
您当前的位置:首页 > 程序设计 >  Delphi > 

ListView控件用法

上次修改时间: 2024-08-20 16:51:41      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\Delphi语言\常用控件使用说明\      下一页

常用属性

更多详见: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;