Delphi实现下载进程的动态显示

  • 来源: 天极网 作者: 若水   2008-05-05/14:06
  • 许多知名的下载软件中都有下载管理器,用一个TListView来显示下载的进程,你可以清楚的看到已经下载了多少,还有多少内容仍需下载,这样的控件,Delphi自身并未提供,但我们可以在TListView的基础之上加入进度条控件(TProgressBar)来实现这一功能,这样就能既能满足我们的实际需求,又不用“牺牲”口袋里白花花的银子,还能增加我们对控件嵌套的认识,一箭三雕,何乐而不为呢?

    到底该怎么做呢?让我想想……好了让我们先从TListView的ViewStyle属性开始吧,这个属性我们常用,把TListView做为一个表格来显示各种数据时,我们常常把这个属性设置成vsReport,设置之后,最左边的列(Column)包含一个小的图标和数据,从第二列开始就是显示一个个字段的数据,这是我们最常见的TListView的样子,每天一打开Windows的资源管理器,我们就能看到它。(如图一)


    打开Delphi,新建一个工程,在自动生成的Form上,放置一个TListView控件,在它的Columns属性中定义两列,第一列放置数据项(Item),第二列用来存放Progress.(如图二)


    在Form上加入一个按钮(Button),在按钮的Click事件中加入如下代码,用于在按下按钮时,可以在TListView的第二列显示TProgress。

    添加Item的代码如下:

    procedure TForm1.AddItemButtonClick(Sender: TObject);
    const
    pbColumnIndex = 1;
    pbMax = 100;
    var
    li : TListItem;
    lv : TListView;
    pb : TProgressBar;
    pbRect : TRect;
    begin
    lv := ListViewEx1;
    //建立一个新的ListItem
    li := lv.Items.Add;
    li.Caption := ’Item ’ + IntToStr(lv.Items.Count);

    //建立一个ProgressBar,置入TListView的第二列中
    pb := TProgressBar.Create(nil);
    pb.Parent := lv;
    li.Data := pb;
    pbRect := li.DisplayRect(drBounds);
    pbRect.Left := pbRect.Left +
    lv.Columns[-1 + pbColumnIndex].Width;
    pbRect.Right := pbRect.Left +
    lv.Columns[pbColumnIndex].Width;
    pb.BoundsRect := pbRect;
    end; //添加ItemButton事件

    上面的代码可以实现这样的功能:按下按钮之后,一个Progressbar被建立,一个对Progressbar的引用被加进ListItem的Data属性,最后,Progressbar被放置在由pbColumnIndex属性指定的列中。

    当想要将一个项(Item)从TListView中删除,你必须先判断添加进去的Progressbar的内存占用是否已经被释放,如果已经完成,就继续。

    删除Item的代码如下:

    procedure TForm1.RemoveItemButtonClick(Sender: TObject);
    var
    lv : TListView;
    li : TListItem;
    i, idx : integer;
    pb : TProgressBar;
    begin
    lv := ListViewEx1;

    li := lv.Selected;

    if li <> nil then
    begin
    idx := li.Index;
    TProgressBar(li.Data).Free;//先释放TProgressBar
    lv.Items.Delete(idx);

    //把行向上移动
    for i := idx to -1 + lv.Items.Count do
    begin
    li := lv.Items.Item[i];
    pb := TProgressBar(li.Data);
    pb.Top := pb.Top - (pb.BoundsRect.Bottom - pb.BoundsRect.Top);
    end;
    end;
    end; //删除ItemButton事件

    完成之后,我们来测试一下,我们拖一个TTimer控件,然后在它的OnTime事件中填入下面的代码,模拟一下在一个真实的环境下,这个被我们美化过的TListView控件会有如何精彩表现,也让大伙一起体会一把写程序的小小成就感吧。(如图三)


    代码如下:

    procedure TForm1.Timer1Timer(Sender: TObject);
    var
    idx : integer;
    pb: TProgressbar;
    lv : TListView;
    begin
    lv := ListViewEx1;

    if lv.Items.Count = 0 then Exit;

    //随机生成一个数据项
    //根据生成的数据来控制TProgressBar的长度
    idx := Random(lv.Items.Count);
    pb := TProgressBar(lv.Items[idx].Data);
    if pb.Position < pb.Max then
    pb.StepIt
    else
    pb.Position := 0;
    end;//Timer事件

    就是这样的简单,任何有名的软件都是由这样的一个个小知识点构成,只要细心体会知名软件的优势与长处,模仿然后改进说不定你能做出比它们都棒的软件!#p#分页标题#e#

    开发环境: WindowsXP SP2+Delphi7

     


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多