本文介紹一下ListView下如何加載數據、及使用進度條反饋當前進度給用戶。
注意:
原創作品,請尊重作者勞動成果,轉載請注明出處!!!原文永久固定地址:http://www.cnblogs.com/weii/p/4190719.html
我們先來看看效果圖: 工程Demo下載
FMX異常強大,我們可以發揮想像,自定義進度樣式,以下為本文參考代碼:
TPie 和 TRoundRect 請注意引用 FMX.Objects
procedure TForm1.Button3Click(Sender: TObject); var pe: TPie; //扇形作進度 rc: TRoundRect; //矩形作背景 lb: TLabel; //標簽顯示百分比 begin TThread.CreateAnonymousThread( procedure() var i,j: integer; t1,t2: cardinal; t3: double; begin listView1.Items.Clear; label1.Text:=''; i:=1000; try rc:=TRoundRect.Create(ListView1); //生成一個圓矩形,必須指定對象, ListView1 或 Form1 rc.Parent:=ListView1; //指定所屬,必須的 rc.Width:=100; //寬 rc.Height:=100; //高 rc.Position.X:=(ListView1.Width-rc.Width)/2; //X坐標 rc.Position.Y:=(ListView1.Height-rc.Height)/2; //Y坐標 rc.Fill.Color:=TAlphaColorRec.Black; //矩形顏色 rc.Opacity:=0.4; //透明度 rc.Stroke.Thickness:=0; //邊緣寬度 rc.Visible:=true; //可視 pe:=TPie.Create(rc); //生成一個扇形,必須指定對象,指定剛才的矩形 pe.Parent:=rc; //指定所屬,必須的 pe.Width:=100; //寬 pe.Height:=100; //高 pe.Position.X:=0; //X坐標,指定0即可 pe.Position.Y:=-100; //Y坐標,指定-100 pe.Fill.Color:=TAlphaColorRec.Black; //扇形的顏色,由於還沒有數據,所以這里設置和矩形背景一樣顏色 pe.Opacity:=0.8; //透明度 pe.StartAngle:=0; //開始角度, 沒有數據即為0度 pe.EndAngle:=360; //結束角度, 轉一圈為360度 pe.RotationAngle:=270; //轉動角度, 270度可指向12點鍾方向 pe.RotationCenter.X:=1; //中心X坐標 pe.RotationCenter.Y:=1; //中心Y坐標 pe.Stroke.Thickness:=0; //邊緣寬度 pe.Visible:=true; //可見 lb:=TLabel.Create(rc); //生成一個Label, 用於顯示百分比進度, 必須指定對象 lb.Parent:=rc; //指定所屬,必須的 lb.Width:=rc.Width; //寬度,取矩形寬度 lb.Height:=25; //高度 lb.Position.X:=0; //X坐標,由於下面設置了水平對齊,所以設0就可 lb.Position.Y:=rc.Height/2-10; //Y坐標,水平位置為矩形的一半高度,為效果顯示更順眼,減10px lb.Align:=TAlignLayout.Horizontal; //水平對齊 lb.Text:=''; lb.TextSettings.HorzAlign:=TTextAlign.Center; //文字對齊方式,居中對齊 lb.Visible:=true; //可見 t1:=TThread.GetTickCount; for j := 0 to i do begin //如果你是從數據庫或內存表里取數據的,則應該如 for j:=0 to ClientDataSet.RecordCount-1 do 這樣取 sleep(5); //停5ms,必須的,否則下面填數據時會卡菊花。這里看你CPU的強硬程度,5-20即可,手機用戶需適當設置 TThread.Synchronize(TThread.CurrentThread, procedure() begin ListView1.BeginUpdate; //開始寫入,加入此句,可稍微提升數據填充效率,非必須 with ListView1.Items.Add do begin text:='No: '+j.ToString; t2:=TThread.GetTickCount; t3:=(t2-t1)/1000; detail:=Format('耗時:%f 秒',[t3]); end; ListView1.ScrollTo(j); //滾動到本行,可馬上看到填充結果,非必須 ListView1.EndUpdate; //結束寫入,非必須 Label1.Text:=Format('[ 進度:%d / %d ]',[j,i]); end ); TThread.Synchronize(TThread.CurrentThread, procedure() begin pe.fill.Color := TAlphaColorRec.Aliceblue; //自定義進度開始,定義另一種顏色,可區別出進度,當然,如果扇形的透明度比矩形背景高的話也可不設置 pe.EndAngle:=j*360/i; //轉動角度,轉換后相當於當前進度 lb.Text:=Format('%f',[j/i*100])+'%'; //Label顯示當前進度 end ); end; finally lb.Visible:=false; //完成填充后,隱藏 pe.Visible:=false; //完成填充后,隱藏 rc.Visible:=false; //完成填充后,隱藏 lb.Free; //釋放 pe.Free; //釋放 rc.Free; //釋放 end; end).start; end;
以上只是簡單表示一下思路,各位可以發揮想像處理得更好。
謝謝關注本文。
PS:
---------------------------------------------------------------
FireMonkey移動開發可加QQ群:165232328 (本人非管理員,僅僅其中一成員,此群高手林立,期待各位Delphi愛好者共同交流)。