[代码]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 标签: , ,

你可能感兴趣的:(ListView)