程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
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控件會有如何精彩表現,也讓大伙一起體會一把寫程序的小小成就感吧。

\
  代碼如下:

vcmRlcmNvbG9yPQ=="#ffcc66" width="90%" align="center" bgcolor="#e3e3e3" border="1"> 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事件
  就是這樣的簡單,任何有名的軟件都是由這樣的一個個小知識點構成,只要細心體會知名軟件的優勢與長處,模仿然後改進說不定你能做出比它們都棒的軟件!

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