![]() |
|
|
#1
|
|||
|
|||
|
Добрый день! У меня есть вопрос: я написал пару процедур для работы с таймером, но они работают некорректно.
Вот написанный код: Код:
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
|
||||
|
||||
|
Цикл for автоматически инкрементирует i
|
| Этот пользователь сказал Спасибо Nikitiy_II за это полезное сообщение: | ||
yncoktdu (17.07.2018)
| ||
|
#3
|
|||
|
|||
|
Но ведь цикл инкрементирует после вызова myproc. Или нет?
Похоже что нет. Добавил еще одну переменную - помогло. Последний раз редактировалось yncoktdu, 12.07.2018 в 13:36. |
|
#4
|
||||
|
||||
|
Цитата:
|
|
#5
|
|||
|
|||
|
Я немного переделал код, так чтобы не было циклов, а срабатывало по нажатию кнопки.
Код:
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
|
||||
|
||||
|
Тогда вот так наращивание массива должно быть
Код:
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
|
|||
|
|||
|
Объясните, пожалуйста, как работает эта строка:
Код:
(Sender as TTimer) Что она вызывает? Или где почитать об этом. В учебниках по Delphi я такого не видел. |
|
#8
|
||||
|
||||
|
Да всё просто - Sender это инициатор вызова обработчика, хоть процедура и одна на всех, вызывает её конкретный сработавший таймер и его искать не нужно, он и так уже показался, раз процедура в работе, а явное указание класса через as TTimer). даёт доступ к свойствам и методам данного экземпляра из самого тела обработчика
|
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
yncoktdu (17.07.2018)
| ||