DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: loveucrazy
今日帖子: 8
在线用户: 23
导航: 论坛 -> 文档资料 斑竹:liumazi,ruralboy  
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2013/11/5 21:59:06
标题:
叉五人性缺乏,码农苦转菊花 浏览:4421
加入我的收藏
楼主: 1、概述
    移动开发时碰上耗时的操作,将操作界面暂时屏蔽、且在上方再覆盖一层提示信息,是常见的做法,比如,Loading...Waiting...之类,“转菊花”,也是常用的方法之一。 实现此功能的关键技术点如下:

1)、使用控件Opacity属性控制透明度,实现被屏蔽常规界面的遮蔽效果
2)、使用控件的Enabled属性控制是否允许操作被遮蔽的常规界面
3)、使用TAniIndicator控件显示动画(转菊花)
4)、使用TRectangle控件显示背景图、文字
5)、耗时任务开始时控制开始转菊花、任务结束时控制结束转菊花
6)、由于FireMonkey的动画在主线程阻塞时动画会停顿,故需要作一点任务起始前和任务结束时的少量延时,让人能感觉到动画;如能将耗时任务放线程里实现,那是最佳,但异步编程却不是每个人所喜欢的...所以...这个菊花转得有些苦...


2、看关键代码
//
// 设置是否被覆盖...
procedure TMainForm.SetControls(Covered: boolean);
begin
//
// 若被覆盖,背景控件半透明、不允许获得焦点...
   if Covered then
      begin
         panel1.Opacity:=0.60;
         panel1.Enabled:=false;
         TabControl1.Opacity:=0.60;
         TabControl1.Enabled:=false;
      end
//
// 还原成正常状态...
   else
      begin
         panel1.Opacity:=1;
         panel1.Enabled:=true;
         TabControl1.Opacity:=1;
         TabControl1.Enabled:=true;
      end;
end;

//
// 显示或隐藏Indicator...
Procedure TMainForm.SetIndicator(Shown: boolean);
   procedure SafeDelay(Ms: integer);
   var
      t0: TDateTime;
   begin
      t0:=now;
      application.processmessages;
      while round((now-t0)*24*60*60*1000)<ms do
         application.processmessages;
   end;
Begin
//
// 显示Indicator...
    if Shown then
       begin
          IndicatorBack.Position.X:=(self.Width-IndicatorBack.Width)/2;
          IndicatorBack.Position.Y:=(self.Height-IndicatorBack.Height)/2;
          IndicatorBack.visible:=true;
          Animator.Enabled := True;
          Animator.Visible := True;
          application.ProcessMessages;
          safedelay(100);
       end
//
// 隐藏...
    else
       begin
          application.ProcessMessages;
          safedelay(100);
          Animator.Enabled := False;
          Animator.Visible := False;
          IndicatorBack.visible:=false;
       end;
    application.ProcessMessages;
end;
//
// 显示忙...
procedure TMainForm.ShowBusy;
begin
   SetControls(true);
   SetIndicator(true);
end;

//
// 隐藏忙...
procedure TMainForm.CloseBusy;
begin
   SetControls(false);
   SetIndicator(false);
end;


3、耗时任务示例代码:
//
// 读远程服务器,显示数据列表...
procedure TMainForm.ShowList1;
var
   AllRecords,i: integer;
   yyyymm: string;
   ok: boolean;
begin
//
// 显示忙...
   ShowBusy;
//
// 读页面数据...
   if cds1.Active then
      cds1.Close;
   if combobox1.Selected.Text='当前' then
      ok:=FetchDataPage(mba,'SELECT * FROM CENTERQUOTA ORDER BY FUNCID,BUDID,ECONID',CurrentPage1,RowsPerPage,AllRecords,Cds1)
   else
      begin
         yyyymm:=formatdatetime('yyyy',now)+combobox1.Selected.Text;
         ok:=FetchDataPage(mba,'SELECT * FROM CENTERQUOTATOTAL WHERE YYYYMM='''+yyyymm+''' ORDER BY FUNCID,BUDID,ECONID',CurrentPage1,RowsPerPage,AllRecords,Cds1);
      end;
   if not ok then
      begin
         CloseBusy;
         showmessage('读取数据库页面出现错误:'+mba.LastError);
         exit;
      end;
//
// 显示页数...
   allpages1:=round(AllRecords div RowsPerPage);
   if AllPages1*RowsPerPage<AllRecords then
      inc(AllPages1);
   AllEdit1.Text:=inttostr(AllPages1);
   CurrentEdit1.Text:=inttostr(CurrentPage1);
//
// 显示页面...
   Cds1.First;
   Grid1.RowCount:=Cds1.RecordCount;
   for i:= 0 to Cds1.RecordCount-1 do
       begin
         Grid1.Cells[0,i]:=trim(Cds1.fieldbyname('FuncName').asstring);
         Grid1.Cells[1,i]:=trim(Cds1.fieldbyname('BudName').asstring);
         Grid1.Cells[2,i]:=formatfloat('###,##0.00',cds1.fieldbyname('YearFirst').asfloat);
         Grid1.Cells[3,i]:=formatfloat('###,##0.00',cds1.fieldbyname('YearRest').asfloat);
         Cds1.Next;
      end;
//
// 不忙...
   CloseBusy;
end;


4、看效果
此帖子包含附件:
JPEG 图像
大小:167.6K
----------------------------------------------
樵夫的大马甲
作者:
男 bpearl (bpearl) ▲▲▲▲▲ -
普通会员
2013/11/5 22:45:13
1楼: 樵夫发帖,一律先顶再看!YEAH!!
----------------------------------------------
丢了编码快10年,现在重新捡起来!
作者:
男 chinahth (淡若浮云) ★☆☆☆☆ -
盒子活跃会员
2013/11/6 8:06:39
2楼: 得顶
----------------------------------------------
-
作者:
男 zhuzh_yuy (华) ★☆☆☆☆ -
普通会员
2013/11/6 8:36:03
3楼: 崇拜
----------------------------------------------
-
作者:
男 mprjcf (mprjcf) ★☆☆☆☆ -
普通会员
2013/11/6 9:32:17
4楼: 厉害,佩服!
----------------------------------------------
他们总是取笑失败者,以酷似智者;他们也总是为成功者喝采,以取得赏金。
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2013/11/6 13:18:21
5楼: safedelay 才能体现楼主的经验丰富。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 fky1989 (fky1989) ▲▲▲▲▲ -
普通会员
2013/11/6 14:18:29
6楼: 牛X呀LZ,多会出书?
----------------------------------------------
-
作者:
男 shileizi (sl) ★☆☆☆☆ -
普通会员
2013/11/6 14:42:04
7楼: mark
----------------------------------------------
-
作者:
男 myhhsbak (myhhsbak) ★☆☆☆☆ -
普通会员
2013/11/6 17:45:55
8楼: DELPHI的MIS从桌面做到手机,烦不烦。
----------------------------------------------
-
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2013/11/6 18:14:27
9楼: 呵呵,主次要分明哦,程序员烦一点有啥关系呢?
对程序员来说,能赚钱的就行了。

手机程序的使用者不是程序员,他们才不管什么style呢,好用、能解决问题就好
----------------------------------------------
樵夫的大马甲
作者:
男 nihaongy (nihao) ★☆☆☆☆ -
普通会员
2013/11/6 20:16:04
10楼: 我看到叉五,进来的,呵,*五,这次火了,。。
----------------------------------------------
-相互学习,共同进步! 努力每一天,不能望山跑死马
发上等愿,结中等缘,享下等福;择高处立,寻平处住,向宽处行
作者:
男 bear28 ( ) ★☆☆☆☆ -
盒子活跃会员
2013/11/6 22:50:55
11楼: 请问
 Animator.Enabled := True;
 Animator.Visible := True;
Animator是哪一个组件?
----------------------------------------------
-
作者:
男 tintin1943 (零输好) ★☆☆☆☆ -
盒子活跃会员
2013/11/6 23:20:48
12楼: 我也以为在说星五,,,,有点失望,,,但还是赞樵夫!
----------------------------------------------
不喧哗 自有声 心静 思远 志行千里
作者:
男 windowsfxg (扬帆远行) ★☆☆☆☆ -
普通会员
2013/11/7 8:50:33
13楼: 樵夫标题起的好,以为是X5,哈哈,把楼上大牛都骗了
----------------------------------------------
扬帆远行
作者:
男 zfh_zfh (zfh_zfh) ★☆☆☆☆ -
普通会员
2013/11/7 13:30:16
14楼: 标题起得好,技术也好
----------------------------------------------
-
作者:
男 snakejiao (GuoQingaa) ★☆☆☆☆ -
盒子活跃会员
2013/11/8 13:35:54
15楼: 星五 躺Q了
----------------------------------------------
-
作者:
男 bear28 ( ) ★☆☆☆☆ -
盒子活跃会员
2013/11/9 2:17:37
16楼: 请问上述程序代码的TAniIndicator会一开始就转到结束消失吗?
测试的结果是一开始出现TAniIndicator是静止的,快要结束时才转一会,是正常的吗?
谢谢
----------------------------------------------
-
作者:
男 ghostking (ghostking) ★☆☆☆☆ -
盒子活跃会员
2013/11/9 8:03:07
17楼: 樵夫标题起的好
----------------------------------------------
-
作者:
女 blbz (冰力不足) ★☆☆☆☆ -
禁用账号
2014/2/21 12:54:31
18楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
SPAM
作者:
男 bsense (财神) ★☆☆☆☆ -
普通会员
2014/2/21 13:16:35
19楼: 好标题哦,*五的菊花捏?
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行320.3125毫秒 RSS