Skip to main content

Displaying a Progress bar that doesn't affect your program

I have been really intrigued by the MTmyVFP project on Codeplex - primarily because I want my FoxPro apps to be as efficient as possible and to run in the background where possible but one of my pet peeves in a recent application is that if I'm doing some heavy work and want to display an animation (similar to the Copy files that you see in Windows), the animation really gets bogged down with the processing.

As a result, it looks funky to the user. I had asked Claude Fox if MTmyVFP could be used to do this - and the answer was to make my processing code run in the background and then make the animation run in the main application thread.

That wasn't doable but it made me think: what if I had an application that could show the animation and then I would just call it when needed.

Here's how I did it in VFP:


DEFINE CLASS oAni AS Custom OLEPUBLIC

oForm = .NULL.


PROCEDURE Show (tcTitle,tcAvi)

THIS.oForm = CREATEOBJECT("frmanimation",tcTitle,tcAvi)


THIS.oform.Show()



ENDPROC


PROCEDURE Hide

THIS.oForm.Release()

ENDPROC

ENDDEFINE




DEFINE CLASS frmanimation AS form



Height = 106

Width = 377

ShowWindow = 2

DoCreate = .T.

AutoCenter = .T.

Caption = "Working"

ControlBox = .F.

AlwaysOnTop = .T.

Name = "frmAnimation"



PROCEDURE Init
LPARAMETERS tcTitle, tcFile

IF EMPTY(tcTitle)
tcTitle = ""
ENDIF

THIS.Caption = tcTitle
THIS.AddAnimation()
IF EMPTY(tcFile)
tcFile = "filemove.avi"
ENDIF
LOCAL llRet
llRet = .T.
LOCAL lcErr
lcErr = ON("ERROR")
ON ERROR llRet = .F.
IF FILE(tcFile)
THIS.Avi.Open(tcFile)
THIS.Avi.Play()
ENDIF
on error &lcErr
RETURN llRet
ENDPROC

PROCEDURE AddAnimation
THIS.AddObject("AVI","olecontrol","comctl2.animation.1")
WITH THIS.Avi
.Top = 3
.Left = 0
.Height = 100
.Width = 372
.Visible = .T.
ENDWITH
ENDPROC
PROCEDURE Error
LPARAMETERS nError, cMethod, nLine

** Ignore it
ENDPROC


ENDDEFINE
*
*-- EndDefine: frmanimation
**************************************************


Then build the code as an EXE. I called mine THERM.

Now, whenever you need to show a thermometer, you can call

lo = CREATEOBJECT("Therm.oani")
lo.Show("Working","FILECOPY.AVI")

(hint: you can find AVI files in the VFP Home Directory under Graphics\Videos.)

Your progress bar will appear right in the middle of the screen.  Now when you need to close it, just call:

 lo.Hide()

You can take this even further by changing the form details with THIS.oForm.Caption, etc, etc.

The only downside here is that you HAVE to register your EXE so you can instantiate it but you can do that easily simply by running it once with a REGSERVER.

Now, of course, there is a GOTCHA and that is that if you run this class, you may notice a weird transparent background every now and then.

The solution? Forget using a non-visual class. Instead, create a form with the same code and drop the control on it to begin with.

For good measure, set the Center property of the Animation control to .T.

Then you're even BETTER to go.

So in my class, instead of doing the CREATEOBJECT, I simply call

PROCEDURE Show (tcTitle,tcAvi)

DO FORM DispAni WITH tcTitle,tcAVI NAME THIS.oForm



ENDPROC



The end result is a much smoother animation while your application does all its work.


Powered by ScribeFire.

Comments

Brian said…
I did something similar a while back, but I used a free table to store the progress state. In my processing application, I would simply update the values in the table, there was no need for the programs to interact.

create table status ( ;
title c(50), message c(100), ;
percent n(3,0), paused l, cancelled l ;
)
append blank

The progress app contained a pause button which would lock the single record table and a cancel button.
Andrew MacNeill said…
Cool idea, Brian.

In my case, I didn't want to show a Thermometer persay but rather the animation (maybe I should have changed the title of my post).

We already have a thermometer showing at the bottom of the screen which updates every 200 records.

But that's definitely a useful approach as well.
Brian said…
I was eventually planning on sticking the progress application in the system tray, never got the time to do it.

The last time I tried putting an application in the system tray (using VFP8 and Binding) it was so buggy that I ditched the idea.

I'm hoping that VFP9 has better support for this sort of thing. Alternatively, a C# or VB app that uses ODBC to read the status.dbf table would probably be easier to stick in the system tray.
Luc Nadeau said…
The Ole control seem to run unly file from disk.

I've tried to run the AVI file that were include in my Project without success.

Any tips?

Popular posts from this blog

FoxInCloud Stats

FoxInCloud sent this link a while back about their statistics regarding visits to their site:

http://foxincloud.com/blog/2017/12/27/VFP-community-lessons-from-foxincloud-site.html



What's interesting here is the breakdown of people. Yes, I think it's understandable that the Fox community is getting older.

Another factor is the growth of the mobile and web environments taking over development. These environments really do push people towards the newer non-SQL or free SQL/hosted environments but more towards hosted storage options like Amazon and Google. A tool like FoxInCloud that helps MOVE existing applications to the cloud inherently competes with those environments.

But FoxInCloud also allows developers to extend their application further by giving them a starting point using Javascript and the basic CSS (such as Bootstrap). If you're not rebuilding your application from scratch, it's certainly a great step forward.

Well, that explains CodePlex...

In a move that will be sure to anger open source (or rather anti-paid software, anti-Microsoft open source)  zealots, Microsoft is planning to buy GitHub.

A year ago, I mused about why Microsoft would shut down CodePlex and how the world needs competing source code repositories to be strong. I'm not the only one per this Slashdot article :
"...people have warned about GitHub becoming as large as it did as problematic because it concentrates too much of the power to make or break the open source world in a single entity, moreso because there were valid questions about GitHubs financial viability...." - Jacques Mattheij

I will be interested in seeing this play out - whether developers jump ship or not. Have all the efforts Microsoft has made in pushing towards open source be seen as genuine or will all the zealots jump ship or maybe even attack?

Microsoft's comment about why they shut down CodePlex referred to how spammers were using CodePlex. Well, GitHub has its own …

The World of Updates Today

I just received an update for Office 365. It certainly includes some cool features - including starting in one environment and picking it up in another environment. In recent years, I've certainly enjoined the use of Continuity on a Mac and in fact, I feel spoiled being able to start a message in one environment (even Google) and then finish it off on another.  This has become some pervasive when we were reviewing our most recent backlog at a client site, a similar feature was added to the current workload.

But with web applications, the trend is to reduce the amount of software on a client machine. I used to have automatic backup for all of my machines (thanks Carbonite!) but these days, many of my machines don't need anything beyond the core OS and some basic applications. Certainly that's the feeling with Chromebooks and even the lightweight aspect of many iOS apps. The functionality is mostly in the cloud.

When you upgrade your system, you expect it to a big update. So…