📄 isevensegmentclocksmpte.pas
字号:
{*******************************************************}
{ }
{ TiSevenSegmentClockSMPTE Component }
{ }
{ Copyright (c) 1997,2003 Iocomp Software }
{ }
{*******************************************************}
{$I iInclude.inc}
{$ifdef iVCL}unit iSevenSegmentClockSMPTE;{$endif}
{$ifdef iCLX}unit QiSevenSegmentClockSMPTE;{$endif}
interface
uses
{$I iIncludeUses.inc}
{$IFDEF iVCL} iTypes, iGPFunctions, iMath, iSevenSegmentCharacter, iSevenSegmentDisplay;{$ENDIF}
{$IFDEF iCLX}QiTypes, QiGPFunctions, QiMath, QiSevenSegmentCharacter, QiSevenSegmentDisplay;{$ENDIF}
type
TiFrameStyle = (ifsDropFrame, ifsNonDropFrame);
TiSevenSegmentClockSMPTE = class(TiSevenSegmentDisplay)
private
FTime : Double;
FHourStyle : TiClockHourStyle;
FShowFrameNumber : Boolean;
FShowFieldNumber : Boolean;
FFrameNumber : Integer;
FFieldNumber : Integer;
FFrameStyle : TiFrameStyle;
procedure SetTime (const Value: Double);
procedure SetHourStyle (const Value: TiClockHourStyle);
procedure SetShowFrameNumber(const Value: Boolean);
procedure SetShowFieldNumber(const Value: Boolean);
procedure SetFrameNumber (const Value: Integer);
procedure SetFieldNumber (const Value: Integer);
procedure SetFrameStyle (const Value: TiFrameStyle);
procedure SetHours (const Value: Integer);
procedure SetMinutes (const Value: Integer);
procedure SetSeconds (const Value: Integer);
function GetHours : Integer;
function GetMinutes : Integer;
function GetSeconds : Integer;
protected
procedure iPaintTo(Canvas: TCanvas); override;
function GetAutoSize : TPoint; override;
procedure DoChange;
public
constructor Create(AOwner: TComponent); override;
procedure SetTimeNoEvent(const Value: Double);
published
property Time : Double read FTime write SetTime;
property FrameNumber : Integer read FFrameNumber write SetFrameNumber default 0;
property FieldNumber : Integer read FFieldNumber write SetFieldNumber default 0;
property FrameStyle : TiFrameStyle read FFrameStyle write SetFrameStyle default ifsDropFrame;
property ShowFrameNumber : Boolean read FShowFrameNumber write SetShowFrameNumber default True;
property ShowFieldNumber : Boolean read FShowFieldnumber write SetShowFieldNumber default True;
property HourStyle : TiClockHourStyle read FHourStyle write SetHourStyle default ichs24;
property Hours : Integer read GetHours write SetHours default 0;
property Minutes : Integer read GetMinutes write SetMinutes default 0;
property Seconds : Integer read GetSeconds write SetSeconds default 0;
end;
implementation
//****************************************************************************************************************************************************
constructor TiSevenSegmentClockSMPTE.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FShowFrameNumber := True;
FShowFieldNumber := True;
DoAutoSize;
end;
//****************************************************************************************************************************************************
procedure TiSevenSegmentClockSMPTE.DoChange;
begin
if Assigned(OnChangeProtected) then OnChangeProtected(Self, 'Time');
if Assigned(OnValueChange) then OnValueChange(Self);
end;
//****************************************************************************************************************************************************
function TiSevenSegmentClockSMPTE.GetAutoSize: TPoint;
var
TotalWidth : Integer;
begin
TotalWidth := 2*SegmentMargin - DigitSpacing;
SevenSegmentCharacter.Character := '0';
TotalWidth := TotalWidth + (SevenSegmentCharacter.GetCharacterWidth + DigitSpacing) * 2;
SevenSegmentCharacter.Character := '0';
TotalWidth := TotalWidth + (SevenSegmentCharacter.GetCharacterWidth + DigitSpacing) * 2;
SevenSegmentCharacter.Character := ':';
TotalWidth := TotalWidth + (SevenSegmentCharacter.GetCharacterWidth + DigitSpacing);
SevenSegmentCharacter.Character := '0';
TotalWidth := TotalWidth + (SevenSegmentCharacter.GetCharacterWidth + DigitSpacing) * 2;
SevenSegmentCharacter.Character := ':';
TotalWidth := TotalWidth + (SevenSegmentCharacter.GetCharacterWidth + DigitSpacing);
if FShowFrameNumber then
begin
SevenSegmentCharacter.Character := '0';
TotalWidth := TotalWidth + (SevenSegmentCharacter.GetCharacterWidth + DigitSpacing) * 2;
SevenSegmentCharacter.Character := ':';
TotalWidth := TotalWidth + (SevenSegmentCharacter.GetCharacterWidth + DigitSpacing);
end;
if FShowFieldNumber then
begin
SevenSegmentCharacter.Character := '0';
TotalWidth := TotalWidth + (SevenSegmentCharacter.GetCharacterWidth + DigitSpacing) * 2;
SevenSegmentCharacter.Character := '.';
TotalWidth := TotalWidth + (SevenSegmentCharacter.GetCharacterWidth + DigitSpacing);
end;
Result.X := TotalWidth;
Result.Y := SevenSegmentCharacter.GetCharacterHeight + 2*SegmentMargin;
end;
//****************************************************************************************************************************************************
procedure TiSevenSegmentClockSMPTE.SetTimeNoEvent(const Value: Double);
var
TempOnValueChange : TNotifyEvent;
begin
TempOnValueChange := OnValueChange;
OnValueChange := nil;
try
SetTime(Value);
finally
OnValueChange := TempOnValueChange;
end;
end;
//****************************************************************************************************************************************************
procedure TiSevenSegmentClockSMPTE.SetTime(const Value: Double);
var
CanEdit : Boolean;
begin
if FTime <> Value then
begin
CanEdit := True;
if Assigned(OnRequestEditProtected) then OnRequestEditProtected(Self, 'Time', CanEdit);
if CanEdit then
begin
FTime := Value;
InvalidateChange;
DoChange;
end;
end;
end;
//****************************************************************************************************************************************************
procedure TiSevenSegmentClockSMPTE.SetHours(const Value: Integer);
var
Hour : Word;
Min : Word;
Sec : Word;
MSec : Word;
begin
if (Value < 0) or (Value > 23) then raise Exception.Create('Hours must be in the range of 0-23');
DecodeTime(FTime, Hour, Min, Sec, MSec);
if Value <> Hour then
begin
FTime := EncodeTime(Value, Min, Sec, MSec);
InvalidateChange;
if Assigned(OnValueChange) then OnValueChange(Self)
end;
end;
//****************************************************************************************************************************************************
procedure TiSevenSegmentClockSMPTE.SetMinutes(const Value: Integer);
var
Hour : Word;
Min : Word;
Sec : Word;
MSec : Word;
begin
if (Value < 0) or (Value > 59) then raise Exception.Create('Minutes must be in the range of 0-59');
DecodeTime(FTime, Hour, Min, Sec, MSec);
if Value <> Min then
begin
FTime := EncodeTime(Hour, Value, Sec, MSec);
InvalidateChange;
if Assigned(OnValueChange) then OnValueChange(Self)
end;
end;
//****************************************************************************************************************************************************
procedure TiSevenSegmentClockSMPTE.SetSeconds(const Value: Integer);
var
Hour : Word;
Min : Word;
Sec : Word;
MSec : Word;
begin
if (Value < 0) or (Value > 59) then raise Exception.Create('Seconds must be in the range of 0-59');
DecodeTime(FTime, Hour, Min, Sec, MSec);
if Value <> Sec then
begin
FTime := EncodeTime(Hour, Min, Value, MSec);
InvalidateChange;
if Assigned(OnValueChange) then OnValueChange(Self)
end;
end;
//****************************************************************************************************************************************************
function TiSevenSegmentClockSMPTE.GetHours: Integer;
var
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -