程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi實現下載進程的動態顯示

Delphi實現下載進程的動態顯示

編輯:Delphi

許多知名的下載軟件中都有下載管理器,用一個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事件

就是這樣的簡單,任何有名的軟件都是由這樣的一個個小知識點構成,只要細心體會知名軟件的優勢與長處,模仿然後改進說不定你能做出比它們都棒的軟件!

開發環境: WindowsXP SP2+Delphi7

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved