注册 登录
编程论坛 VFP论坛

动手做一个公用进度条类,并让它可以随时中止操作

倦猫1973 发布于 2023-04-12 11:59, 622 次点击
先看效果,在一个长耗时的操作中按下 ESC 是可以中止操作的。
只有本站会员才能查看附件,请 登录




其实办法实现很简单的啦,进度条类随你喜欢怎么做都行,大概前端程序也就这样子了,基本通用。
甚至加不加 loProgress.IsCancel 也是无所谓的,If loProgress.Step() = .F. Exit 也是可以的。

程序代码:

Local loProgress As frm_progress1 Of CAT_forms.vcx
Local lcOutPath As String
lcOutPath = "D:\OutPut\"

*-- 创建一个单进度对象
loProgress = NewObject("frm_progress1", "CAT_forms.vcx")     
*-- 设置进度条 Titile, Min, Max
loProgress.Caption = "正在导出 PDF 文件,请稍候..."
loProgress.Inits(1, RecCount("pdftmp"))
Select pdftmp
Scan
    lnBill_Id = Bill_Id

    *-- 在此方法中刷新进度条进度,且增加一个 DoEvents,由于 DoEvents 很耗时,可以根据 Max 的大小选择每几行触发一次 DoDevents
    loProgress.Step()
    ThisForm.grfStore2.grfExportFilename = Addbs(m.lcOutPath) + Alltrim(Bill_RefNo) + "_" + Alltrim(Bill_Kh) + "_" + Alltrim(Bill_Ys)
    Select * from pdftmp Where Bill_Id = m.lnBill_Id Into Cursor Bill
    Select * from pdftmp1 Where Bill_Id = m.lnBill_Id Into Cursor Bill1 Order By Sub_Order
    ThisForm.grfStore2.OnPrint("PrintToPdf")

    *-- 是否中断导出
    If loProgress.IsCancel
        Exit
    EndIf
EndScan

If 6 = Sy_MsgBox("文件己成功导出,是否打开文件夹查看导出结果?", 4+32+256, ThisForm)
    ShellExecute(0, "Open", JustPath(m.lcOutPath), "", "", 1)
EndIf

15 回复
#2
sdta2023-04-12 12:34
向楼主学习
#3
chenjf2023-04-12 12:58
学习!
#4
schtg2023-04-12 16:39
楼主威武,谢谢!
#5
sostemp2023-04-12 17:09
楼主的这界面很好看,很简洁,搭配合理,大气。
#6
倦猫19732023-04-12 17:33
双进度条我个人推荐如下,简洁明了。
超过双度条的,还是不要搞了吧,实际体验还不如把双进度条任一搞成跑马灯。

只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2023-4-12 17:37编辑过]

#7
sam_jiang2023-04-12 20:30
曾兄,这foxpro玩得是出神入化了。。。
#8
iswith2023-04-13 09:14
是有这样的设计按“Esc”不过它不会马上响应,在长耗时它需要按下一段时间才响应,很早就有啦。。。。。
#9
倦猫19732023-04-13 13:05
以下是引用iswith在2023-4-13 09:14:23的发言:

是有这样的设计按“Esc”不过它不会马上响应,在长耗时它需要按下一段时间才响应,很早就有啦。。。。。



我是不是需要说,用鼠标点击【取消(ESC)】按钮也可以中止呢?你不会是以为,我在进度表单上放这么一个按钮,纯是为了好看?

[此贴子已经被作者于2023-4-13 13:31编辑过]

#10
倦猫19732023-04-13 13:07
不能被中止的任务,就这么搞。

*-- 创建一个单进度对象
loProgress = NewObject("frm_progress1", "CAT_forms.vcx")     
loProgress.Caption = "正在导出 PDF 文件,请稍候..."
loProgress.Inits(1, RecCount("pdftmp"))
loProgress.btnCancel.Enabled = .F.
#11
iswith2023-04-13 14:40
以下是引用倦猫1973在2023-4-13 13:05:35的发言:




我是不是需要说,用鼠标点击【取消(ESC)】按钮也可以中止呢?你不会是以为,我在进度表单上放这么一个按钮,纯是为了好看?

不是,你把Doevents 后面 Force加 上会更好。。。。
#12
倦猫19732023-04-13 15:16
加不加,那也是规划方面的事情了。先期默认为了效率不加,后面想了想不高兴加了个 loProgress.IsForce 这这这。。。。。
#13
hu9jj2023-04-14 07:57
非常不错的功能,赞!
#14
aqyejun2023-04-14 11:24
学习了
#15
linxb95762023-04-22 11:05
回复 楼主 倦猫1973
学习!
#16
东海ECS2023-04-22 11:57
首先,需要创建一个窗体(例如frm_progress1.vcx),并在其中添加一个进度条控件(例如progressbar1),以及一个按钮(例如btnCancel)用于中止操作。在窗体的代码中添加以下内容:

声明变量 PRIVATE lnMin, lnMax, lnPos PRIVATE lcCaption, lcMessage PRIVATE llCancelFlag

初始化方法 PROCEDURE Inits LPARAMETERS tnMin, tnMax, tcCaption, tcMessage lnMin = tnMin lnMax = tnMax lcCaption = tcCaption lcMessage = tcMessage lnPos = 0 llCancelFlag = .F. THISFORM.CAPTION = lcCaption THISFORM.progressbar1.MIN = lnMin THISFORM.progressbar1.MAX = lnMax THISFORM.progressbar1.VALUE = lnPos THISFORM.SHOW() DOEVENTS ENDPROC

刷新进度方法 FUNCTION Step LPARAMETERS tnStep lnPos = lnPos + tnStep IF lnPos > lnMax THEN RETURN .F. THISFORM.progressbar1.VALUE = lnPos THISFORM.SAVEDISPLAY() DOEVENTS RETURN .T. ENDFUNC

中止方法 FUNCTION IsCancel RETURN llCancelFlag ENDFUNC

中止按钮点击事件 PROCEDURE btnCancel.Click llCancelFlag = .T. THISFORM.HIDE() ENDPROC

然后在主程序中可以这样使用进度条类:

创建一个单进度对象 loProgress = NEWOBJECT("frm_progress1")
设置进度条 Titile, Min, Max loProgress.Inits(1, RecordCount("mytable"), "正在进行操作", "请稍候...")
循环操作 SELECT mytable SCAN
在此刷新进度条进度 IF !loProgress.Step(1) EXIT ENDIF
具体操作代码 ... ENDSCAN
关闭进度条 loProgress.Hide()
最后,需要在进度条的“中止按钮点击事件”(btnCancel.Click)中添加中止操作的代码,例如:

关闭进度条 THISFORM.Hide()
中止具体操作代码 ...
1