Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2015, 16:20   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Динамически созданный таймер не может остановиться

Доброго времени суток!
Есть
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer := TTimer.Create(nil);
  Timer.Interval := 100;
  Timer.OnTimer := TimerProc;
  Timer.Enabled := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to 1 do
  begin
    Button1.OnClick(Self);
  end;
end;

procedure TForm1.TimerProc(Sender: TObject);
begin
  FreeAndNil(Timer);
  Inc(Q);
  Self.Caption := IntToStr(Q);
end;
При таком раскладе постоянно отрабатывает TimerProc. Почему таймер не "умирает"?
Shouldercannon вне форума Ответить с цитированием
Старый 08.08.2015, 17:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Боюсь, что освобождать объект из под его события не выйдет.
FreeAndNil у тебя скорее всего не отрабатывает, вот таймер и не уходит.
Рекомендую тебе заменить таймер на Thread внутри которой кинуть sleep() на нужный интервал. Это навскидку, не зная задачи. Могу и ошибаться.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.08.2015, 17:08   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Почему таймер не "умирает"?
потому что у тебя их 2 штуки.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 08.08.2015, 17:09   #4
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Наверно FreeAndNil один раз отрабатывает и крошит в мясо первый таймер, а вот второй таймер продолжает работать)) И для FreeAndNil он Nil)))
ДралсяСошибками вне форума Ответить с цитированием
Старый 08.08.2015, 17:28   #5
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Вариант
Код:
  if not Assigned(Timer) then
  begin
    Timer := TTimer.Create(nil);
    Timer.Interval := 100;
    Timer.OnTimer := TimerProc;
    Timer.Enabled := True;
  end;
Shouldercannon вне форума Ответить с цитированием
Старый 08.08.2015, 17:36   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Согласен. В цикле два таймера создаются, а убираешь ты только один.
Если бы FreeAndNil(Sender) написал, может быть и убился бы таймер твой... Хотя я сомневаюсь...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.08.2015, 17:39   #7
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

TList в нем можно сохранять адрес памяти занимаемым контролом и обращаетесь к ниму это для динамически созданных контролов. Ну и можно методрм перебора контролов Control.Count.

Легче работать с создаными контролами через статический массив контролов этот пример для простых решений, примерно так
Код:
var
Timer: [0..1] array of TTimer;

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i:= 0 to Length(Timer) -1 do
if Timer[i] = nil then
begin
  Timer[i]:= TTimer.Create(nil);
  Timer[i].Interval := 100;
  Timer[i].OnTimer := TimerProc;
  Timer[i].Name:= 'Timer' + Inttostr(i);
  Timer[i].Enabled := True;
end;
end;

procedure TForm1.TimerProc(Sender: TObject);
begin
if TTimer(Sender).Name = 'Timer0' then
что то сделать в событии этого Timer0
else
if TTimer(Sender).Name = 'Timer1' then
что то сделать в событии этого Timer1
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Button1Click(nil);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
for i:= 0 to Length(Timer) -1 do
  FreeAndNil(Timer[i]);
end;

Последний раз редактировалось Aliens_wolfs; 08.08.2015 в 18:28.
Aliens_wolfs вне форума Ответить с цитированием
Старый 08.08.2015, 17:49   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Легче работать с создаными контрооами через статический массив, примерно так
лучше, чем TObjectList или TObjectList<TTimer>, в данном случае быть не могёт.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 08.08.2015, 17:55   #9
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Об этом я и упоменул TList но там нужно правильно уметь работать. Я кстати через TList и делаю. А тот пример что я выше написал без заморочек для простых решений пойдет.

А вот пример через TList примерно так
Код:
var
Timer: TTimer;
ItemList: TList;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer:= TTimer.Create(nil);
  Timer.Interval := 100;
  Timer.OnTimer := TimerProc;
  Timer.Name:= 'Timer' + Inttostr(i);
  Timer.Enabled := True;
  ItemList.Add(Timer);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
ItemList:= TList.Create;
for i:= 0 to 1 do
Button1Click(nil);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
for i:= ItemList.count-1  downto 0 do
if TTimer(ItemList[i]) <> nil then
begin
  FreeAndNil(TTimer(ItemList[i]));
  ItemList.Delete(i);
end;
end;

Последний раз редактировалось Aliens_wolfs; 08.08.2015 в 19:20.
Aliens_wolfs вне форума Ответить с цитированием
Старый 08.08.2015, 18:05   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Я кстати через TList и делаю.
не надо так.
Цитата:
А этот пример что я написал без заморочек для простых решений пойдет.
а так - тем более!

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамически созданный TDBLookUpComboBox Scorpuha БД в Delphi 13 16.01.2014 19:59
Динамически созданный Control (PictureBox) itea4you.ru C# (си шарп) 4 27.10.2013 12:39
Обработчик на динамически созданный компонент lexo Общие вопросы Delphi 5 01.06.2013 20:27
Динамически созданный обьект, процедуры heart Общие вопросы Delphi 3 09.05.2009 17:32
Динамически созданный tabSheet S@fer Общие вопросы Delphi 7 08.04.2009 12:03