仅显示一次消息

时间:2009-10-03 13:03:24

标签: delphi listbox timer

以下代码位于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;

感谢。

4 个答案:

答案 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的角度来看,我所说的没有任何意义,请发表评论,我将删除我的答案。