Мне нужен Таймер в 'никакой форме' единица 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 никогда не выполняется. Я буду действительно ценить любые идеи относительно почему :-)
Помимо того факта, что вы создали 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.
Используется ли ваше устройство другими подразделениями или нет? Если этот модуль не используется другими, он даже не попадет в раздел инициализации. Или, может быть, модуль будет доработан раньше, чем вы думаете.
Установите точку останова в MyTimer: = TMyTimer.Create (nil); и в строке FreeAndNil (MyTimer) и запустите ваше приложение. Убедитесь, что таймер создан, когда вы хотите, и не уничтожен слишком рано.
Чтобы таймер работал, ваша программа должна обрабатывать сообщения . В программе с графическим интерфейсом эта часть выполняется автоматически; это обеспечивает класс 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
гарантирует, что они попадают туда.