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 编辑 ]