![]()  | 
	
 
  | 
| 
	 | 
| 
		 
			 
			#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)
  | ||