到底該怎么做呢?讓我想想……好了讓我們先從TListView的ViewStyle屬性開始吧,這個屬性我們常用,把TListView做為一個表格來顯示各種數(shù)據(jù)時,我們常常把這個屬性設(shè)置成vsReport,設(shè)置之后,最左邊的列(Column)包含一個小的圖標和數(shù)據(jù),從第二列開始就是顯示一個個字段的數(shù)據(jù),這是我們最常見的TListView的樣子,每天一打開Windows的資源管理器,我們就能看到它。(如圖一)
![]() |
打開Delphi,新建一個工程,在自動生成的Form上,放置一個TListView控件,在它的Columns屬性中定義兩列,第一列放置數(shù)據(jù)項(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事件 |
上面的代碼可以實現(xiàn)這樣的功能:按下按鈕之后,一個Progressbar被建立,一個對Progressbar的引用被加進ListItem的Data屬性,最后,Progressbar被放置在由pbColumnIndex屬性指定的列中。
當想要將一個項(Item)從TListView中刪除,你必須先判斷添加進去的Progressbar的內(nèi)存占用是否已經(jīng)被釋放,如果已經(jīng)完成,就繼續(xù)。
刪除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事件中填入下面的代碼,模擬一下在一個真實的環(huán)境下,這個被我們美化過的TListView控件會有如何精彩表現(xiàn),也讓大伙一起體會一把寫程序的小小成就感吧。(如圖三)
![]() |
代碼如下:
procedure TForm1.Timer1Timer(Sender: TObject); var idx : integer; pb: TProgressbar; lv : TListView; begin lv := ListViewEx1; if lv.Items.Count = 0 then Exit; //隨機生成一個數(shù)據(jù)項 //根據(jù)生成的數(shù)據(jù)來控制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事件 |
就是這樣的簡單,任何有名的軟件都是由這樣的一個個小知識點構(gòu)成,只要細心體會知名軟件的優(yōu)勢與長處,模仿然后改進說不定你能做出比它們都棒的軟件!
開發(fā)環(huán)境: WindowsXP SP2+Delphi7