ProgressBar在tListview子项Delphi中

时间:2010-01-15 03:49:56

标签: delphi listview progress-bar tlistview

我一直在研究如何将一个ProgressBar放在delphi中的tListview中,我有一些有用的代码......但是我想把它添加到一个子项目中......并且无法解决它...

 

DFM Source Begin

object Form1: TForm1 Left = 221 Top = 113 Caption = 'Form1' ClientHeight = 203 ClientWidth = 482 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate DesignSize = ( 482 203) PixelsPerInch = 96 TextHeight = 13 object ListView1: TListView Left = 16 Top = 16 Width = 449 Height = 177 Anchors = [akLeft, akTop, akRight, akBottom] Columns = <> FullDrag = True TabOrder = 0 OnCustomDrawItem = ListView1CustomDrawItem end end


END DFM Source

unit Unit1;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, CommCtrl;

type TForm1 = class(TForm) ListView1: TListView; procedure FormCreate(Sender: TObject); procedure ListView1CustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); private { Private declarations } procedure WMNotify(var Message: TWMNotify); message WM_NOTIFY; procedure AdjustProgressBar(item: TListItem; r: TRect); public { Public declarations } end;

var Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject); var i: Byte; r: TRect; pb: TProgressBar; begin Listview1.Columns.Add.Width := 100; Listview1.Columns.Add.Width := 200; Listview1.ViewStyle := vsReport;

Randomize; for i:=0 to 40 do begin Listview1.Items.Add.Caption := 'Texte ' + IntToStr(i); r := Listview1.Items[i].DisplayRect(drBounds); pb := TProgressBar.Create(Self); pb.Parent := Listview1; pb.Position := Random(pb.Max); Listview1.Items[i].Data := pb; AdjustProgressBar(Listview1.Items[i], r); end;end;

procedure TForm1.WMNotify(var Message: TWMNotify); var i: Integer; r: TRect; begin

case Message.NMHdr.code of HDN_ITEMCHANGED, HDN_ITEMCHANGING: begin for i:=0 to Listview1.Items.Count-1 do begin r := Listview1.Items[i].DisplayRect(drBounds); AdjustProgressBar(Listview1.Items[i], r); end;

    ListView1.Repaint;
  end;end;

inherited; end;

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); var r: TRect; pb: TProgressBar; begin r := Item.DisplayRect(drBounds); if r.Top>=Listview1.BoundsRect.Top then AdjustProgressBar(Item, r); end;

procedure TForm1.AdjustProgressBar(item: TListItem; r: TRect); var pb: TProgressBar; begin r.Left := r.Left + Listview1.columns[0].Width; r.Right := r.Left + Listview1.columns[1].Width; pb := item.Data; pb.BoundsRect := r; end;

end.

我希望它与之合作的代码是:

    ListView1.Repaint;
  end;end;

任何帮助将不胜感激。

由于

-Brad

2 个答案:

答案 0 :(得分:4)

您展示的代码并没有真正为“子项目”添加进度条。相反,它需要一个独立的进度条,移动它以覆盖前两列的空间。这就是你的AdjustProgressBar函数所做的事情。它接收列表项的边界矩形,我认为它对应于所有列的总宽度。然后,它将矩形的左侧移动第一列的宽度,并将矩形的右侧移动第二列的宽度。

您可以根据需要调整进度条的坐标。例如,要使其覆盖第三列,请将左侧移动前两列的宽度,然后将右侧设置为左侧坐标加上第三列的宽度。

但是为了工作,您仍然需要列表项具有子项。你只是在它上面放了一个进度条,你已经有了代码来做到这一点。您不能将对象添加为子项;子项总是文本。文本可以是空白的,但为了屏幕阅读器知道如何阅读列表视图的好处,如果您使用进度条的值更新文本将会很好。

答案 1 :(得分:2)

我会看看OnDrawItem并自己重新绘制控件。

检查this post