/* * Fichero: ProgressBarMod.prg * Clase TProgressBarMod * * Copyright 2020 Ignacio Ortiz de Zúñiga * Copyright 2020 https://Xailer.com * All rights reserved */ #include "Xailer.ch" #define MARQUEE_START 70 // % of Bar the marquee starts /* Note about lMarquee functionality: This functionality is done using a internal timer, but there can be two limitations: 1) You must call the ProcessMessages() funtion on your working loop 2) You may experience stops on the progress bar due the working task In order to avoid those problems you should use a TFuture, but this forces to use the Multi-thread library (mtvm.lib). For example: METHOD MyHeavyTask() CLASS TForm1 LOCAL oFuture, bTask, bComplete bTask := {|| MyHeavyTask() } bComplete := { || ::oProgresBar:lMarquee := .F. } oFuture := TFuture():CreateFrom( bTask, bComplete ) ::oProgresBar:lMarquee := .T. */ //-------------------------------------------------------------------------- CLASS XProgressBarMod FROM TStdControl PUBLISHED: PROPERTY nWidth INIT 120 PROPERTY nHeight INIT 20 PROPERTY nClrPane INIT clBtnFace ; WRITE INLINE ( ::FnClrPane := Value, ::Refresh() ) ; EDITOR PE_Color PROPERTY nClrBar INIT clSystem; WRITE INLINE ( ::FnClrBar := Value, ::Refresh() ) ; EDITOR PE_Color PROPERTY lTransparent INIT .T. PROPERTY nBorderStyle INIT bvWIN10 PROPERTY nValue INIT 0 WRITE SetPos PROPERTY nMin INIT 0 WRITE INLINE ::SetRange( Value, ::nMax ) PROPERTY nMax INIT 100 WRITE INLINE ::SetRange( ::nMin, Value ) PROPERTY nOrientation INIT orHORIZONTAL VALUES orHORIZONTAL, orVERTICAL PROPERTY lMarquee INIT .F. WRITE SetMarquee PROPERTY nMarqueeSpeed INIT 100 WRITE INLINE ::FnMarqueeSpeed := Value, ::SetMarquee() EVENT OnChange( oSender, nPos ) // --> Nil METHOD Create( oParent ) CONSTRUCTOR METHOD Destroy( lFree ) INLINE iif( ::oTimer != NIL, ::oTimer:End(), ), ::Super:Destroy( lFree ) PUBLIC: PROTECTED: PROPERTY cMessage PROPERTY cText PROPERTY nClrText PROPERTY lBorder INIT .F. PROPERTY l3D PROPERTY lTabStop INIT .F. PROPERTY lParentFont PROPERTY oBrush PROPERTY oFont EVENT OnChar EVENT OnEnter EVENT OnExit EVENT OnKeyDown EVENT OnKeyUp DATA nCtlStyle INIT nOr( WS_CHILD, WS_CLIPCHILDREN, WS_CLIPSIBLINGS ) DATA oTimer RESERVED: METHOD SetPos( nPos, lEvents ) METHOD SetMarquee( lValue ) METHOD SetRange( nMin, nMax ) INLINE ::FnMin := nMin, ::FnMax := nMax, ; ::Refresh() METHOD WMPaint() METHOD WMEraseBkgnd() INLINE 1 METHOD WMPrintClient() EXTERN XProgressBarMod_WMPaint() ENDCLASS //-------------------------------------------------------------------------- METHOD Create( oParent ) CLASS XProgressBarMod ::Super:Create( oParent ) ::SetMarquee() RETURN Self //-------------------------------------------------------------------------- METHOD SetPos( nPos, lEvents ) CLASS XProgressBarMod DEFAULT lEvents TO .T. ::FnValue := nPos IF lEvents .AND. !::lMarquee ::OnChange( nPos ) ENDIF ::Refresh() RETURN nPos //-------------------------------------------------------------------------- METHOD SetMarquee( lValue ) CLASS XProgressBarMod DEFAULT lValue TO ::FlMarquee IF ::oTimer != NIL ::oTimer:End() ::oTimer := NIL ENDIF IF lValue .AND. ::lCreated ::oTimer := TTimer():Create( Self ) ::oTimer:nInterval := ::nMarqueeSpeed ::oTimer:OnTimer := {|| ::nValue ++ } ::oTimer:lEnabled := .t. ENDIF ::flMarquee := lValue RETURN lValue