Contributor: BRAD ZAVITSKY { Here is my percentage bar unit, that (??Steve Rogers?? I can't quite remember now--sorry ) suggested I try a whiles back (I just got around to it). It has been debugged for all of a hour. {** PBar Percentage Bar Unit copr.1995 Brad Zavitsky All Rights Reserved Commercial use not allowed Use at your own risk Formulae- Percentage => Round(cur/max); PBar progress => Round((cur/max) * #spaces); ReDraw- If set to true, the whole percentage bar is redrawn each time. If false, it will continue were last left off **} unit PBar; interface type BarObj = object ReDraw : Boolean; Spaces : Integer; Old, Max : Longint; Ch : Char; X, Y, Color : Byte; procedure UpDate(Cur: Longint); procedure Init(_Spaces: Integer; _Max: Longint; _Ch: Char; _X, _Y, _Color: Byte; _ReDraw: Boolean); end; implementation var VS: word; function VidSeg: Word; var VidM: ^Byte; begin {$iFDEF VER70} VidM := Ptr(Seg0040,$0049); if VidM^ = 7 then VidSeg := SegB000 else VidSeg := SegB800; {$ELSE} VidM := Ptr($0040,$0049); if VidM^ = 7 then VidSeg := $B000 else VidSeg := $B800; {$ENDiF} end; procedure WriteChar(Ch: char; x, y, attr: byte); var where: Word; [Abegin Where := 160*(Y-1)+2*(X-1); Mem[VS:Where] := Ord(Ch); Mem[VS:Where+1] := Attr; end; procedure BarObj.Init(_Spaces: Integer; _Max: Longint; _Ch: Char; _X, _Y, _Color: Byte; _ReDraw: Boolean); begin Old := 0; Spaces := _Spaces; X := _X; Y := _Y; Color := _Color; Ch := _Ch; Max := _Max; ReDraw := _ReDraw; end; procedure BarObj.UpDate(Cur: Longint); var Temp, OldPos, SpacePos: Integer; begin SpacePos := Round((Cur/Max) * Spaces); if ReDraw then begin for Temp := 0 to SpacePos-1 do WriteChar(Ch, X+Temp, Y, Color); end else begin Dec(SpacePos, Old); for Temp := 0 to SpacePos-1 do WriteChar(Ch, X+Temp+Old, Y, Color); Inc(Old, SpacePos); end; end; begin VS := VidSeg; end.