|
|
#1
|
|||
|
|||
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
|
||||
|
||||
Цикл 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)
|