Componentes.Terceros.jvcl/official/3.32/run/JvLED.pas

319 lines
8.6 KiB
ObjectPascal

{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvTransled.PAS, released on 2002-12-23.
The Initial Developer of the Original Code is Thomas Hensle (http://www.thensle.de)
Portions created by Thomas Hensle are Copyright (C) 2002 Thomas Hensle.
Portions created by XXXX Corp. are Copyright (C) 2002, 2003 XXXX Corp.
All Rights Reserved.
Contributor(s):
Thomas Huber (Thomas_D_huber att t-online dott de)
peter3 (load new image only when needed, center image in control, draw border at designtime)
marcelb (merging of JvTransLED and JvBlinkingLED)
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvLED.pas 10612 2006-05-19 19:04:09Z jfudickar $
unit JvLED;
{$I jvcl.inc}
interface
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
Windows, Messages, Controls, Forms, Graphics, ExtCtrls,
Classes,
JvComponent;
type
TJvCustomLED = class(TJvGraphicControl)
private
FImgPict: TBitmap;
FImgMask: TBitmap;
FTimer: TTimer;
FColorOn: TColor;
FColorOff: TColor;
FActive: Boolean;
FStatus: Boolean;
FOnChange: TNotifyEvent;
{$IFDEF VisualCLX}
FAutoSize: Boolean;
procedure SetAutoSize(Value: Boolean);
{$ENDIF VisualCLX}
procedure SetColorOn(Value: TColor);
procedure SetColorOff(Value: TColor);
procedure SetInterval(Value: Cardinal);
function GetInterval: Cardinal;
procedure SetActive(Value: Boolean);
function GetActive: Boolean;
procedure SetStatus(Value: Boolean);
function GetStatus: Boolean;
procedure DoBlink(Sender: TObject);
protected
procedure ColorChanged; override;
procedure Paint; override;
property Active: Boolean read GetActive write SetActive default False;
property Color default clLime;
property ColorOn: TColor read FColorOn write SetColorOn default clLime;
property ColorOff: TColor read FColorOff write SetColorOff default clRed;
property Interval: Cardinal read GetInterval write SetInterval default 1000;
property Status: Boolean read GetStatus write SetStatus default True;
{$IFDEF VisualCLX}
property AutoSize: Boolean read FAutoSize write SetAutoSize;
{$ENDIF VisualCLX}
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
end;
TJvLED = class(TJvCustomLED)
published
property Active;
property Align;
property Anchors;
property AutoSize;
{$IFDEF VCL}
property DragCursor;
property DragKind;
property OnEndDock;
property OnStartDock;
{$ENDIF VCL}
property ColorOn;
property ColorOff;
property Constraints;
property DragMode;
property Height default 17;
property Interval;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property Status;
property Visible;
property Width default 17;
property OnClick;
property OnContextPopup;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDrag;
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_32/run/JvLED.pas $';
Revision: '$Revision: 10612 $';
Date: '$Date: 2006-05-19 21:04:09 +0200 (ven., 19 mai 2006) $';
LogPath: 'JVCL\run'
);
{$ENDIF UNITVERSIONING}
implementation
uses
SysUtils;
{$R JvLED.res}
const
cMaskLEDName = 'JvCustomLEDMASK';
cGreenLEDName = 'JvCustomLEDGREEN';
//=== { TJvCustomLED } =======================================================
constructor TJvCustomLED.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FImgPict := TBitmap.Create;
FImgMask := TBitmap.Create;
FImgMask.LoadFromResourceName(HInstance, cMaskLEDName);
FTimer := TTimer.Create(Self);
FTimer.Enabled := False;
FTimer.OnTimer := DoBlink;
FTimer.Interval := 1000;
Color := clLime;
Width := 17;
Height := 17;
ColorOn := clLime;
ColorOff := clRed;
Active := False;
Status := True;
{$IFDEF VisualCLX}
FAutoSize := True;
{$ENDIF VisualCLX}
end;
destructor TJvCustomLED.Destroy;
begin
FTimer.Enabled := False;
FTimer.OnTimer := nil;
FImgPict.Free;
FImgMask.Free;
inherited Destroy;
end;
procedure TJvCustomLED.Paint;
var
DestRect, SrcRect: TRect;
begin
if csDesigning in ComponentState then
begin
Canvas.Pen.Style := psDash;
Canvas.Brush.Style := bsClear;
Canvas.Rectangle(ClientRect);
end;
SrcRect := Rect(0, 0, FImgPict.Width, FImgPict.Height);
{$IFDEF VCL}
DestRect := SrcRect;
{$ENDIF VCL}
{$IFDEF VisualCLX}
DestRect := Bounds(Left, Top, Width, Height);
{$ENDIF VisualCLX}
OffsetRect(DestRect, (ClientWidth - FImgPict.Width) div 2, (ClientHeight - FImgPict.Height) div 2);
Canvas.CopyMode := cmSrcAnd;
with Canvas do
begin
CopyRect({$IFDEF VisualCLX} Canvas, {$ENDIF} DestRect, FImgMask.Canvas, SrcRect);
CopyMode := cmSrcPaint;
CopyRect({$IFDEF VisualCLX} Canvas, {$ENDIF} DestRect, FImgPict.Canvas, SrcRect);
end;
end;
procedure TJvCustomLED.SetColorOn(Value: TColor);
begin
FColorOn := Value;
if Status then
Color := Value;
end;
procedure TJvCustomLED.SetColorOff(Value: TColor);
begin
FColorOff := Value;
if not Status then
Color := Value;
end;
function TJvCustomLED.GetInterval: Cardinal;
begin
Result := FTimer.Interval;
end;
procedure TJvCustomLED.SetInterval(Value: Cardinal);
begin
if Value <> FTimer.Interval then
FTimer.Interval := Value;
end;
function TJvCustomLED.GetActive: Boolean;
begin
Result := FActive;
end;
procedure TJvCustomLED.SetActive(Value: Boolean);
begin
FActive := Value;
if not (csDesigning in ComponentState) then
FTimer.Enabled := Value;
end;
procedure TJvCustomLED.SetStatus(Value: Boolean);
begin
FStatus := Value;
if Status then
Color := ColorOn
else
Color := ColorOff;
if Assigned(FOnChange) then
FOnChange(Self);
{$IFDEF VisualCLX}
WakeUpGUIThread;
{$ENDIF VisualCLX}
end;
function TJvCustomLED.GetStatus: Boolean;
begin
Result := FStatus;
end;
procedure TJvCustomLED.DoBlink(Sender: TObject);
begin
{$IFDEF VCL}
if not IsIconic(Application.Handle) then
{$ENDIF VCL}
Status := not Status;
end;
procedure TJvCustomLED.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
{$IFDEF COMPILER6_UP}
if AutoSize and (Align in [alNone, alCustom]) then
{$ELSE}
if AutoSize and (Align = alNone) then
{$ENDIF COMPILER6_UP}
inherited SetBounds(ALeft, ATop, FImgPict.Width, FImgPict.Height)
else
inherited SetBounds(ALeft, ATop, AWidth, AHeight);
end;
{$IFDEF VisualCLX}
procedure TJvCustomLED.SetAutoSize(Value: Boolean);
begin
if Value <> FAutoSize then
begin
FAutoSize := Value;
if FAutoSize then
SetBounds(Left, Top, Width, Height);
end;
end;
{$ENDIF VisualCLX}
procedure TJvCustomLED.ColorChanged;
var
X, Y: Integer;
begin
inherited ColorChanged;
{ Work around a TBitmap.ReadDIB() bug where FreeContext() is not called. This
missing call leads to a GDI-Handle leak when the application is minimized
because then FreeBitmapContexts() is not called. }
FImgPict.Assign(nil);
FImgPict.LoadFromResourceName(HInstance, cGreenLEDName);
FImgPict.PixelFormat := pf24bit;
for X := 0 to FImgPict.Width - 1 do
for Y := 0 to FImgPict.Height - 1 do
if FImgPict.Canvas.Pixels[X, Y] = clLime then
FImgPict.Canvas.Pixels[X, Y] := Color;
Repaint;
end;
{$IFDEF UNITVERSIONING}
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.