求在listview中嵌入progressbar的方法 看了部分帖子,还是没明白啥回事.动态增加progressbar然后设置Parent到listview的方法用了,只是定位一直不对,一动scrollbar就乱了.不知哪位仁兄可以提供些完整的代码看看 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 通过重新绘制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. 再来一个,演示处理多个进度条。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. 功能实现是没问题,只是效果有点问题,程序运行后,如果使用鼠标拖动改变Columns的width时画出的进度条不会即时变化。不知道是不是listview的哪些属性还要设置。 不会没人知道是啥回事吧?或者有不同于 zswang 的其它方法也行呀. http://blog.csdn.net/xzhifei/archive/2007/02/26/1515074.aspx自画TlistView带进度条的Item xzhifei 提供的资料效果很好.给分了 IDHTTP实现登录QQ网站 在线等......一个小小算的问题, 请教,有没有办法让代码在initexe的前面运行。 在delphi中如何加入更多的鼠标形状啊!!! ClientDataSet最大字段长度不能超过31位,ADO不会有此问题,请问哪位高手能帮忙解决? 问个简单的问题 来者有分!!! 大家帮忙看一下!! 关于delphi6.0或delphi7.0中MDI问题?很急!!!大虾请进----------------------- TStringGrid和TDrawGrid支持单元格内多行显示吗? 高分请教一个问题!!! fastreport4.3 frxPDFExport
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.
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.
自画TlistView带进度条的Item