看了部分帖子,还是没明白啥回事.动态增加progressbar然后设置Parent到listview的方法用了,只是定位一直不对,一动scrollbar就乱了.不知哪位仁兄可以提供些完整的代码看看

解决方案 »

  1.   

    通过重新绘制ListView来实现,参考如下代码:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        ListView1: TListView;
        Timer1: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure ListView1CustomDrawSubItem(Sender: TCustomListView;
          Item: TListItem; SubItem: Integer; State: TCustomDrawState;
          var DefaultDraw: Boolean);
        procedure Timer1Timer(Sender: TObject);
      private
        { Private declarations }
        FProgress: TListItem;
        FPostion: Integer;
        FLength: Integer;
        FProgressRect: TRect;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      FProgress := ListView1.Items.Add;
      FProgress.Caption := 'temp.txt';
      FPostion := 0;
      FLength := 100;
      Timer1.Interval := 100;
    end;procedure DrawProgress(ACanvas: TCanvas; ARect: TRect;
      APostion, ALength: Integer); // 想绘制得漂亮些就在这里修改。
    begin
      ACanvas.Brush.Color := clWindow;
      ACanvas.FillRect(ARect);  ACanvas.Brush.Color := clHighlight;
      ACanvas.FillRect(Rect(ARect.Left, ARect.Top + 2,
        ARect.Left + Trunc((ARect.Right - ARect.Left) * (APostion / ALength)),
        ARect.Bottom - 4));
    end;procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
      var DefaultDraw: Boolean);
    begin
      if FProgress <> Item then Exit;
      if Item.Index <> 0 then Exit;  ///////Begin 计算进度条绘制的区域
      FProgressRect := Item.DisplayRect(drBounds);
      FProgressRect.Left := Sender.Column[0].Width;
      FProgressRect.Right := Sender.Column[1].Width + FProgressRect.Left;
      ///////End 计算进度条绘制的区域  DrawProgress(Sender.Canvas, FProgressRect, FPostion, FLength);
      DefaultDraw := False;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      FPostion := (FPostion + 1) mod FLength;
      DrawProgress(ListView1.Canvas, FProgressRect, FPostion, FLength);
    end;end.
      

  2.   

    再来一个,演示处理多个进度条。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        ListView1: TListView;
        Timer1: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure ListView1CustomDrawSubItem(Sender: TCustomListView;
          Item: TListItem; SubItem: Integer; State: TCustomDrawState;
          var DefaultDraw: Boolean);
        procedure Timer1Timer(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        FProgress: array[0..12] of TListItem;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}type
      TProgressInfo = record
        FPostion: Integer;
        FLength: Integer;
      end;
      PProgressInfo = ^TProgressInfo;procedure TForm1.FormCreate(Sender: TObject);
    var
      I: Integer;
      vProgressInfo: PProgressInfo;
    begin
      for I := Low(FProgress) to High(FProgress) do
      begin
        FProgress[I] := ListView1.Items.Add;
        FProgress[I].Caption := Format('temp%d.txt', [I]);
        New(vProgressInfo);
        FProgress[I].Data := vProgressInfo;
        vProgressInfo^.FPostion := Random(100);
        vProgressInfo^.FLength := 100;
      end;
      Timer1.Interval := 100;
    end;procedure DrawProgress(ACanvas: TCanvas; ARect: TRect;
      APostion, ALength: Integer);
    begin
      ACanvas.Brush.Color := clWindow;
      ACanvas.FillRect(ARect);  ACanvas.Brush.Color := clHighlight;
      ACanvas.FillRect(Rect(ARect.Left, ARect.Top + 2,
        ARect.Left + Trunc((ARect.Right - ARect.Left) * (APostion / ALength)),
        ARect.Bottom - 4));
    end;procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
      var DefaultDraw: Boolean);
    var
      vProgressInfo: PProgressInfo;
      vRect: TRect;
    begin
      vProgressInfo := Item.Data;
      if not Assigned(vProgressInfo) then Exit;  ///////Begin 计算进度条绘制的区域
      vRect := Item.DisplayRect(drBounds);
      vRect.Left := Sender.Column[0].Width;
      vRect.Right := Sender.Column[1].Width + vRect.Left;
      ///////End 计算进度条绘制的区域  DrawProgress(Sender.Canvas, vRect,
        vProgressInfo^.FPostion, vProgressInfo^.FLength);
      DefaultDraw := False;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    var
      I: Integer;
      vProgressInfo: PProgressInfo;
      vRect: TRect;
    begin
      for I := Low(FProgress) to High(FProgress) do
      begin
        vRect := FProgress[I].DisplayRect(drBounds);    //超出绘制区域
        if vRect.Bottom < 0 then Continue;
        if vRect.Top > ListView1.ClientHeight then Continue;    ///////Begin 计算进度条绘制的区域
        vRect := FProgress[I].DisplayRect(drBounds);
        vRect.Left := ListView1.Column[0].Width;
        vRect.Right := ListView1.Column[1].Width + vRect.Left;
        ///////End 计算进度条绘制的区域    vProgressInfo := FProgress[I].Data;
        vProgressInfo^.FPostion :=
          (vProgressInfo^.FPostion + 1) mod vProgressInfo^.FLength;
        DrawProgress(ListView1.Canvas, vRect,
          vProgressInfo^.FPostion, vProgressInfo^.FLength);
      end;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    var
      I: Integer;
      vProgressInfo: PProgressInfo;
    begin
      for I := Low(FProgress) to High(FProgress) do
      begin
        vProgressInfo := FProgress[I].Data;
        Dispose(vProgressInfo);
      end;
    end;end.
      

  3.   

    功能实现是没问题,只是效果有点问题,程序运行后,如果使用鼠标拖动改变Columns的width时画出的进度条不会即时变化。不知道是不是listview的哪些属性还要设置。
      

  4.   

    不会没人知道是啥回事吧?或者有不同于 zswang 的其它方法也行呀.
      

  5.   

    http://blog.csdn.net/xzhifei/archive/2007/02/26/1515074.aspx
    自画TlistView带进度条的Item 
      

  6.   

    xzhifei 提供的资料效果很好.给分了