VCL Delphi

//drony@mynet.com
//icq:266148308
unit WinRarGauge;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls ;
type
TPercentLimit = 0..100;
TOnPercentModify = procedure (Sender:TObject; Percent: Integer)
of object ;
type
TWinRarGauge = class(TGraphicControl)
private
FPercent : TPercentLimit;
FOnChange : TOnPercentModify ;
procedure SetPercent( Value : TPercentLimit ) ;
procedure Draw(Canvas: TCanvas; Rect: TRect; Percent: Integer);
protected
procedure Paint ; override ;
procedure PercentChanged ; dynamic ;
public
constructor Create( AOwner : TComponent ) ; override ;
destructor Destroy; override;
published
property Percent : TPercentLimit
read FPercent
write SetPercent;
property OnChange : TOnPercentModify
read FOnChange
write FOnChange ;
property Align;
property Color;
property Visible;
end;
procedure Register;
implementation
PROCEDURE TWinRarGauge.Draw(Canvas: Tcanvas; Rect: TRect; Percent: Integer);
var MemI: TImage;
procedure DrawBorder(Canvas: TCanvas; Rect: TRect);
begin
with Canvas, Rect do
begin
Pen.Color := $009090B0; {First Border}
MoveTo(Left,Bottom-3);
LineTo(Left,Top);
LineTo(Right-2,Top);
LineTo(Right-2,Bottom-3);
LineTo(Left,Bottom-3);
Pen.Color := $005F5F5F; {Bottom Gray Line}
MoveTo(Left, Bottom-2);
LineTo(Right, Bottom-2);
Pen.Color := $00000000; {Black Shadow}
MoveTo(Left+1, Bottom-1);
LineTo(Right-1, Bottom-1);
LineTo(Right-1, Top+1);
Pen.Color := $007F7F9F; {Second Border}
MoveTo(Left+1, Bottom-4);
LineTo(Left+1, Top+1);
LineTo(Right-3, Top+1);
LineTo(Right-3, Bottom-4);
LineTo(Left+1, Bottom-4);
Brush.Color := $006D6D8D; {Background Fill}
Pen.Color := $006D6D8D;
Rectangle(Left+2, Bottom-4, Right-3, Top+2);
end;
end;
procedure DrawBar(Canvas: TCanvas ; Rect: TRect; Percent: Integer);
var BLength : Integer ;
begin
if Percent = 0 then Exit;
with Canvas, Rect do
begin
BLength := (Right - 1) * Percent div 100;
Pen.Color := $00FFFFFF; {Left and Top White line}
MoveTo(Left, Bottom-3);
LineTo(Left, Top);
LineTo(BLength, Top);
Pen.Color := $00EFE7E0; {Second Border}
Rectangle(Left+1, Bottom-2, BLength, Top+1);
Pen.Color := $00DCD5D0; {Bar Foreground}
Brush.Color := Pen.Color;
Rectangle(Left+2, Bottom-3, BLength-1, Top+2);
Pen.Color := $005F5F5F; {2 Vertical Lines after it...}
MoveTo(Left+BLength, Bottom-2);
LineTo(Left+BLength, Top-1);
Pen.Color := $007F7F9F;
MoveTo(Left+BLength+1, Bottom-3);
LineTo(Left+BLength+1, Top-1);
Pen.Color := $00000000; {Redraw the ending black line}
MoveTo(Right-1, Bottom-1);
LineTo(Right-1, Top+1);
Pen.Color := Color; {2 DarkGray dots at end when bar reaches 100%}
MoveTo(Right-1, Top+1);
LineTo(Right-1, Top-1);
end;
end;
BEGIN
MemI := TImage.Create(Self);
MemI.Width:=Width;
MemI.Height:=Height;
with MemI.Canvas do
begin
Brush.Color := Color;
FillRect(ClipRect); {Fill the canvas background}
DrawBorder(MemI.Canvas, Rect);
DrawBar(MemI.Canvas, Rect, Percent);
end;
Canvas.Draw(0,0,MemI.Picture.Graphic);
MemI.Free;
END;
constructor TWinRarGauge.Create ( AOwner : TComponent );
begin
inherited Create(AOwner);
Color := clBtnFace;
FPercent := 0 ;
Width := 200 ;
Height := 15 ;
end;
destructor TWinRarGauge.Destroy;
begin
inherited Destroy;
end;
procedure TWinRarGauge.SetPercent (Value : TPercentLimit );
begin
if FPercent <> Value then
begin
if (Value <= 100) and (Value >= 0) then
begin
FPercent := Value;
PercentChanged ; {Set event}
Paint;
end;
end;
end;
procedure TWinRarGauge.PercentChanged ;
begin
if Assigned (FOnChange) then
FOnChange(Self,FPercent);
end;
procedure TWinRarGauge.Paint ;
var Rect : TRect;
begin
inherited Paint;
Rect := ClientRect;
Draw(Canvas, Rect, FPercent);
end;
procedure Register;
begin
RegisterComponents('Plus', [TWinRarGauge]);
end;
end.