2 votes

Afficher le message une seule fois

Le code ci-dessous se trouve dans l'événement OnTimer. Si les éléments de deux zones de liste ne correspondent pas - ShowMessage. Je dois afficher le message une seule fois, mais comme la minuterie est en cours d'exécution, le message continue d'apparaître à l'intervalle fixé par la minuterie. J'ai essayé de désactiver la minuterie après la ligne ShowMessage, mais le message s'affiche alors.

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;

Merci.

5voto

Don Dickinson Points 4208

Je pense que ce que vous avez fait, c'est mettre enabled := false après la boîte de message. Mettez enabled := false avant la boîte de message et cela devrait fonctionner :

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;

meilleures salutations, don

2voto

ProblemFactory Points 4470

Essayez de créer une autre variable (exemple de type Boolean ) et de garder False si le message n'a pas encore été affiché, True lorsqu'il est affiché, et de changer la condition en quelque chose comme ceci :

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

N'oubliez pas de modifier messageShown à Vrai après la première apparition du message.

1voto

Nick Dandoulakis Points 26809

Une autre solution possible est la suivante :

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

Si les listes ne correspondent pas, ce code affiche le message et désactive la minuterie.
Bien sûr, dans ce cas, vous devrez l'activer à partir d'une autre routine.

0voto

tvanfosson Points 268301

La ligne qui désactive le timer se trouve-t-elle à l'intérieur du bloc if ou s'exécute-t-elle à chaque itération de la boucle ? Si c'était moi, je mettrais un drapeau indiquant que le message doit être affiché, puis je sortirais de la boucle. Après la boucle, je vérifierais si le message doit être affiché et, si c'est le cas, j'afficherais le message et j'arrêterais la minuterie. On peut supposer que la minuterie est réinitialisée lorsque les éléments des zones de liste changent, de sorte que la vérification s'effectue à nouveau.

Avertissement : je ne suis pas un programmeur Delphi ; je parle seulement en termes généraux de la façon dont je structurerais les choses. Si ce que j'ai dit n'a pas de sens du point de vue de Delphi, commentez et je retirerai ma réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X