⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isevensegmentclocksmpte.pas

📁 iocopm3.04源码,一套很好的工控开发工具
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{*******************************************************}
{                                                       }
{       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 + -