Delphi: случай OnTimer моего собственного Таймера никогда не происходит

Мне нужен Таймер в 'никакой форме' единица Delphi (существует все еще основная единица с формой), таким образом, я делаю это:

unit ...

interface

type
  TMyTimer = Class(TTimer)
  public
    procedure OnMyTimer(Sender: TObject);
  end;

var
  MyTimer: TMyTimer;

implementation

procedure TMyTimer.OnMyTimer(Sender: TObject);
begin
  ...
end;

initialization

MyTimer := TMyTimer.Create(nil);
with MyTimer do
begin
  Interval := 1000;
  Enabled := True;
  OnTimer := OnMyTimer;
end;

finalization

FreeAndNil(MyTimer);

Проблема состоит в том, что процедура OnMyTimer никогда не выполняется. Я буду действительно ценить любые идеи относительно почему :-)

7
задан Mikhail 14 April 2010 в 08:37
поделиться

3 ответа

Помимо того факта, что вы создали MyTimer и освободили MouseTimer , я не вижу ничего плохого в вашем коде (я предполагаю, что вы используете свой код в приложение с графическим интерфейсом пользователя или, по крайней мере, имеет цикл сообщений)

Этот пример кода работает с Delphi 5. Get Hello World get записывается в журнал событий каждую секунду.

unit Unit2;

interface

uses
  extctrls;

type
  TMyTimer = Class(TTimer)
  public
    procedure OnMyTimer(Sender: TObject);
  end;

var
  MyTimer: TMyTimer;

implementation

uses
  windows, sysutils, classes;

procedure TMyTimer.OnMyTimer(Sender: TObject);
begin
  OutputDebugString(PChar('Hello World'));
end;

initialization

MyTimer := TMyTimer.Create(nil);
with MyTimer do
begin
  Interval := 1000;
  Enabled := True;
  OnTimer := OnMyTimer;
end;

finalization
  FreeAndNil(MyTimer);

end.
6
ответ дан 6 December 2019 в 12:47
поделиться

Используется ли ваше устройство другими подразделениями или нет? Если этот модуль не используется другими, он даже не попадет в раздел инициализации. Или, может быть, модуль будет доработан раньше, чем вы думаете.

Установите точку останова в MyTimer: = TMyTimer.Create (nil); и в строке FreeAndNil (MyTimer) и запустите ваше приложение. Убедитесь, что таймер создан, когда вы хотите, и не уничтожен слишком рано.

1
ответ дан 6 December 2019 в 12:47
поделиться

Чтобы таймер работал, ваша программа должна обрабатывать сообщения . В программе с графическим интерфейсом эта часть выполняется автоматически; это обеспечивает класс TApplication . Но вы говорите, что у вас есть программа без формы, поэтому я полагаю, что вы, вероятно, не вызываете Application.Run в своем файле DPR.

Чтобы использовать таймер, вам нужно обрабатывать сообщения.Типичной отправной точкой для перекачки сообщений является следующий код:

while Integer(GetMessage(Msg, 0, 0, 0)) > 0 do begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
end;

По истечении периода таймера операционная система фактически помещает сообщение wm_Timer в очередь сообщений вашей программы. Вызов GetMessage извлекает сообщения из очереди, а DispatchMessage вызывает оконную процедуру окна назначения. TTimer создает для себя скрытое окно, которое служит целью для этих сообщений, а DispatchMessage гарантирует, что они попадают туда.

9
ответ дан 6 December 2019 в 12:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: