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