Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.04.2009, 13:03
zCHIP zCHIP вне форума
Прохожий
 
Регистрация: 22.04.2009
Сообщения: 2
Репутация: 10
По умолчанию Хитрый таймер

Всех приветствую!
Встала задача - создать нужное количество таймеров во время запуска программы (количество заранее неизвестно и считывается из файла конфигурации). У каждого таймера должна быть своя процедура OnTimer

Пробовал сделать таким образом

Код:
...
var
...
  TimerPool : array of TTimer;
...

  TimerPool[1] := TTimer.Create(Self);
  TimerPool[1].OnTimer := ....
...

только остается непонятным - каким образом прицепить к каждому таймеру в массиве свой OnTimer. Также в каждый OnTimer нужно передать свои параметры - 3 строковых значения. Может кто сталкивался с нечто подобным и поможет советом?
Ответить с цитированием
  #2  
Старый 22.04.2009, 14:26
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Если кол-во таймеров неизвестно, то придется писать одну процедуру OnTimer, кот. будет менять свое поведение в зависимости от того, какой таймер ее вызвал.
Код:
var
  TimerPool : array of TTimer;

procedure TForm1.TimerProc(Sender: TObject);
begin
  case (Sender as TTimer).Tag of
    0: Label1.Caption:= 'работает 1 таймер';
    1: Label2.Caption:= 'работает 2 таймер';
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetLength(TimerPool, 2);
  TimerPool[0]:= TTimer.Create(Self);
  TimerPool[1]:= TTimer.Create(Self);
  TimerPool[0].Tag:= 0;
  TimerPool[1].Tag:= 1;
  TimerPool[0].OnTimer:= TimerProc;
  TimerPool[1].OnTimer:= TimerProc;
end;
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием
  #3  
Старый 22.04.2009, 14:27
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А и ненадо для каждого таймера цеплять уникальный обработчик, Вы в обработчике лучше обработайте Sendera.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 22.04.2009, 14:29
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А нафик таг использовать? Можно-же сразу каждому таймеру при создании задать имя уникальное.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 22.04.2009, 14:35
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Цитата:
Сообщение от Страдалецъ
А нафик таг использовать? Можно-же сразу каждому таймеру при создании задать имя уникальное.
можно, но мне удобнее работать с Integer, легче различить таймеры будет...
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием
  #6  
Старый 22.04.2009, 15:02
zCHIP zCHIP вне форума
Прохожий
 
Регистрация: 22.04.2009
Сообщения: 2
Репутация: 10
По умолчанию

Цитата:
Сообщение от Karsh
Если кол-во таймеров неизвестно, то придется писать одну процедуру OnTimer, кот. будет менять свое поведение в зависимости от того, какой таймер ее вызвал.
Код:
var
  TimerPool : array of TTimer;

procedure TForm1.TimerProc(Sender: TObject);
begin
  case (Sender as TTimer).Tag of
    0: Label1.Caption:= 'работает 1 таймер';
    1: Label2.Caption:= 'работает 2 таймер';
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetLength(TimerPool, 2);
  TimerPool[0]:= TTimer.Create(Self);
  TimerPool[1]:= TTimer.Create(Self);
  TimerPool[0].Tag:= 0;
  TimerPool[1].Tag:= 1;
  TimerPool[0].OnTimer:= TimerProc;
  TimerPool[1].OnTimer:= TimerProc;
end;

Спасибо, очень помогло разобраться.
Ответить с цитированием
  #7  
Старый 14.12.2009, 15:58
Abrakadabra Abrakadabra вне форума
Прохожий
 
Регистрация: 14.12.2009
Сообщения: 3
Репутация: 10
По умолчанию

А что делать, если необходимо что бы несколько динамически созданных таймеров работали одновременно?
Ответить с цитированием
  #8  
Старый 14.12.2009, 16:05
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Запустить их.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 14.12.2009, 16:41
Abrakadabra Abrakadabra вне форума
Прохожий
 
Регистрация: 14.12.2009
Сообщения: 3
Репутация: 10
По умолчанию

Может я не правильно вопрос задал..
В общем например такой код

Код:
var
  Form2: TForm2;
  MyTimer: array[0..2] of TTimer;
  Second1,Second2:integer;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
MyTimer[0]:=TTimer.Create(Self);
MyTimer[1]:=TTimer.Create(Self);
MyTimer[0].OnTimer:=StartTimer;
MyTimer[1].OnTimer:=StartTimer;
MyTimer[0].Tag:=0;
MyTimer[1].Tag:=1;
MyTimer[0].Interval:=1000;
MyTimer[1].Interval:=1000;
MyTimer[0].Enabled:=True;
MyTimer[1].Enabled:=True;

end;

procedure TForm2.FormCreate(Sender: TObject);
begin
Second1:=0;
Second2:=0;
end;

procedure TForm2.StartTimer(Sender: TObject);
begin
case (Sender as TTimer).Tag of
    0:  begin
        Second1:=Second1+1;
        Label1.Caption:=IntToStr(Second1)
        end;
    1:  begin
        Second2:=Second2+1;
        Label2.Caption:=IntToStr(Second2)
        end;
end;

end;

Получается так что, только в label1 идет отсчет времени.. Что не так?
Ответить с цитированием
  #10  
Старый 14.12.2009, 16:43
Abrakadabra Abrakadabra вне форума
Прохожий
 
Регистрация: 14.12.2009
Сообщения: 3
Репутация: 10
По умолчанию

Извините, все работает моя ошибка в коде
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:59.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter