ProgressBar在tListview子项Delphi中
我一直在寻找如何将进度条放在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;
  遗传;  结束; 
  程序TForm1.ListView1CustomDrawItem(Sender:TCustomListView; Item:TListItem; State:TCustomDrawState; var DefaultDraw:Boolean);  var r:TRect;  pb:TProgressBar;  开始r:= Item.DisplayRect(drBounds);  如果r.Top> = Listview1.BoundsRect.Top然后AdjustProgressBar(Item,r);  结束; 
  程序TForm1.AdjustProgressBar(item:TListItem; r:TRect);  var pb:TProgressBar;  开始r.Left:= r.Left + Listview1.columns [0] .Width;  r.Right:= r.Left + Listview1.columns [1] .Width;  pb:= item.Data;  pb.BoundsRect:= r;  结束; 
  结束。 
我希望它能够使用的代码是:
...
with listview1.Items.Add do
       begin
      Caption := IntToStr(listview1.Items.Count);
         SubItems.Add('blah');
         SubItems.Add('blah');
         SubItems.Add('blah');
         {Add SubItem Progress Bar here Position 4 out of 10}
end; 
任何帮助,将不胜感激。
谢谢
-Brad
  你显示的代码并不是真的将一个进度条添加到一个子项目中。  相反,它需要一个独立的进度条并将其移至前两列的空间。  这就是你的AdjustProgressBar函数的功能。  它接收列表项的边界矩形,我认为它对应于所有列的总宽度。  然后,它将矩形的左侧移动第一列的宽度,并将矩形的右侧移动第二列的宽度。 
不管你想要什么,你都可以调整进度条的坐标。 例如,要使其覆盖第三列,请将左侧移动前两列的宽度,然后将右侧设置为左侧坐标加上第三列的宽度。
但为了达到这个目的,你仍然需要列表项目才能有一个子项目。 您只需在其上放置一个进度条,并且您已有代码来执行此操作。 您不能将对象添加为子项目; 一个子项始终是文本。 文本可以是空白的,但为了知道如何阅读列表视图的屏幕阅读器的好处,如果使用进度栏的值更新了文本,那将会很好。
我会看看OnDrawItem并自己完全重新绘制控件。
检查这个职位。
链接地址: http://www.djcxy.com/p/35081.html