[代码]Delphi实现在ListView中插入进度条

为了在ListView的某个单元格中插入进度条,通常有2个方法:创建进度条并设定Parent为ListView(如[1][2]),或是自绘方式(如[3]),简便起见,本文采用前者方法。

ListView内嵌进度条(简易)

创建一个缺省工程,在窗体上拖放两个控件: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内嵌进度条

注意:

本文仅是简单实现了ListView中插入进度条的效果演示,功能并不完整,如不支持列宽自动调整

如果需要列宽自动调整,可参考[1]的代码,或者干脆禁止调整进度条的列宽:)

参考:

  1. 在ListView中插入动态创建进度条,并实时调整其宽度
    http://blog.csdn.net/zyxmeng/article/details/519447
  2. 给Listview加上进度条
    http://www.samool.com/archives/322/
  3. delphi listview自绘图形
    http://www.cnblogs.com/snow001x/archive/2008/12/04/1347854.html

Technorati 标签: Delphi,ListView,ProgressBar
posted @ 2011-07-26 00:50  ET民工[源自火星]  阅读(2302)  评论(0编辑  收藏  举报