标题:VFP探讨之OLE控件(一):进度条
只看楼主
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
结帖率:100%
 问题点数:0 回复次数:7 
VFP探讨之OLE控件(一):进度条
    引言:FoxPro 9.0除了具有自身的标准控件外,还允许引入外部控件—OLE控件。OLE控件极大地丰富了FoxPro表单的应用,使得FoxPro表单可以有“声”有“色”。在表单中插入OLE控件的方法是:打开或新建表单,单击表单控件工具栏中的一个提示信息为“ActiveX控件(OleControl)”的按钮,然后回到表单上拖放出一个区域,这时,FoxPro就会弹出一个“插入对象”窗口,从中选取需要引用的控件。
    本篇就与大家分享一下进度条的使用方法。
    按上述方法弹出“插入对象”窗口后,在“控件类型”列表中选取“Microsoft ProgressBar Control … …”。注意:该控件有两种版本:5.0和6.0,对应的文件也不同,5.0对应comctl32.ocx(通常位于Windows主目录下的System32文件夹中),6.0对应mscomctl.ocx,与comctl32.ocx文件在同一文件夹中。
    进度条的主要属性。进度条的主要属性很简单,只要三个就能控制进度条,分别是:Min、Max、Value,依次表示进度条的最小值、最大值、当前值。最小值和最大值控制着进度条代表的数值区间,当前值控制着进度条色带滚动到哪个位置。其中,当前值必须要落在最小值和最大值的区间内,也即,最小值≤当前值≤最大值,否则,运行时会出错。
    进度条属性引用的特殊性。一般,引用属性的语法是:对象名.属性名,而进度条属性引用的语法是:对象名.Object.属性名。
    下面以坛友“施南人”于2014-2-19发的关于考场编排的帖子为例来探讨进度条的使用。该帖子的要求是分年级(以Njdm字段值为依据)、分学科类别(以Kldm字段值为依据)对已报名的学生(以Bmh字段值为依据)随机编排考场,每个考场不超过30人。完整代码就不写了,有兴趣的可以下载附件查看,这里只写与进度条有关的代码。
    本例使用两个进度条:一个代表各类人数的处理进度,每类人数处理完后,该进度条将重置,名称是“分类进度条”。各类人数是指某个年级中某一类学科的考生数(比如:一年级文科),每一类人数可能会有若干个考场。该进度条采用5.0版控件;另一个代表总体进度,名称是“总体进度条”,采用6.0版本控件。

第一段代码(Form1.Init事件):

WITH This
   STORE [完成率:0.0%] TO .分类完成率.Caption, .总体完成率.Caption
   .分类进度条.OBJECT.MIN=0
   .总体进度条.OBJECT.MIN=0
   .分类进度条.OBJECT.VALUE=0
   .总体进度条.OBJECT.VALUE=0
   .总体进度条.OBJECT.MAX=RECCOUNT('BMK')
   .分类进度条.OBJECT.SCROLLING=0 &&设置进度条色带完成时的形状

   WITH .闪烁控制器
      .Interval=500
      .Enabled= .F.
   ENDWITH
ENDWITH

第二段代码(Form1.开始编排.Click事件):

****************
* 开始编排考场 *
****************
FOR I=1 TO KLZS(1,1)
   ThisForm.分类进度条.OBJECT.MAX=GLRS(I,1) &&各类人数
   分类进度条最大值=ThisForm.分类进度条.OBJECT.MAX
   分类进度条当前值=0
   考场数量=INT(GLRS(I,1)/30+1)
   年级=IIF(LEFT(KCFL(I,1),1)='1','一年级',;
            IIF(LEFT(KCFL(I,1),1)='2','二年级',;
                '三年级'))
   科类=IIF(RIGHT(KCFL(I,1),2)='11','文史','理工')
   FOR J=1 TO 考场数量
      考场人数=1
      考场名称='考场'+ALLTRIM(STR(J,3))
      DO WHILE 考场人数<31
         ***************************************
         * 判断本类学生是否已经全部分配完,    *
         * 若已分配完,则换个科类。            *
         * 本段代码用于每个科类的最后一个考场。*
         ***************************************
         SELECT COUNT(BMH) FROM BMK;
            WHERE NJDM+KLDM==KCFL(I,1) AND;
                  EMPTY(ZWH);
            INTO ARRAY STUDENTS
         IF STUDENTS(1,1)=0
            EXIT &&若本类学生全部分配完就换类别
         ENDIF
         *****************************
         * 开始按考场随机分配学生    *
         * 此段为核心代码            *
         *****************************
         SELECT BMH FROM BMK;
            WHERE NJDM+KLDM==KCFL(I,1) AND;
                  EMPTY(ZWH);
            INTO ARRAY STUDENT
         座位号=IIF(考场人数<10,'0'+STR(考场人数,1),STR(考场人数,2))
         学生序号=INT(RAND()*ALEN(STUDENT,1)+1)
         UPDATE BMK SET ZWH=座位号,KCH=年级+科类+考场名称 ;
            WHERE BMH==STUDENT(学生序号,1)
         考场人数=考场人数+1
         ***********************
         * 显示进度条和完成率。*
         ***********************
         分类进度条当前值=分类进度条当前值+1
         ThisForm.分类进度条.OBJECT.VALUE=分类进度条当前值
         总体进度条当前值=总体进度条当前值+1
         ThisForm.总体进度条.OBJECT.VALUE=总体进度条当前值
         FLWCL=分类进度条当前值/分类进度条最大值 &&分类完成率
         ZTWCL=总体进度条当前值/总体进度条最大值 &&总体完成率
         ThisForm.分类完成率.Caption=年级+科类+考场名称+",本类完成率:"+;
                                     STR(FLWCL*100,5,1)+"%。"
         ThisForm.总体完成率.Caption="总体完成率:"+STR(ZTWCL*100,5,1)+"%。"
      ENDDO
   NEXT
NEXT
    设置“分类进度条当前值”、“分类进度条最大值”、“总体进度条当前值”和“总体进度条最大值”这些变量的目的是为了调试时跟踪数据的方便性,可以不用。
第二段代码是处理事件的核心部分,考虑到代码逻辑的完整性,就全部贴上。其中第一句红色代码是给分类进度条的最大值赋上每一类的人数,每一类的人数存放在数组GLRS中,该数组的行数就是大类数。编排考场的处理顺序是按大类作为外循环、当前大类的考场数作为内循环进行的。第二句红色代码的作用是每换一个大类,就将分类进度条的当前值重置为0。如果不用该变量的话,这里就要写上“ThisForm.分类进度条.OBJECT.VALUE=0”。否则,第一大类处理完,第二大类就会出错,程序运行会中断。

随机排考场.rar (9.34 KB)
进度条类库.rar (596.39 KB)


[ 本帖最后由 taifu945 于 2014-4-3 08:11 编辑 ]
收到的鲜花
  • tlliqi2014-04-02 17:20 送鲜花  30朵   附言:向你学习
  • 月沐庭轩2014-04-02 19:07 送鲜花  10朵   附言:我很赞同
搜索更多相关主题的帖子: Microsoft 提示信息 工具栏 新建 
2014-04-02 16:43
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
得分:0 
向你学习
附件缺ocx文件
2014-04-02 17:14
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
得分:0 
向你学习

坚持学习vfp,QQ:306805680
2014-04-02 19:06
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:0 
以下是引用tlliqi在2014-4-2 17:14:50的发言:

向你学习
附件缺ocx文件

啊,难道这两个文件不是附带的吗?
2014-04-02 19:09
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
方法可以学习、借用,进度条可以自己制作。
容器控件加形状控件,可以制作出完美的进度条。

[ 本帖最后由 sdta 于 2014-4-2 19:28 编辑 ]

坚守VFP最后的阵地
2014-04-02 19:27
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
得分:0 
以下是引用taifu945在2014-4-2 19:09:01的发言:

 
啊,难道这两个文件不是附带的吗?
2014-04-02 20:08
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
得分:0 
comctl32.rar (318.83 KB)
2014-04-02 20:13
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:0 
用5楼的方法比用OLE控件更方便实用,而且不会因为进度超过100%导致出错。

活到老,学到老! http://www. E-mail:hu-jj@
2014-04-02 22:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-429571-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.097530 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved