Contributor: IGOR VASILCHIKOV

unit ScaleStr ;
interface

function ScaleFill( C1 , C2 : Char ; Len : byte ; Part : Real ) : String ;
function FoxScaleFill( C1 : Char ; Len : byte ; Part : Real ) : String ;
function FoxScale( C1 : Char ; Len : byte ; Part : Real ) : String ;
function SRScaleFill( Len : byte ; Part : Real ) : String ;

const

      OnlyOne   : Boolean = FALSE ;
      A_La_Zip  : Boolean = FALSE ;
      A_La_ZipM : Boolean = FALSE ;

implementation

const
    maxC = 23;
    minC = 0 ;
    CurC   : Byte = 0  ;

type
    CharsT = array[ minC .. maxC ] of char ;

function SRScaleFill( Len : byte ; Part : Real ) : String ;
var
   s      : String ;
   l      : word   ;
begin
   s[ 0 ] := Chr( Len ) ;
   FillChar( S[ 1 ] , Len , #249 ) ;
   if ( Part < 1 ) and ( Part >= 0 ) then
      l := Round( Len * Part * 2 )
   else
      l := Len shl 1 ;
   if l > 0 then
   begin
      if odd( l ) then
         s[ l shr 1 + 1 ] := #221
      else
         s[ l shr 1 ] := #222
   end
   else
      s[ 1 ] := #221 ;
   SRScaleFill := S ;
end ;

function FoxScaleFill ;
var
   s      : String ;
   l      : Word   ;
begin
   s[ 0 ] := Chr( Len ) ;
   FillChar( S[ 1 ] , Len , C1 ) ;
   if ( Part < 1 ) and ( Part >= 0 ) then
      l := Round( Len * Part * 2 )
   else
      l := Len shl 1 ;
   if l > 0 then
   begin
      FillChar( S[ 1 ] , l shr 1 , #219 ) ;
      if odd( l ) then
         s[ l shr 1 + 1 ] := #221
   end
   else
      s[ 1 ] := #221 ;
   FoxScaleFill := S ;
end ;

Function FoxScale ;
Var
   S      : string ;
   L      : word   ;
begin
   if ( Part < 1 ) and ( Part >= 0 ) then
      L := Round( Len * Part )
   else
      L := Len  ;
   S[0] := Chr( L ) ;
   FillChar( S[ 1 ] , L , C1 ) ;
   FoxScale := S ;
end ;

function ScaleFill( C1 , C2 : Char ; Len : byte ; Part : Real ) : String ;
var
   s      : String ;
   l      : byte   ;
   CC,
   CX,CL  : CharsT ;
begin
   CL := '//--\\//--\\//--\\//--\\' ;
   CX := '////////--------\\\\\\\\' ;
   s[ 0 ] := Chr( Len ) ;
   FillChar( S[ 1 ] , Len , C2 ) ;
   if ( Part < 1 ) and ( Part >= 0 ) then
      l := Round( Len * Part )
   else
      l := Len ;

   if ( Not OnlyOne ) then
      FillChar( S[ 1 ] , L , C1 ) ;
   if A_La_Zip then
     CC := CL ;
   if A_La_ZipM then
     CC := CX ;

   if A_La_Zip or A_La_ZipM  then
   begin
      if l > 0 then
      begin
         s[ l ] := CC[ CurC ] ;
         if Part = 1.0 then
           s[ l ] := ' ' ;
      end
      else
         s[ 1 ] := CC[ CurC ] ;
      inc( CurC ) ;
      if CurC > MaxC then
         CurC := MinC ;
   end
   else
      if OnlyOne then
      begin
         if l > 0 then
            s[ l ] := C1
         else
            s[ 1 ] := C1
      end ;
   ScaleFill := S ;
end ;

end .