Delphi - TTimer的源码

技术交流,DH讲解.

我之前用一个线程实现了Timer的功能,现在我们来看看Delphi自带的Timer怎么实现的?
其实,不看代码也大致知道怎么的?
1 SetTimer 和 KillTimer 2个API来控制Timer的启动和关闭
2 响应WM_Timer消息执行用户事件.
由于Timer是一个不可视控件,应该从TComponent继承,但是TComponent不具备处理消息的能力,也就是我们需要手动创建窗体过程然后分配给它.
好说了这么多,看代码:

  TTimer = class(TComponent)
  private
    //间隔时间
    FInterval: Cardinal;
    //接收消息的句柄
    FWindowHandle: HWND;
    //用户事件
    FOnTimer: TNotifyEvent;
    FEnabled: Boolean;
    //当属性设置后,更新计时器
    //kill掉已有的,然后创建新的
    procedure UpdateTimer;
    //Setter
    procedure SetEnabled(Value: Boolean);
    procedure SetInterval(Value: Cardinal);
    procedure SetOnTimer(Value: TNotifyEvent);
    //窗体过程
    procedure WndProc(var Msg: TMessage);
  protected
    procedure Timer; dynamic;
{$IF DEFINED(CLR)}
  strict protected
    procedure Finalize; override;
{$IFEND}
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Enabled: Boolean read FEnabled write SetEnabled default True;
    property Interval: Cardinal read FInterval write SetInterval default 1000;
    property OnTimer: TNotifyEvent read FOnTimer write SetOnTimer;
  end;
我们就看关键的方法UpdateTimer和WndProc窗体过程.
procedure TTimer.UpdateTimer;
begin
  if FWindowHandle <> 0 then
    KillTimer(FWindowHandle, 1);

  if (FInterval <> 0) and FEnabled and Assigned(FOnTimer) then
  begin
    if FWindowHandle = 0 then    //分配句柄处理消息
      FWindowHandle := AllocateHWnd(WndProc);
    if SetTimer(FWindowHandle, 1, FInterval, nil) = 0 then
      raise EOutOfResources.Create(SNoTimers);
  end
  else
  if FWindowHandle <> 0 then
  begin
    DeallocateHWnd(FWindowHandle);  //取消句柄处理消息
    FWindowHandle := 0;
  end;
end;
窗体过程都干了什么呢?
procedure TTimer.WndProc(var Msg: TMessage);
begin
  with Msg do
    if Msg = WM_TIMER then
      try
        Timer;
      except
        Application.HandleException(Self);
      end
    else//其他消息,采用默认的windows处理方式
      Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;
这个有个timer方法,干什么的呢?对了,就是执行用户事件的.
procedure TTimer.Timer;
begin
  if Assigned(FOnTimer) then FOnTimer(Self);
end;

也很简单嘛,主要让大家看看控件怎么编写的.

我是DH

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`TTimer` 组件是 Delphi 中常用的定时器组件,可以实现定时器功能。使用 `TTimer` 组件可以很轻松地实现定时器的功能,以下是使用 `TTimer` 组件的步骤: 1. 打开 Delphi IDE,创建一个新的 VCL 应用程序项目。 2. 在菜单栏上找到 "Component" -> "System",在弹出的菜单中选择 "TTimer" 组件,将其拖放到主窗体上。 3. 双击 `TTimer` 组件,进入 `TTimer` 的属性编辑器界面。 4. 在属性编辑器界面中,设置 `Enabled` 属性为 `True`,设置 `Interval` 属性为定时器的时间间隔,单位为毫秒。例如,如果需要每隔 1 秒执行一次定时器事件,则将 `Interval` 属性设置为 1000。 5. 在主窗体上双击 `TTimer` 组件,进入 `OnTimer` 事件的处理函数。在这个事件处理函数中可以编写需要执行的代码。 例如,以下是一个简单的示例代码: ```delphi unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; Memo1: TMemo; procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); begin // 每隔 1 秒执行一次定时器事件 Memo1.Lines.Add(DateTimeToStr(Now)); end; end. ``` 在上面的代码中,每隔 1 秒钟 `Timer1` 组件就会触发一次 `OnTimer` 事件,输出当前的时间戳到 `Memo1` 组件中。 这样,我们就可以使用 `TTimer` 组件来实现 Delphi 中的定时器功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值