在Delphi控制台应用程序中使用VCL TTimer [英] Using VCL TTimer in Delphi console application

查看:355
本文介绍了在Delphi控制台应用程序中使用VCL TTimer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

正如问题主题所说。我在Delphi中有一个控制台应用程序,它包含一个 TTimer 变量。我想做的事情是为 TTimer.OnTimer 事件分配一个事件处理程序。我完全是新Delphi,我曾经使用C#和事件处理程序添加事件是完全不同的。我发现,一个不简单地分配一个过程到事件作为处理程序,你必须创建一个虚拟类与一个方法将作为处理程序,然后将该方法分配给事件。这里是我目前有的代码:

As the question subject says. I have a console application in Delp which contains a TTimer variable. The thing I want to do is assign an event handler to TTimer.OnTimer event. I am totally new to Delp I used to use C# and adding the event handlers to events is totally different. I have found out that one does not simply assign a procedure to event as a handler, you have to create a dummy class with a method which will be the handler, and then assign this method to the event. Here is the code I currently have:

program TimerTest;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  extctrls;

type
  TEventHandlers = class
    procedure OnTimerTick(Sender : TObject);
  end;

var
  Timer : TTimer;
  EventHandlers : TEventHandlers;


procedure TEventHandlers.OnTimerTick(Sender : TObject);
begin
  writeln('Hello from TimerTick event');
end;

var
  dummy:string;
begin
  EventHandlers := TEventHandlers.Create();
  Timer := TTimer.Create(nil);
  Timer.Enabled := false;
  Timer.Interval := 1000;
  Timer.OnTimer := EventHandlers.OnTimerTick;
  Timer.Enabled := true;
  readln(dummy);
end.

这对我来说似乎是正确的,但是由于某种原因它不工作。

It seems correct to me, but it does not work for some reason.

EDIT

看起来 TTimer 因为控制台应用程序没有消息循环。有没有办法在我的应用程序中创建计时器?

EDIT
It appears that the TTimer component won't work because console applications do not have the message loop. Is there a way to create a timer in my application?

推荐答案

您的代码不工作,因为 组件内部使用 WM_TIMER 消息处理,并且控制台应用程序没有消息循环。为了使你的代码工作,你应该自己创建一个消息泵循环:

Your code does not work because TTimer component internally uses WM_TIMER message processing and a console app does not have a message loop. To make your code work you should create a message pumping loop yourself:

program TimerTest;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows,
  extctrls;

type
  TEventHandlers = class
    procedure OnTimerTick(Sender : TObject);
  end;

var
  Timer : TTimer;
  EventHandlers : TEventHandlers;


procedure TEventHandlers.OnTimerTick(Sender : TObject);
begin
  writeln('Hello from TimerTick event');
end;

procedure MsgPump;
var
  Unicode: Boolean;
  Msg: TMsg;

begin
  while GetMessage(Msg, 0, 0, 0) do begin
    Unicode := (Msg.hwnd = 0) or IsWindowUnicode(Msg.hwnd);
    TranslateMessage(Msg);
    if Unicode then
      DispatchMessageW(Msg)
    else
      DispatchMessageA(Msg);
  end;
end;

begin
  EventHandlers := TEventHandlers.Create();
  Timer := TTimer.Create(nil);
  Timer.Enabled := false;
  Timer.Interval := 1000;
  Timer.OnTimer := EventHandlers.OnTimerTick;
  Timer.Enabled := true;
  MsgPump;
end.

这篇关于在Delphi控制台应用程序中使用VCL TTimer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆