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.
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
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.
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.
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.
I've tried to run the AVI file that were include in my Project without success.
Any tips?