本文介绍一下ListView下如何加载数据、及使用进度条反馈当前进度给用户。
注意:
原创作品,请尊重作者劳动成果,转载请注明出处!!!原文永久固定地址:http://www.cnblogs.com/weii/p/4190719.html
我们先来看看效果图:
FMX异常强大,我们可以发挥想像,自定义进度样式,以下为本文参考代码:
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/1000; //转动角度,转换后相当于当前进度 lb.Text:=Format(‘%f‘,[j/1000*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爱好者共同交流)。
时间: 2024-10-26 15:13:54