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

 



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.07.2018, 12:41
yncoktdu yncoktdu вне форума
Прохожий
 
Регистрация: 12.07.2018
Сообщения: 4
Версия Delphi: Delphi 10.2
Репутация: 10
Вопрос TTimer

Добрый день! У меня есть вопрос: я написал пару процедур для работы с таймером, но они работают некорректно.

Вот написанный код:

Код:
var
  Form1: TForm1;
  x: array of TTimer;
  len, i: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin
  len:=0;
  setlength(x, len+1);
  for i:=0 to len do begin
    x[i] := TTimer.Create(self);
    x[i].Interval := 10000;
    x[i].Enabled := true;
    x[i].OnTimer := myproc;
    showmessage('Intermediate' + inttostr(i));
  end;
end;

procedure TForm1.myproc(Sender: TObject);
begin

x[i].Enabled:= False;
showmessage('My proc' + inttostr(i));

end;

В процедуре myproc значение переменной i равно 1, хотя должно быть равно 0, как и в вызывающей ее процедуре. Почему? Где ошибка?
Ответить с цитированием
  #2  
Старый 12.07.2018, 13:05
Аватар для Nikitiy_II
Nikitiy_II Nikitiy_II вне форума
Новичок
 
Регистрация: 01.05.2008
Сообщения: 52
Репутация: 11
По умолчанию

Цикл for автоматически инкрементирует i
Ответить с цитированием
Этот пользователь сказал Спасибо Nikitiy_II за это полезное сообщение:
yncoktdu (17.07.2018)
  #3  
Старый 12.07.2018, 13:23
yncoktdu yncoktdu вне форума
Прохожий
 
Регистрация: 12.07.2018
Сообщения: 4
Версия Delphi: Delphi 10.2
Репутация: 10
По умолчанию

Но ведь цикл инкрементирует после вызова myproc. Или нет?

Похоже что нет. Добавил еще одну переменную - помогло.

Последний раз редактировалось yncoktdu, 12.07.2018 в 13:36.
Ответить с цитированием
  #4  
Старый 12.07.2018, 19:20
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,026
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от yncoktdu
Но ведь цикл инкрементирует после вызова myproc...
myproc вызывается срабатыванием таймера, а этот процесс от цикла не зависит, - на какой итерации эта процедура отбилась, то значение i и будет обработано
Ответить с цитированием
  #5  
Старый 13.07.2018, 09:44
yncoktdu yncoktdu вне форума
Прохожий
 
Регистрация: 12.07.2018
Сообщения: 4
Версия Delphi: Delphi 10.2
Репутация: 10
По умолчанию

Я немного переделал код, так чтобы не было циклов, а срабатывало по нажатию кнопки.

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin

  setlength(x, 10);

    x[i] := TTimer.Create(self);
    x[i].Interval := 10000;
    x[i].Enabled := True;
    x[i].OnTimer := myproc;
    jz:= i;
    showmessage('length' + ' ' + inttostr(jz));

    i:= i+1;
end;


procedure TForm1.myproc(Sender: TObject);
begin

x[jz].Enabled:= False;
showmessage('My proc' + inttostr(jz));

end;

Но я никак не пойму как сделать так, чтобы при каждом нажатии кнопки Button1 добавлялся новый таймер, который бы срабатывал при наступлении заданного времени и отключался.
Ответить с цитированием
  #6  
Старый 13.07.2018, 12:01
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,026
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Тогда вот так наращивание массива должно быть
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 SetLength(x, i+1);

 x[i]:= TTimer.Create(Self);
 x[i].Interval:= 10000;
 x[i].Enabled:= true;
 x[i].OnTimer:= myproc;

 Inc(i);
end;
а обработчик возможен такой
Код:
procedure TForm1.myproc(Sender: TObject);
begin
(Sender as TTimer).Enabled:= false;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
yncoktdu (13.07.2018)
  #7  
Старый 14.07.2018, 06:22
yncoktdu yncoktdu вне форума
Прохожий
 
Регистрация: 12.07.2018
Сообщения: 4
Версия Delphi: Delphi 10.2
Репутация: 10
По умолчанию

Объясните, пожалуйста, как работает эта строка:

Код:
(Sender as TTimer)

Что она вызывает? Или где почитать об этом. В учебниках по Delphi я такого не видел.
Ответить с цитированием
  #8  
Старый 14.07.2018, 06:45
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,026
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Да всё просто - Sender это инициатор вызова обработчика, хоть процедура и одна на всех, вызывает её конкретный сработавший таймер и его искать не нужно, он и так уже показался, раз процедура в работе, а явное указание класса через as TTimer). даёт доступ к свойствам и методам данного экземпляра из самого тела обработчика
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
yncoktdu (17.07.2018)
Ответ



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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2018

ВКонтакте   Facebook   Twitter