LPARAMETERS tcTitle, toFTP LOCAL loTherm, loProgress tcTitle = Param_Val(tcTitle,"FTP Progress...") loTherm = Thermometer_Form(tcTitle) loProgress=NEWOBJECT("myclass","","",loTherm) IF VARTYPE(toFTP) = "O" =EVENTHANDLER(toFTP,loProgress) ENDIF RETURN loProgress DEFINE CLASS myclass AS SESSION OLEPUBLIC IMPLEMENTS _IChilkatFTPEvents IN "chilkatftp.chilkatftp" oTherm = NULL tStarted = NULL PROCEDURE INIT LPARAMETERS toTherm THIS.oTherm = toTherm ENDPROC PROCEDURE DESTROY THIS.oTherm.COMPLETE() THIS.oTherm = "" ENDPROC PROCEDURE _IChilkatFTPEvents_PutProgress(pctDone AS NUMBER) AS VOID; HELPSTRING "method PutProgress" THIS.update_therm(pctDone) ENDPROC PROCEDURE _IChilkatFTPEvents_GetProgress(pctDone AS NUMBER) AS VOID; HELPSTRING "method GetProgress" THIS.update_therm(pctDone) ENDPROC PROCEDURE update_therm(pctDone AS NUMBER) LOCAL lnTimeLeft, lnHrs, lnMinutes, lnTimeSpent IF ISNULL(THIS.tStarted) THIS.tStarted = DATETIME() THIS.oTherm.UPDATE(0,"Time Remaining: Unknown") ELSE IF pctDone = 0 THIS.oTherm.UPDATE(0,"Time Remaining: Unknown") ELSE lnTimeSpent = (DATETIME() - THIS.tStarted) IF lnTimeSpent < 5 THIS.oTherm.UPDATE(0,"Time Remaining: Unknown") ELSE lnTimeLeft = (lnTimeSpent * 100 / pctDone) - lnTimeSpent lnHrs = INT(lnTimeLeft/3600) lnMinutes = INT((lnTimeLeft - (lnHrs * 3600)) / 60) lnSeconds = INT(lnTimeLeft - (lnHrs * 3600) - (lnMinutes * 60)) THIS.oTherm.UPDATE(pctDone,"Time Remaining: " + TRANSFORM(lnHrs, "@L 99") + ":" + TRANSFORM(lnMinutes, "@L 99") + ":" + TRANSFORM(lnSeconds, "@L 99")) ENDIF ENDIF ENDIF ENDPROC ENDDEFINE>Chilkat FTP satisfies all my needs for FTP... but now a now need arises.