Консультация № 111333
28.11.2007, 08:56
0.00 руб.
0 1 1
Уважаемые экперты!
Помогите справиться с такой задачкой: есть 1-3 переменные (вернее индексированный массив p[N]), значения которых нужно изменять после некоторого интервала времени - независимо друг от друга (по какому-то событию, напр. нажатию Button1). Динамически создаю таймеры, но как сделать обработку OnTimer для конкретной N-й переменной? (Использовать N как входной параметр для procedure Timer не получилось. Пока получается срабатывание таймера в порядке, обратном нажатию клавиши Button1). Можно сделать статические 3 таймера - на каждую переменную, но они будут использоваться только 1 раз, поэтому хотелось сэкономить ресурсы.


Приложение:
unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Extctrls, StdCtrls;type TTmr=array [1..3] of TTimer; TL3=array [1..3] of TLabel; // только для теста TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); private { Private declarations } procedure Timer(Sender: TObject); public { Public declarations } Tr:TTmr; CL3:TL3; end;var Form1: TForm1; p:array [1..3] of byte; N:byte=0;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);begin if N<3 then begin inc(N); p[N]:=1; Form1.CL3[N].Caption:=‘On Button Click!‘+‘ p=‘+IntToStr(p[N]); Tr[N]:=TTimer.Create(Form1); Tr[N].Interval:=2000; Tr[N].OnTimer:=Timer; Tr[N].Enabled:=true; end;end;procedure TForm1.Timer(Sender: TObject);begin p[N]:=2; Form1.CL3[N].Caption:=‘On Timer Event!‘+‘ p=‘+IntToStr(p[N]); Tr[N].Enabled:=false; Tr[N].Destroy; dec(N);end;procedure TForm1.FormCreate(Sender: TObject);var i:byte; xleft, xtop:integer;begin xleft:=300; xtop:=20; for i:=1 to 3 do begin CL3[i]:=TLabel.Create(self); CL3[i].Parent:=Form1; CL3[i].Font.Size:=12; CL3[i].Font.Color:=clblue; CL3[i].Caption:=‘Create Label‘ + IntToStr(i); CL3[i].Left:=xleft; {200} CL3[i].Top:=xtop+(i-1)*20; CL3[i].Width:=50; p[i]:=0; end;end;procedure TForm1.FormShow(Sender: TObject);var i:byte;begin for i:=1 to 3 do begin CL3[i].Caption:=CL3[i].Caption+‘ p=‘+IntToStr(p[i]); end;end;end.

Обсуждение

Неизвестный
28.11.2007, 09:08
общий
это ответ
Здравствуйте, Ляудинскайте Юлианна!

В подобной ситуации я пользовался таким приёмом:
1 - в массиве был отдельный столбец (int) - им я задавал тот промежуток времени в сек, в течении которого эта строка не должна обрабатываться;
2 - на форму кидал Timer, назначал ему интервал 1000 (1 сек), и при событии OnTimer

for i=0 to n do
if p[i,‘№ моего столбца‘]>0 then p[i,‘№ моего столбца‘] := p[i,‘№ моего столбца‘] - 1;

3 - а уже в обработчике
if p[‘№ нужной строки‘,‘№ моего столбца‘]= 0 then ‘ моё событие ‘

Надеюсь смог объяснить свой алгоритм действий
Удачи!
Форма ответа