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

📄 amclock.pas

📁 Delphi basic program. Basic programing guide for delphi language. Several samples are giving.
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{ TAMClock  for Delphi 7
  这是一个模拟时钟的小组件,主要通过它演示把组件打包的过程和代码
  下面使部分属性的说明

  TAMClock properties
    AutoCenter       : 缺省为default,把时钟自动至于画布中间
    Center           : 位置
    Interval         : Update interval (and interval of OnTimer-event)
    Interactive      : 缺省为false,为true的时候可以在运行时点击使之移动到中间
    Picture          : 设定时钟的图片
    Priority         : 设定时钟线程的优先级

  TAMClocl events
    OnTimer       : 每 X 微秒触发一次,就像 Delphi中的TTimer
}

unit AMClock;

interface

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

type
  TCmMouseEnter = record
    Msg    : Cardinal;
    Unused : Integer;
    Sender : TControl;             
    Result : LongInt;
  end;
  TCmMouseLeave = TCmMouseEnter;

  TMouseEnterLeave = procedure (Sender: TObject) of object;

  THour   = procedure (Sender: TObject; Hour: word) of object;
  TMinute = procedure (Sender: TObject; Minute: word) of object;
  TSecond = procedure (Sender: TObject; Second: word) of object;

  TAMClock = class;
  TThrdTimer = class;

  TTimerThread = class(TThread)
    OwnerTimer: TThrdTimer;
    procedure Execute; override;
  end;

  TThrdTimer = class(TComponent)
  private
    FEnabled: boolean;
    FInterval: word;
    FOnTimer: TNotifyEvent;
    FTimerThread: TTimerThread;
    FThreadPriority: TThreadPriority;

    procedure SetEnabled(Value: Boolean);
    procedure SetInterval(Value: word);
    procedure SetThreadPriority(Value: TThreadPriority);
    procedure Timer; dynamic;
  protected
    procedure UpdateTimer;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property TimerThread: TTimerThread read FTimerThread write FTimerThread;
  published
    property Enabled: boolean read FEnabled write SetEnabled default True;
    property Interval: word read FInterval write SetInterval default 250;
    property Priority: TThreadPriority read FThreadPriority write SetThreadPriority default tpNormal;
    property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
  end;

  TCenter = class(TPersistent)
  private
    FX: integer;
    FY: integer;
    FParent: TAMClock;

    procedure SetCenter(Index, Value: integer);
  protected
    procedure UpdateParent;
  public
    constructor Create;
    property Parent: TAMClock read FParent write FParent;
  published
    property X: integer index 0 read FX write SetCenter default 50;
    property Y: integer index 1 read FY write SetCenter default 50;
  end;

  THand = class(TPersistent)
  private
    FBackRadius: integer;
    FColor: TColor;
    FParent: TAMClock;
    FRadius: integer;
    FWidth: integer;

    procedure SetBackRadius(Value: integer);
    procedure SetColor(Value: TColor);
    procedure SetRadius(Value: integer);
    procedure SetWidth(Value: integer);
  protected
    procedure UpdateParent;  
  public
    constructor Create;
    property Parent: TAMClock read FParent write FParent;
  published
    property BackRadius: integer read FBackRadius write SetBackRadius default 10;
    property Color: TColor read FColor write SetColor default clRed;
    property Radius: integer read FRadius write SetRadius default 90;
    property Width: integer read FWidth write SetWidth default 2;
  end;

  TAMClock = class(TCustomControl)
  private
    FAutoCenter: boolean;
    FCenter: TCenter;
    FHoursHand: THand;
    FInteractive: boolean;
    FInterval: word;
    FMinutesHand: THand;
    FSecondsHand: THand;
//    FPicture: TPicture;
    FPriority: TThreadPriority;
    FTransparent: boolean;
    FTransparentColor: TColor;

    FHour: THour;
    FMinute: TMinute;
    FSecond: TSecond;
    FOnTimer: TNotifyEvent;
    FMouseEnter : TMouseEnterLeave;
    FMouseLeave : TMouseEnterLeave;

    Timer: TThrdTimer;
    Buffer: TBitmap;
    h,m,s: word;
    OldHour, OldMinute, OldSecond: word;

    procedure SetAutoCenter(Value: boolean);
    procedure SetInterval(Value: word);
    procedure SetPicture(Value: TPicture);
    function  GetPriority: TThreadPriority;
    procedure SetPriority(Value: TThreadPriority);
    procedure SetTransparent(Value: boolean);
    procedure SetTransparentColor(Value: TColor);
  protected
    procedure UpdateClock(Sender: TObject);
    procedure DrawHand(XCenter, YCenter, Radius, BackRadius, HandWidth: integer; HandColor: TColor; Angle: Real);
    procedure CmEnabledChanged(var Message: TWmNoParams); message CM_ENABLEDCHANGED;
    procedure CmMouseEnter(var Message: TCmMouseEnter); message CM_MOUSEENTER;
    procedure CmMouseLeave(var Message: TCmMouseLeave); message CM_MOUSELEAVE;
    procedure CmVisibleChanged(var Message: TWmNoParams); message CM_VISIBLECHANGED;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure Loaded; override;
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Canvas;
  published
    property AutoCenter: boolean read FAutoCenter write SetAutoCenter default True;
    property Center: TCenter read FCenter write FCenter;
    property Color;
    property DragCursor;
    property DragMode;
    property Enabled;
    property Hint;
    property HoursHand: THand read FHoursHand write FHoursHand;
    property Interval: word read FInterval write SetInterval default 250;
    property Interactive: boolean read FInteractive write FInteractive default False;
    property MinutesHand: THand read FMinutesHand write FMinutesHand;
    property ParentColor;
    property ParentShowHint;
//    property Picture: TPicture read FPicture write SetPicture;
    property PopupMenu;
    property Priority: TThreadPriority read GetPriority write SetPriority default tpNormal;
    property SecondsHand: THand read FSecondsHand write FSecondsHand;
    property ShowHint;
    property Transparent: boolean read FTransparent write SetTransparent default True;
    property TransparentColor: TColor read FTransparentColor write SetTransparentColor default clOlive;
    property Visible;
    property OnClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnHour: THour read FHour write FHour;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMinute: TMinute read FMinute write FMinute;
    property OnMouseDown;
    property OnMouseEnter : TMouseEnterLeave read FMouseEnter write FMouseEnter;
    property OnMouseLeave : TMouseEnterLeave read FMouseLeave write FMouseLeave;
    property OnMouseMove;
    property OnMouseUp;
    property OnSecond: TSecond read FSecond write FSecond;
    property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
    property OnStartDrag;
  end;

procedure Register;

implementation

{$R AMClock.res}

procedure TAMClock.UpdateClock(Sender: TObject);
var
  hsec: word;
begin
  DecodeTime(Time,h,m,s,hsec);
  Repaint;
  if s <> OldSecond then
  begin
    if Assigned(FSecond) then FSecond(Self, s);
    OldSecond := s;
  end;
  if m <> OldMinute then
  begin
    if Assigned(FMinute) then FMinute(Self, m);
    OldMinute := m;
  end;
  if h <> OldHour then
  begin
    if Assigned(FHour) then FHour(Self, h);
    OldHour := h;
  end;
  if Assigned(FOnTimer) then FOnTimer(Self);
end;

procedure TAMClock.Paint;
var
  Angle: real;
begin
  Buffer.Width := Self.Width;
  Buffer.Height := Self.Height;
  with Buffer.Canvas do
  begin
    Brush.Color := Self.Color;
    Brush.Style := bsSolid;
    Pen.Color := Self.Color;
    Rectangle(0,0,Width,Height);
    if FTransparent then
//       BrushCopy(ClientRect, FPicture.Bitmap, ClientRect, FTransparentColor)
    else
//       Draw(0,0,FPicture.Graphic);
  end;

  Angle := 2 * PI * (h + m / 60) / 12;
  DrawHand(100,100,HoursHand.Radius,HoursHand.BackRadius,HoursHand.Width,HoursHand.Color,Angle);
  Angle := 2 * PI * m / 60;
  DrawHand(100,100,MinutesHand.Radius,MinutesHand.BackRadius,MinutesHand.Width,MinutesHand.Color,Angle);
  Angle := 2 * PI * s / 60;
  DrawHand(100,100,SecondsHand.Radius,SecondsHand.BackRadius,SecondsHand.Width,SecondsHand.Color,Angle);

  Canvas.Draw(0,0,Buffer);
end;

procedure TAMClock.Loaded;
var
  HSec: word;
begin
  inherited Loaded;
  Buffer.Width := Self.ClientWidth;
  Buffer.Height := Self.ClientHeight;
  Buffer.Canvas.Brush.Color := Color;
  if AutoCenter then
  begin
    with Center do
    begin
      X := Width div 2;
      Y := Height div 2;
    end;
  end;
  DecodeTime(Now, OldHour, OldMinute, OldSecond, HSec);
end;

procedure TAMClock.SetAutoCenter(Value: boolean);
begin
  if Value <> FAutoCenter then
  begin
    if Value then
    begin
      with FCenter do
      begin
        X := Width div 2;
        Y := Height div 2;
      end;
    end;
    FAutoCenter := Value;
    Repaint;
  end;
end;

procedure TAMClock.SetInterval(Value: word);
begin
  if Value <> FInterval then
  begin
    FInterval := Value;
    Timer.Interval := FInterval;
    Repaint;
  end;
end;

procedure TAMClock.SetPicture(Value: TPicture);
begin
  if Transparent and not (Value.Graphic is TBitmap) then Transparent := False;
//  FPicture.Assign(value);
//  Width := FPicture.Width;
  Buffer.Width := Width;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -