Contributor: MATTHEW CSULIK

{
Hello!

I'm from Hungary, and I love the SWAG!

It's a very useful site, and I use it since 2 years.
I send to You a Delphi 2.0 component:
 - TLCDControl (it looks like WinNT 4.0 Task Manager's LCD)
      resource file included (XX3402)

This component was made for Delphi 2.0, but it is also working on Delphi 1.0
(I think).
I send it to You, because I don't know any other addresses about SWAG.
I hope, this component will be useful for somebody.

Kind regards
        Matthew Csulik
        matthew-c@usa.net

P.S.: To extract the resource file, use WinZip95 (the 32bit version)!

-----------------------------------------------------------------------
-                                                                     -
-   LCDControl.pas                                                    -
-   **************                                                    -
-   This component is completely FREE.                                -
-                                                                     -
-----------------------------------------------------------------------

unit LCDControl;

{ written by Matthew }
{ matthew-c@usa.net  }

interface

uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
   TNumberType = (ntNone, ntCharK, ntPercent);

   TLCDControl = class(TGraphicControl)
   private
      NumBmp: array[0..9] of TBitmap;
      CharKBmp: TBitmap;
      PercentBmp: TBitmap;
      OnBmp: TBitmap;
      OffBmp: TBitmap;
      FNumber: integer;
      FNumberType: TNumberType;
      FNumberMax: integer;
      procedure SetNumber(Value: integer);
      procedure SetNumberType(Value: TNumberType);
      procedure SetNumberMax(Value: integer);
   protected
      procedure Paint; override;
   public
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;
      procedure WriteLCDNum(Num: integer; X,Y: integer; ACanvas: TCanvas);
      procedure WriteNumber(Num: integer; NumType: TNumberType; X,Y:
integer; ACanvas: TCanvas);
      function GetNumberLength(Num: integer; NumType: TNumberType): integer;
      procedure DisplayTicks(Rect: TRect; Num: integer; ACanvas: TCanvas);
      procedure UpdateLCD(UpdateCanvas: TCanvas);
   published
      property Number: integer read FNumber write SetNumber;
      property NumberType: TNumberType read FNumberType write SetNumberType;
      property NumberMax: integer read FNumberMax write SetNumberMax;
   end;

procedure Register;

implementation

{$R LCD.RES}

constructor TLCDControl.Create(AOwner: TComponent);
var
   i: integer;
begin
   inherited Create(AOwner);
   for i:= 0 to 9 do
   begin
      NumBmp[i]:= TBitmap.Create;
      NumBmp[i].LoadFromResourceID(HInstance, i);
   end;
   CharKBmp:= TBitmap.Create;
   CharKBmp.LoadFromResourceName(HInstance, 'CHARK');
   PercentBmp:= TBitmap.Create;
   PercentBmp.LoadFromResourceName(HInstance, 'PERCENT');
   OnBmp:= TBitmap.Create;
   OnBmp.LoadFromResourceName(HInstance, 'ON');
   OffBmp:= TBitmap.Create;
   OffBmp.LoadFromResourceName(HInstance, 'OFF');
   FNumber:= 0;
   FNumberMax:= 100;
   FNumberType:= ntNone;
   Width:= 100;
   Height:= 120;
end;

procedure TLCDControl.Paint;
begin
   with inherited Canvas do
   begin
      Brush.Color:= clBlack;
      FillRect(Self.ClientRect);
      Pen.Color:= clbtnShadow;
      Polyline([Point(Width-1,0),Point(0,0),Point(0,Height-1)]);
      Pen.Color:= clbtnHighlight;
      Polyline([Point(Width-1,1),Point(Width-1,Height-1),Point(1,Height-1)]);
   end;
   UpdateLCD(Canvas);
end;

destructor TLCDControl.Destroy;
var
   i: integer;
begin
   for i:= 0 to 9 do
   begin
      NumBmp[i].Free;
   end;
   CharKBmp.Free;
   PercentBmp.Free;
   OnBmp.Free;
   OffBmp.Free;
   inherited Destroy;
end;

procedure TLCDControl.SetNumber(Value: integer);
begin
   if (FNumber <> Value) and (Value <= NumberMax) then
   begin
      FNumber:= Value;
      UpdateLCD(Canvas);
   end;
end;

procedure TLCDControl.SetNumberMax(Value: integer);
begin
   if (Value > 0) and (Value >= Number) then
   begin
      FNumberMax:= Value;
      Invalidate;
   end;
end;

procedure TLCDControl.SetNumberType(Value: TNumberType);
begin
   if FNumberType <> Value then
   begin
      FNumberType:= Value;
      UpdateLCD(Canvas);
   end;
end;

procedure TLCDControl.WriteLCDNum(Num: integer; X,Y: integer; ACanvas: TCanvas);
begin
   with ACanvas do
   begin
      Brush.Color:= clBlack;
      Draw(X,Y,NumBmp[Num]);
   end;
end;

procedure TLCDControl.WriteNumber(Num: integer; NumType: TNumberType; X,Y:
integer; ACanvas: TCanvas);
var
   NumLength: integer;
   NumStr: string;
   CNum: integer;
   CX: integer;
   i: integer;
begin
   CX:= X;
   NumStr:= IntToStr(Num);
   NumLength:= Length(NumStr);
   for i:= 1 to NumLength do
   begin
      CNum:= StrToInt(NumStr[i]);
      WriteLCDNum(CNum, CX, Y, ACanvas);
      Inc(CX, 8);
   end;
   if NumType <> ntNone then
   begin
      with ACanvas do
      begin
         Brush.Color:= clBlack;
         case NumType of
            ntCharK:
            begin
               Draw(CX,Y,CharKBmp);
            end;
            ntPercent:
            begin
               Draw(CX,Y,PercentBmp);
            end;
         end;
      end;
   end;
end;

function TLCDControl.GetNumberLength(Num: integer; NumType: TNumberType):
integer;
var
   NumLength: integer;
   NumStr: string;
begin
   Result:= 0;
   NumStr:= IntToStr(Num);
   NumLength:= Length(NumStr);
   case NumType of
      ntNone:
         Result:= NumLength * 8;
      ntCharK:
         Result:= (NumLength + 1) * 8;
      ntPercent:
         Result:= (NumLength + 1) * 8;
   end;
end;


procedure TLCDControl.DisplayTicks(Rect: TRect; Num: integer; ACanvas: TCanvas);
var
   TicksH: integer;
   Ticks: integer;
   TicksOn: integer;
   TicksOff: integer;
   i: integer;
   Center: integer;
   SY: integer;
begin
   SY:= Rect.Top;
   TicksH:= Rect.Bottom-Rect.Top;
   Center:= (Rect.Right-Rect.Left) div 2;
   Ticks:= TicksH div 3;
   TicksOn:= (Ticks * Num) div NumberMax;
   TicksOff:= Ticks-TicksOn;
   with ACanvas do
   begin
      Brush.Color:= clBlack;
      for i:= 1 to TicksOff do
      begin
         Draw(Center-17,SY,OffBmp);
         Draw(Center+1,SY,OffBmp);
         Inc(SY,3);
      end;
      for i:= 1 to TicksOn do
      begin
         Draw(Center-17,SY,OnBmp);
         Draw(Center+1,SY,OnBmp);
         Inc(SY,3);
      end;
   end;
end;

procedure TLCDControl.UpdateLCD(UpdateCanvas: TCanvas);
var
   CX: integer;
begin
   DisplayTicks(Rect(2,2,Self.Width-2,Self.Height-20),Number,UpdateCanvas);
   CX:= (Self.Width div 2)-(GetNumberLength(Number,NumberType) div 2);
   UpdateCanvas.Brush.Color:= clBlack;
   UpdateCanvas.FillRect(Rect(2,Self.Height-15,Self.Width-2,Self.Height-2));
   WriteNumber(Number,NumberType,CX,Self.Height-15,UpdateCanvas);
end;


procedure Register;
begin
   RegisterComponents('Matthew', [TLCDControl]);
end;

end.

{ the following contains addition files that should be included with this
  file.  To extract, you need XX3402 available with the SWAG distribution.

  1.     Cut the text below out, and save to a file  ..  filename.xx
  2.     Use XX3402  :   xx3402 d filename.xx
  3.     The decoded file should be created in the same directory.
  4.     If the file is a archive file, use the proper archive program to
         extract the members.

{ ------------------            CUT              ----------------------}


*XX3402-000656-230497--72--85-06793------LCDRES.ZIP--1-OF--1
I2g1--E++U+6+BNUZm7zSdQJaU+++Bk-+++C++++H2B2EqxiR57jP0tYMr7XM4-UI+1WzzwV
4-poA16ka61ZaFV045kMb-ZQUBWTkEz60k9GDZ-p+U7w91+x4Y+g+QKA1--V-IM458+-X-UO
4W+I0682UAG-+kR+BcAFm53U0UH-PjrDM6k2nDz1kKRnVC3+BhSe-OgK9C-O+4Mn94-M+07U
sY+aL-kc+FRT-J41P+t6+cUMu0vCd8E+F7XW05Mt5-EXVkY+I2g1--E++U+6+4dUZm9FyTbH
5U2++Bk7+++5++++H2B29b7ZQwqIEKf1A--3TtEoHZEcDc6KLKHVGkGHIUWodTEkKTcECM1c
oeTknNkzYdd4RYmx8R8AjwMS0Tko4UE+Vidvfu4ReQfB8rnUU2zI5Bzk3SP9wabpgrN53REX
hM-DJtWmlXpc4Vz27QKVunftcrg2mUJllyUVBJdc1EjPUeAYb9FZGZh4TSLT-TsOfxVn-wT2
v8EHQCz239LQUvLyrPcB+GTeCP0zgyOMs0sdRQBRzUBrCv0MvMKSXgo2Iw5CpttKp09NKFD3
4hyRjx4My7iGRH4nGgPActIqx7+VGav699aMSNaISJXbSQmff5cXp1vGxuUr5f8fwqqjG-nL
SNqubmDBMmumjnT4n7gQunn8lQnP5Djt1qNYJKSt6yslLk-EGk20AUgI++6+0+1KM7QWTreL
3Nc+++1Q+E++1U+++++++++++0++hc2+++++H2B2EqxiR57jP0tYMr7EGk20AUgI++6+0+-e
M7QWoTbtols-++1Q0E++-k+++++++++++0++hc54++++H2B29b7ZQp-9-EM++++++U+0+52+
+++7+U++++++
***** END OF BLOCK 1 *****