Take the code below and cut-n-paste it into a prg file. Then add that prg file to a project and compile it to "MyApp.Exe" (or whatever). You will end up with a out-of-process Automation server and it will automatically be registered on your machine.
I know the browser control is lame for animation, but I wanted an example you could run right out of the box (you do need internet access since the animated GIF is on my server) If you wanna see what it is going to look like before you compile it into a COM Server EXE then uncomment the top 3 lines of code and run the prg from inside VFP.
*!* PUBLIC oForm
*!* oForm = CREATEOBJECT("progress"

*!* oForm.visible = .t.
DEFINE CLASS progress AS form OLEPUBLIC
Height = 87
Width = 450
ShowWindow = 2
ShowInTaskBar = .F.
DoCreate = .T.
AutoCenter = .T.
BorderStyle = 2
Caption = "Operation Progress"
ControlBox = .F.
Closable = .F.
MaxButton = .F.
MinButton = .F.
ClipControls = .T.
TitleBar = 1
AlwaysOnTop = .T.
SizeBox = .F.
ZoomBox = .F.
ColorSource = 0
Name = "progress"
*-- Specifies the current state of a control.
value = .F.
max = .F.
min = .F.
ADD OBJECT olecontrol1 AS olecontrol WITH ;
Top = -21, ;
Left = 0, ;
Height = 200, ;
Width = 75, ;
Name = "Olecontrol1", ;
OleClass = "Shell.Explorer.2"
ADD OBJECT olecontrol2 AS olecontrol WITH ;
Top = 33, ;
Left = 74, ;
Height = 27, ;
Width = 348, ;
Name = "Olecontrol2", ;
OleClass = "MSComctlLib.ProgCtrl.2"
ADD OBJECT label1 AS label WITH ;
AutoSize = .F., ;
Alignment = 2, ;
BackStyle = 0, ;
Caption = "0%", ;
Height = 17, ;
Left = 74, ;
Top = 60, ;
Width = 348, ;
Name = "Label1"
ADD OBJECT label2 AS label WITH ;
AutoSize = .F., ;
Alignment = 0, ;
BackStyle = 0, ;
Caption = "Current Task...", ;
Height = 17, ;
Left = 74, ;
Top = 12, ;
Width = 348, ;
Name = "Label2"
PROCEDURE Init
this.olecontrol1.navigate("about:<html><body scroll='no'><img src='
ENDPROC
PROCEDURE update
lparameters nValue, cTask
this.value = nValue
IF PCOUNT() > 1
THIS.Label2.Caption = cTask
endif
ENDPROC
PROCEDURE value_assign
LPARAMETERS vNewVal
this.label1.Caption = ALLTRIM(STR(INT((m.vNewVal/this.max)*100))) + "%"
this.olecontrol2.value = m.vNewVal
ENDPROC
PROCEDURE max_access
RETURN this.olecontrol2.max
ENDPROC
PROCEDURE max_assign
LPARAMETERS vNewVal
this.olecontrol2.max = m.vNewVal
ENDPROC
PROCEDURE min_access
RETURN this.olecontrol2.min
ENDPROC
PROCEDURE min_assign
LPARAMETERS vNewVal
this.olecontrol2.max = m.vNewVal
ENDPROC
PROCEDURE value_access
RETURN this.olecontrol2.value
ENDPROC
ENDDEFINE
Example for using it once you have compiled it, in the command window execute the following lines
oProgress = CREATEOBJECT("MyApp.Progress"

oProgress.Visible = .t.
oProgress.update(25,"Packing Data..."

oProgress.update(47,"Indexing Data..."

oProgress.update(83,"Backing Up Data..."

oProgress.update(100,"Complete..."

Release oProgress
Slighthaze =
NULL
[ul][li]FAQ184-2483
An excellent guide to getting a fast and accurate response to your questions in this forum.[/li][/ul]