为了在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

