一个FOXPRO for DOS下的程序执行进度指示器

Author: 孙文硕 Date: 1997-01-01

#3  调用方式:
  DO working WITH 总次数,当前次数,提示1,提示2
#3  参数说明:
  总次数       数值型
  当前次数      数值型
  值0        指示器初始化
  值-1       清除指示器
  指示1、指示2   字符串,串长度不大于60
#3  运行环境:
  FOXPRO 2.5B for DOS
  PROC working
  PARA m.zong,m.xian,m.tish1,m.tish2
  PRIV m.bfb,m.bfb-ch,m.lie
#3  *格式化提示字符串*
  m.tish1=ALLT(m.tish1)
  m.tish1=IIF(LEN(m.tish1);>60,LEFT(m.tish1,58)+'…';m.tish1+SPAC(60-LEN;(m.tish1)))
  m.tish2=ALLT(m.tish2)
  m.tish2=IIF(LEN(m.tish2);>60,LEFT(m.tish2,58)+'…';m.tish2+SPAC(60-LEN(m.tish2)))
#3  *计算执行程度百分比(m.bfb)*
#3  *百分数(m.bfb-ch)的显示位置(m.lie)*
  m.bfb=m.xian/m.zong*100+0.2   &&0.2是百分数舍入系数
  m.bfb-ch=LTRI(STR(m.bfb,3))
  m.lie=IIF(m.bfb*0.6/2<1,1,INT(m.bfb*0.6/2))
  &&显示在动态条的中间
#3  *指示器初始化*
  IF m.xian=0 OR !WVIS('JDW')
  DEFI WIND jdw AT 10,8 SIZE 3,62 COLO SCHE 10;
  TITL 执行进度指示器
  NOFL NOGR NOZO
  ACTI WIND jdw
  @2,1 SAY SPACE(60) COLO B/W
  &&白色条
  ENDI
#3  *指示器的清除及运行*
  IF m.zong<m.xian OR m.xian<0
    ??CHR(7)
    =INKEY(2)
    RELE WIND jdw
  ELSE
    ACTI WIND jdw
    @0,1 SAY m.tish1
    @1,1 SAY m.tish2
    IF m.bfb*0.6<2
  IF INT(m.bfb*0.6)=0
    @2,1 SAY m.bfb-ch+%' COLO B/W
    @2,61 SAY '   ' &&定位光标
  ELSE
    @2,1 SAY m.bfb-ch COLO W/B
    @2,2 SAY '%'   COLO B/W   &&反象显示字符
    @2,61 SAY '   '
  ENDI
  ELSE
  @2,1 SAY SPACE(INT(m.bfb*0.6)) COLO
  W/B
  @2,m.lie SAY m.bfb-ch+'%' COLO W/B
  @2,61 SAY '   '
    ENDI
  ENDI
  RETU
#3  *调用举例*
  SET TALK OFF
  m.ss=0
  m.ee=120
  FOR m.i=m.ss TO m.ee+1
    =INKEY(1)
    DO working WITH m.ee,m.i;'指示器运行举例…',STR(m.ee,4)+STR(m.i,4)
  ENDF
  SET TALK ON
  屏幕上显示一个有三行空间的窗口,第一和第二行为提示,第三行为长60个字符的指示条。每一秒改变一次显示,每两秒蓝色指示条进一格,百分数随之改变。最后响铃提示,窗口清除。