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