Отображение сообщения только один раз - PullRequest
2 голосов
/ 03 октября 2009

Код ниже находится в событии 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 ]

5 голосов
/ 03 октября 2009

Я подозреваю, что вы сделали, было включено: = 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;

С наилучшими пожеланиями, дон

2 голосов
/ 03 октября 2009

Попробуйте создать другую переменную (введите пример Boolean) и оставьте ее False, если сообщение еще не отображалось, True, когда оно отображается, и измените условие на что-то вроде этого:

if (p = -1) and not messageShown then ...

Не забудьте изменить messageShown на True после первого появления сообщения.

1 голос
/ 03 октября 2009

Другое возможное решение:

  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; // <---

Если списки не совпадают, этот код показывает сообщение и отключает таймер.
Конечно, в этом случае вам придется включить его из какой-то другой процедуры.

0 голосов
/ 03 октября 2009

Была ли строка отключением таймера внутри блока if или она выполнялась на каждой итерации цикла? Если бы это был я, я бы установил флаг, указывающий, что сообщение необходимо показать, а затем вышел из цикла. После цикла я бы проверил, нужно ли показывать сообщение, и если да, то и показать сообщение, и выключить таймер. Предположительно, таймер сбрасывается, когда элементы в списках изменяются, и проверка снова запускается.

Предостережение: я не программист на Delphi; Я говорю только в общих чертах о том, как бы я это структурировал. Если то, что я сказал, не имеет смысла с точки зрения Delphi, прокомментируйте, и я удалю свой ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...