动态创建的多个Timer为什么只有两个可以运行ontimer事件(50分)

  • 主题发起人 主题发起人 lliu
  • 开始时间 开始时间
L

lliu

Unregistered / Unconfirmed
GUEST, unregistred user!
我定义了如下变量:
index:array[1..10] of integer;
timerindex:array[1..10] of integer;
imagearray:array[1..10,1..20] of Timage;
formarray:array[1..20] of Tform;
imerarray:array[1..10] of Ttimer;
我在过程中动态创建Tform,Timage,Ttimer,我希望每个form对应一个timer,
然后在timer的ontimer事件中改变相应form中的image,程序如下:
procedure ch(i:interger,...);
begin
formarray[i-1]:=Tform.create(self);
formarray[i-1].caption:=str;
formarray[i-1].show;
imagearray[i-1,1]:=Timage.create(self);
imagearray[i-1,1].parent:=formarray[i-1];
imagearray[i-1,1].picture:=Tpicture.create;
imagearray[i-1,1].picture.loadfromfile('c:/my documents/cellv0.bmp');
timerarray[i-1]:=Ttimer.create(timer1);
timerarray[i-1].interval:=100;
timerarray[i-1].ontimer:=mytimerontime;
timerarray[i-1].enabled:=true;
end;
其中mytimerontime定义如下:
procedure Tpagesdlg2.mytimerontime(sender:Tobject);
begin
if timerindex[i-1]=0 then
begin
if assigned(imagearray[i-1,1])then
begin
imagearray[i-1,1].picture.loadfromfile('c:/my documents/cellv0.bmp');
timerindex[i-1]:=(timerindex[i-1]+1) mod 4;
end;
end
else if timerindex[i-1]=1 then
begin
if assigned(imagearray[i-1,1]) then
begin
...
end;
end
else if timerindex[i-1]=2 then
begin
if assigned(imagearray[i-1,1]) then
begin
...
end;
end
else if timerindex[i-1]=3 then
begin
if assigned(imagearray[i-1,1]) then
begin
imagearray[i-1,1].picture.loadfromfile('c:/my documents/cellv3.bmp');
timerindex[i-1]:=(timerindex[i-1]+1) mod 4;
end;
end;
end;
我想请问:为什么我的程序运行后只有前面创建的两个form的图形发生该变,而
第三.四...等以后的就根本没反应。好象timerarray[3],timerarray[4]...不存在!
谢谢!


 
首先注意你的定义:
index:array[1..10] of integer;
timerindex:array[1..10] of integer;
imagearray:array[1..10,1..20] of Timage;
formarray:array[1..20] of Tform;
imerarray:array[1..10] of Ttimer;
是没有下标为0的元素的。
其次,把调用ch的代码也写出来吧。
 
把代码写完整一点吧!

你的i是全部变量吗? 为什么在
procedure Tpagesdlg2.mytimerontime(sender:Tobject);
里面没有看见定义?
 
i:不是全局变量;i是通过过程调用传递给它的;具体如下:
type
procedure ch(hujiaotable:Ttable;chaneltable:Ttable;timer2:Ttimer;
i:integer;panel4:Tpanel;combobox2:Tcombobox);
其中调用ch的过程如下:
procedure TPagesDlg2.Button1Click(Sender: TObject);
var
line,i,number,j,k:integer;
user_flag:boolean;
...
begin
button1.enabled:=false;
if (combobox1.text='') or (combobox2.text='') then
showmessage('没有选择呼叫类型或呼叫用户,请重新选择!')
else begin
pagesdlg2.Close;
user_flag:=false;
i:=1;
mainfrm.show;
hujiaotable.first;
if combobox1.text='单呼' then
begin
combobox3.enabled:=true;
while not hujiaotable.EOF do
if hujiaotable.fieldvalues['移动台号(ID)']=combobox2.text then
begin
user_flag:=true;
break;
end
else hujiaotable.Next;
chaneltable.first;
chaneltable.Next;
if user_flag then
begin
while not chaneltable.eof do
begin
if chaneltable.fieldvalues['信道忙']=False then
begin
......
j:=chaneltable.FieldValues['信道号'];
case j of
2:begin
ch(hujiaotable,chaneltable,timer2,2,mainfrm.panel4,combobox2);
break;
end;
3:begin
ch(hujiaotable,chaneltable,timer3,3,mainfrm.panel5,combobox2);
break;
end;

。。。。
end;
 
但是你的
procedure Tpagesdlg2.mytimerontime(sender:Tobject);
这个timer事件里面还是没有i的定义啊! 而且,你也无法给一个timer事件传递一个
i变量吧?
 
请问cAKK,那我该如何实现我想要的功能呢?
 
用timer的tag。
 
amo说的对。tag提供了一个全局变量为什么不用呢
 
amo说的就可以,用(sender as ttimer).tag

不过说实话,你的程序我还没看大懂,还不清楚你到底要实现什么功能. :-p
 
windows中Timers资源是有限的,一次申请太多的Timer有的就会无效。
 
1. timerarray[i-1]:=Ttimer.create(timer1);
一个Timer的owner是另一个Timer是否会出问题我不知道. 建议用
timerarray[i-1]:=Ttimer.create(nil);

2. 愿你的imagearray[i-1,1].picture.loadfromfile('c:/my documents/xxx.bmp');
能在25ms内完成(如果要4个Timer都有时间响应的话)
 
>>一个Timer的owner是另一个Timer是否会出问题我不知道
owner只起释放所有属于owner的所有倥件作用,如果所属owner没有释放所有属于owner的所有倥件功能,
则只能我门程序自己释放.
 
多人接受答案了。
 
后退
顶部