📄 jvblinkingled.pas
字号:
{-----------------------------------------------------------------------------
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@t-online.de)
peter3
(load new image only when needed, center image in control, draw border at designtime,
renamed "Blinking" property to "Active", reimplemented using a thread isto timer,
Active is false by default, default interval is 1000, if interval is < 1, thread is not activated)
Peter Korf (created JvBlinkingLED from JvTransLED)
Last Modified: 2003-10-28
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:
-----------------------------------------------------------------------------}
{$I jvcl.inc}
unit JvBlinkingLED;
interface
uses
SysUtils, Classes,
{$IFDEF VCL}
Windows, Controls, Graphics, ExtCtrls,
{$ENDIF}
{$IFDEF VisualCLX}
QControls, QGraphics, QExtCtrls,
{$ENDIF}
JvComponent, JvTransLED;
type
TJvBlinkingLED = class(TJvTransLED)
private
FThread: TThread;
FColorOn: TColor;
FColorOff: TColor;
FStatus: Boolean;
FOnChange: TNotifyEvent;
FInterval: Cardinal;
procedure SetColorOn(Value: TColor);
procedure SetColorOff(Value: TColor);
procedure SetInterval(Value: Cardinal);
procedure SetActive(Value: Boolean);
function GetActive: Boolean;
procedure SetStatus(Value: Boolean);
function GetStatus: Boolean;
procedure DoBlink(Sender: Tobject; BlinkOn: boolean);
protected
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{$IFDEF VCL}
property DragCursor;
property DragKind;
property OnStartDock;
property OnEndDock;
{$ENDIF}
property Align;
property Anchors;
property AutoSize;
property ColorOn: TColor read FColorOn write SetColorOn default clLime;
property ColorOff: TColor read FColorOff write SetColorOff default clRed;
property Status: Boolean read GetStatus write SetStatus default True;
property Interval: Cardinal read FInterval write SetInterval default 1000;
property Active: Boolean read GetActive write SetActive default false;
property Constraints;
property DragMode;
property Height default 17;
property ParentShowHint;
property PopupMenu;
property ShowHint;
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;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
implementation
type
TBlinkEvent = procedure(Sender: TObject; BlinkOn: boolean) of object;
TBlinkThread = class(TThread)
private
FOnBlink: TBlinkEvent;
FBlinkOn: boolean;
FInterval: Cardinal;
procedure DoBlink;
public
constructor Create(Interval: Cardinal);
procedure Execute; override;
property Interval: Cardinal read FInterval;
property OnBlink: TBlinkEvent read FOnBlink write FOnBlink;
end;
constructor TJvBlinkingLED.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FInterval := 1000;
ColorOn := clLime;
ColorOff := clRed;
Active := false;
Status := True;
end;
destructor TJvBlinkingLED.Destroy;
begin
if FThread <> nil then
FThread.Terminate;
FreeAndNil(FThread);
inherited Destroy;
end;
procedure TJvBlinkingLED.SetColorOn(Value: TColor);
begin
FColorOn := Value;
Color := Value;
end;
procedure TJvBlinkingLED.SetColorOff(Value: TColor);
begin
FColorOff := Value;
Color := Value;
end;
procedure TJvBlinkingLED.SetInterval(Value: Cardinal);
begin
if Value <> FInterval then
begin
FInterval := Value;
if FThread <> nil then
begin
FreeAndNil(FThread);
FThread := TBlinkThread.Create(FInterval);
TBlinkThread(FThread).OnBlink := DoBlink;
if FInterval > 0 then
FThread.Resume;
end;
end;
end;
procedure TJvBlinkingLED.SetActive(Value: Boolean);
begin
if Value then
begin
if (FThread = nil) then
FThread := TBlinkThread.Create(Interval);
TBlinkThread(FThread).OnBlink := DoBlink;
if Interval > 0 then
FThread.Resume;
end
else if FThread <> nil then
FThread.Suspend;
end;
function TJvBlinkingLED.GetActive: Boolean;
begin
Result := (FThread <> nil) and (FInterval > 0) and not FThread.Suspended;
end;
procedure TJvBlinkingLED.SetStatus(Value: Boolean);
begin
FStatus := Value;
if Status then
Color := ColorOn
else
Color := ColorOff;
if Assigned(FOnChange) then FOnChange(Self);
end;
function TJvBlinkingLED.GetStatus: Boolean;
begin
Result := FStatus;
end;
{ TBlinkThread }
constructor TBlinkThread.Create(Interval: Cardinal);
begin
inherited Create(true);
FInterval := Interval;
end;
procedure TBlinkThread.DoBlink;
begin
if Assigned(FOnBlink) then FOnBlink(self, FBlinkOn);
FBlinkOn := not FBlinkOn;
end;
procedure TBlinkThread.Execute;
begin
FBlinkOn := false;
while not Terminated and not Suspended do
begin
Synchronize(DoBlink);
sleep(FInterval);
end;
end;
procedure TJvBlinkingLED.DoBlink(Sender: Tobject; BlinkOn: boolean);
begin
Status := BlinkOn;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -