为了在ListView的某个单元格中插入进度条,通常有2个方法:创建进度条并设定Parent为ListView(如[1]和[2]),或是自绘方式(如[3]),简便起见,本文采用前者方法。
创建一个缺省工程,在窗体上拖放两个控件:TListView控件名为lvw1,TButton控件名为btn1。
lvw1的属性 ViewStyle = vsReport,Columns添加几列,代码如下:
unit frmTestListviewProgress; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, CommCtrl, ExtCtrls; type TForm1 = class(TForm) lvw1: TListView; btn1: TButton; procedure btn1Click(Sender: TObject); private function SetProgressInListView(lvw: TListView; Row, Col, MaxVal, CurrentPosition: Integer): Boolean; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btn1Click(Sender: TObject); begin // 行=2,列=1,最大=10,进度=3 SetProgressInListView(lvw1,2,1,10,3); end; function TForm1.SetProgressInListView(lvw: TListView; Row, Col, MaxVal, CurrentPosition: Integer): Boolean; var itm: TListItem; i, j, k: integer; pb: TProgressBar; begin Result := False; // 如果 ListView 为空,则退出 if lvw = nil then Exit; // 如果没有这一列,则退出 if lvw.Columns.Count < Col + 1 then Exit; // 如果没有这一行,则添加到有此行为止 if lvw.Items.Count < Row + 1 then for i := 0 to Row - lvw.Items.Count do begin itm := lvw.Items.Add; // 添加该行的每一列 if Col > 0 then for j := 0 to lvw.Columns.Count - 1 do itm.SubItems.Add(''); end; // 取得这一项 itm := lvw.Items[Row]; // 如果进度条为空,则创建之 if itm.Data = nil then begin pb := TProgressBar.Create(Self); pb.Parent := lvw; itm.Data := pb; end; // 取得进度条 pb := TProgressBar(itm.Data); // 进度条定位 with pb do begin Left := itm.DisplayRect(drBounds).Left; for i := 0 to Col - 1 do begin Left := Left + lvw.Columns[i].Width; end; Top := itm.DisplayRect(drBounds).Top + 1; Height := itm.DisplayRect(drBounds).Bottom - itm.DisplayRect(drBounds).Top - 2; Width := lvw.Columns[Col].Width; Max := MaxVal; // 如果当前值 > 0,则显示,否则隐藏 pb.Visible := CurrentPosition > 0; // 设定进度条 Position := CurrentPosition; end; Result := True; end; end.
核心函数是 SetProgressInListView(),设定某行某列插入一个进度条,每行一个,可以多行各有一个。
简单加几个控件和代码之后运行的效果如图:
注意:
本文仅是简单实现了ListView中插入进度条的效果演示,功能并不完整,如不支持列宽自动调整。
如果需要列宽自动调整,可参考[1]的代码,或者干脆禁止调整进度条的列宽:)
参考:
- 在ListView中插入动态创建进度条,并实时调整其宽度
http://blog.csdn.net/zyxmeng/article/details/519447 - 给Listview加上进度条
http://www.samool.com/archives/322/ - delphi listview自绘图形
http://www.cnblogs.com/snow001x/archive/2008/12/04/1347854.html