{
 Since I received the request I post the following Turbo Vision snippet. The
 object in the code below is a very basic growbar. It is meant to be inserted
 into a dialog box and to show the progress of a certain action. The object
 is very simple so I didn't comment the source. I did include an example on
 how to put the progress bar into a dialog box. If you have questions about
 this code, feel free to ask. This is the text version of this object, the
 graphical version will follow later (it is a bit more complicated and I want
 to comment on it).

 Here we go :

 {==========================================================================}
 {= Unit name      : GrowView                                              =}
 {= Version        : 1.0                                                   =}
 {= Public Objects : TGrowView                                             =}
 {===--------------------------------------------------------------------===}
 {= Programmer     : David van Driessche                                   =}
 {= Language       : Borland Pascal 7.0                                    =}
 {===--------------------------------------------------------------------===}
 {= This code is property of David van Driessche (FidoNet 2:291/1933.13)   =}
 {= Please use it as you like.                                             =}
 {==========================================================================}

 {$F+,O+,X+,I+,B-,V-}

 {$ifdef DebugVersion}
  {$R+,S+,Q+,D+,L+,Y+}
 {$else}
  {$R-,S-,Q-,D-,L-,Y-}
 {$endif}

 unit GrowView ;

 interface

 uses Objects, Views;

 type
  PGrowView = ^TGrowView ;
  TGrowView = object( TView )
               constructor Init( var R : TRect ; ATotal : Longint ) ;
               procedure   Draw ; virtual ;
               function    GetPalette : PPalette ; virtual ;
               procedure   Update( NewValue : Longint ) ;
               private
               Total       : Longint ;
               Value       : Longint ;
               NumBlock    : Integer ;
               function    CalcBlock : Integer ;
              end ;

 {
  Feel free to dissagree with my choice of colors. This palette maps into the
  TDialog palette and produces a black 'background' bar with yellow blocks.
 }
 const
  CGrowView = #6#9 ;

 implementation

 uses Drivers ;

 constructor TGrowView.Init( var R : TRect ; ATotal : Longint ) ;
  begin
   inherited Init( R ) ;
   Total        := ATotal ;  { Remember the 100% value }
   Value        := 0 ;       { Current value is 0 }
   NumBlock     := 0 ;       { No colored blocks so far }
  end ;

 { Calculate the number of colored blocks for the current 'Value' }
 function TGrowView.CalcBlock : Integer ;
  begin
   CalcBlock := Round( Size.X / Total * Value ) ;
  end ;

 procedure TGrowView.Draw ;
  var
   R      : TRect ;
   B      : TDrawBuffer ;
  begin
   MoveChar( B, '±', GetColor( 1 ), Size.X ) ;
   MoveChar( B, 'Û', GetColor( 1 ), NumBlock ) ;
   WriteLine( 0, 0, Size.X, Size.Y, B ) ;
  end ;

 function TGrowView.GetPalette: PPalette ;
  const
   P : string[ Length(CGrowView) ] = CGrowView ;
  begin
   GetPalette := @P ;
  end ;

 {
  This object was originally written in my graphical Turbo Vision variant. In
  this graphical world, drawing is very expensive (in terms of execution time)
  compared to calculating. I therefor try to avoid to redraw the progress bar
  if it is not necessary. The optimisations in the graphical variant are
  more complicated then what I left in here.
 }
 procedure TGrowView.Update( NewValue : Longint ) ;
  var
   NewBlock : integer ;
  begin
   { An update request : did my situation change ? }
   if (Value <> NewValue) then
    begin
     { Yes it did, remember the new situation }
     Value    := NewValue ;
     { Calculate the new number of colored blocks }
     NewBlock := CalcBlock ;
     { If this number didn't change we don't need to redraw }
     if (NewBlock <> NumBlock) then
      begin
       { Pitty, we do need the redraw. }
       NumBlock := NewBlock ;
       Draw ;
      end ;
    end ;
  end ;

end.
