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

上一篇: ProgressBar In tListview subitem Delphi

下一篇: Access violation in MSVCR80D.dll error