XE7 & FMX 那些年我們一起上過的控件:ListView 之 (3) 加載數據時如何顯示自定義樣式


本文介紹一下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愛好者共同交流)。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM