**再提**高难度问题(至少对我来说是这样子地),小弟想了几天都没有想出来。如何将一变量传入Timer的OnTimer事件?? (100分)

A

abc_xp

Unregistered / Unconfirmed
GUEST, unregistred user!
在Timer的OnTimer事件中要传入一变量,如何做?

用全局变量好像不行

具体情况:
在OnTimer事件中要调用一变量,如果用全局变量 S 当然可以调用,但是我要求在OnTimer
事件中要求 S 的值不能改变,但是 S 的值随时都有可能被OnTimer事件以外的代码改变

我该如何做?
有何其它方法?


我昨天也提过这个问题, http://www.delphibbs.com/delphibbs/dispq.asp?lid=1389117
有人回答:
>加一个标志位:
>if flag = 0 then begin s2:=s1; flag = 1 end
>不就执行一次了

我加思索就给分了,但是我试过后发现不行,Timer每次刷新都会把变量复位地,也就是说
上面代码的 flag就为0了

到底有什么办法啊
多谢!!!

另:Timer是动态创建的,并且有N个
 
我不明白,你在OnTimer开始时令flag:=1,结束时令flag:=0,有什么不可以?
 
每次刷新,flag的值都会复位,上次对它赋的值会失效
 
你指定时器刷新?
“每次刷新,flag的值都会复位,上次对它赋的值会失效”,可这样就对了呀!
 
[red]"但是我要求在OnTimer事件中要求 S 的值不能改变,
但是 S 的值随时都有可能被OnTimer事件以外的代码改变"
[/red]
为什么???程序在你 OnTimer事件处理过程的代码中执行中,还会有别的代码
去改变S的值?
你到底用没用多线程技术??
 
to xeen,
没有,S是一个全局变量

如果S不定义成一个全局变量,有没有其它方法将某个变量传入OnTimer事件中处理?
 
to zw84611,
当flag被复位后,其值为0
if flag = 0 then begin s2:=s1; flag = 1 end就会再次执行
而我要求>if flag = 0 then begin s2:=s1; flag = 1 end只执行一次
 
To abc_xp:

聲明 flag: Byte 在全局, 然後在FormShow的時候設置 flag := 0;

在OnTimer裡面寫
if flag=0 then begin
s2 := s1;
flag := 1;
end;

這樣就可以實現你的要求了, 你試試吧.
 
to alextsui,

我要创建N个timer啊,Flag被这个Timer改了,那么另外一个timer怎么办
 
假设OnTimer事件以外的改变S的代码是“if flag = 0 then S:=s1;”
可在OnTimer事件开始时令flag:=1,结束时令flag:=0,
则在OnTimer事件执行时就不会改变S。
 
暈ING, 建立N個Timer???????? 我一直認為用Timer是比較危險的, 所以我很少用Timer,
寫寫你的Requirement給我吧.
 
to zw84611,
你的假设是成立地,

但是OnTimer以外改变S的代码根本不能设置任何 标志变量(flag)

S随时可能被改变
 
其实呢是这样子地:
我做了一个局域网聊天程序

当收到消息时好友的头像要跳动
我是用写时器来实现地
来设置好友头像的 ImageIndex一会儿为-1(即没有),一会儿为X(头像图片的索引)

这样就实现了头像的跳动

当好友1收到信息后,就动态创建一个timer1
好友2收到信息后,创建第二个timer
……

在每一个timer的onTimer事件中,我必须传入一个变量来识别是哪一个好友
以便来确定哪个头像要跳动
 
>“OnTimer以外改变S的代码根本不能设置任何 标志变量(flag)”
为什么,你没有源码?

或者这样,在OnTimer中加一个局部变量TemS,在OnTimer开始时令
TemS:=S,之后用TemS代替S,这样执行OnTimer中其它语句时TemS是不会变的。
 
to zw84611,

对,TemS是不会改变
但这是定时器啊,第过1秒就刷新一次,当第二次的时候不还是要执行TemS:=S吗?

如果S改变了,那么TemS不照样还是在变?
 
你不如用个动态数组纪录你每个好友的的imageindex,这样就不会冲突了。
何不为省一点内存编程这么麻烦.
 
能不能自己写一个ttimer的类?

不过我从来没有写过

给点提示
 
你的意思是每次OnTimer中的S都是同一个值?我才明白。
那很简单,用alextsui的方法就可以,如果你有N个timer,则
在每个Timer的OnTimer中这样写:
begin
with Sender as TTimer do
begin
if tag = 0 then
begin
...
end;
tag := 1;
end;
end;

你知道每个Timer都是有tag的,并且处始值都为0。
 
TO abc_xp:
你留下Email吧, 我給你一個寫ICQ Server & Client的原代碼給你參考吧.
另外, 你在不同的OnTimer事件裏, 可以SET flag等於不同的值的, 這樣就不會出現你的問
題了, 因為還不清楚你的Requirement, 很難給你實際的代碼.
 
to zw84611,

好地,现在忙,下午要上课,还有好多人来听课

晚上再试

多谢
 
顶部