以下代码位于OnTimer事件中。如果2个列表框中的项目不匹配 - ShowMessage。我只需要显示一次消息,但由于定时器正在运行,消息会在定时器的设置间隔内弹出。我尝试在ShowMessage行之后禁用计时器,但后来甚至会显示消息。
for i := 0 to ListBox2.Items.Count - 1 do begin
p := ListBox1.Items.IndexOf(ListBox2.Items[i]);
if p = -1 then
ShowMessage('not matching');
end;
感谢。
答案 0 :(得分:5)
我怀疑你所做的是在消息框之后输入enabled:= false。在消息框之前放置enabled:= false,它应该起作用:
var
i : integer;
p : integer;
begin
for i := 0 to ListBox2.Items.Count - 1 do begin
p := ListBox1.Items.IndexOf(ListBox2.Items[i]);
if p = -1 then begin
timer1.Enabled := false;
ShowMessage('not matching');
break;
end;
end;
最好的问候, 别
答案 1 :(得分:2)
尝试创建另一个变量(类型示例Boolean
),如果消息尚未显示则保持为False,显示时为True,并将条件更改为:
if (p = -1) and not messageShown then ...
请在第一次显示消息后,将messageShown
更改为True。
答案 2 :(得分:1)
另一种可能的解决方案是:
timer1.Enabled := false; // <---
for i := 0 to ListBox2.Items.Count - 1 do begin
p := ListBox1.Items.IndexOf(ListBox2.Items[i]);
if p = -1 then
begin
ShowMessage('not matching');
exit; // <---
end;
end;
timer1.Enabled := true; // <---
如果列表不匹配,该代码会显示该消息并禁用计时器 当然,在这种情况下,你必须从其他一些例行程序启用它。
答案 3 :(得分:0)
该行是否在if块内禁用了定时器,还是在循环的每次迭代中运行?如果是我,我会设置一个标志,指示需要显示消息,然后退出循环。在循环之后,我将检查是否应该显示该消息,如果是,则两者都显示该消息并关闭计时器。当列表框中的项目发生变化时,可能会重置计时器,以便再次运行检查。
警告:我不是德尔福程序员;我只是概括地说我将如何构建它。如果从Delphi的角度来看,我所说的没有任何意义,请发表评论,我将删除我的答案。