Текущий архив: 2004.06.13;
Скачать: CL | DM;
ВнизМожно ли так делать ? Найти похожие ветки
← →
Ilya__ (2004-05-25 20:54) [0]Скажите мне можно ли так делать?
Я вставляю TTimer в поле TObject.
TMyObject = class
privat
FTimer: TTimer;
public
constructor Create;
destructor destroy; override;
end;
constructor Create;
begin
FTimer := TTimer.Create(nil);
end;
destructor Destroy;
begin
FTimer.Free;
end;
← →
Gero © (2004-05-25 20:56) [1]Можно.
← →
Rouse_ © (2004-05-25 21:08) [2]Когдато очень давно писал демку которую и раздавал в ответ на вопросы о таймере в компоненте.
Сейчас к моей большой радости таких вопросов нет... но на всякий случай лови, может быть пригодиться :)
DEMO 1:// Демонстрационный пример имплантирования таймера в компонент,
// вариант первый, в котором мы используем обычный TTimer
// Для наглядности приведен пример также генерирования события при сработке таймера
// Автор: Александр (Rouse_) Багель
unit Test1Label;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls, ExtCtrls;
type
TTest1Label = class(TLabel) // Наследуемся от лейбла, для примера
private
FTimer: TTimer; // Наш таймер
FOnTimer: TNotifyEvent; // Это новое событие для нашего лейбла
protected
// Это процедура которая будет выполнятся при срабатывании таймера
procedure MyOnTimer(Sender: TObject); dynamic;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
// Делаем чтобы событие было видно в инспекторе обьектов
property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents("Fangorn Wizards Lab", [TTest1Label]);
end;
{ TTest1Label }
constructor TTest1Label.Create(AOwner: TComponent);
begin
inherited;
FTimer := TTimer.Create(Self); // При создании компонента, создаем таймер
FTimer.OnTimer := MyOnTimer; // Указываем какую процедуру выполнять при сработке
end;
destructor TTest1Label.Destroy;
begin
FTimer.Free; // Не забываем удалить таймер
inherited;
end;
// Вот сама процедура
procedure TTest1Label.MyOnTimer(Sender: TObject);
begin
// Выводим в кэпшен текущее время
Caption := TimeToStr(Now);
// Генерируем событие OnTime нашего компонента
if Assigned(FOnTimer) then FOnTimer(Self);
end;
end.
DEMO 2:// Демонстрационный пример имплантирования таймера в компонент,
// вариант второй, в котором мы сами становимся таймером, не смотря на то что мы Лейбл :))
// Для наглядности приведен пример также генерирования события при сработке таймера
// Автор: Александр (Rouse_) Багель
unit Test2Label;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls;
type
TTest2Label = class(TLabel)// Наследуемся от лейбла, для примера
private
FWindowHandle: HWND; // Хэндл оконной процедуры
FOnTimer: TNotifyEvent; // Это новое событие для нашего лейбла
// Это процедура которая будет выполнятся при приходе сообщений
procedure WndProc(var Message: TMessage);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
// Делаем чтобы событие было видно в инспекторе обьектов
property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents("Fangorn Wizards Lab", [TTest2Label]);
end;
{ TTest2Label }
constructor TTest2Label.Create(AOwner: TComponent);
begin
inherited;
// Создаем оконную процедуру, которая будет ловить сообщения
FWindowHandle := Classes.AllocateHWnd(WndProc);
// Устанавливаем таймер на интервал в 1000 милисекунд
SetTimer(FWindowHandle, 1, 1000, nil);
end;
destructor TTest2Label.Destroy;
begin
// Удаляем таймер
KillTimer(FWindowHandle);
// Удаляем оконную процедуру
Classes.DeallocateHWnd(FWindowHandle);
inherited;
end;
// Вот сама процедура, которая срабатывает после прихода сообщений
procedure TTest2Label.WndProc(var Message: TMessage);
begin
// Если сообщение о сработке таймера
if Message.Msg = WM_TIMER then begin
// Выводим в кэпшен текущее время
Caption := TimeToStr(Now);
// Генерируем событие OnTime нашего компонента
if Assigned(FOnTimer) then FOnTimer(Self);
end;
end;
end.
---
Желаю успехов
Страницы: 1 вся ветка
Текущий архив: 2004.06.13;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.038 c