Boite message

fallen angels Messages postés 7 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 28 septembre 2005 - 22 sept. 2005 à 09:54
fallen angels Messages postés 7 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 28 septembre 2005 - 28 sept. 2005 à 09:28
Bonjour a tous,

Dans une boucle sans fin, je fait un test et suivant l'état d'un flag j'affiche une boite message.
Est-il possible de tester si un dialogue et déja affiché à l'écran ?
Comment faire pour que cette boite ne s'affiche qu'une seule fois ?
Merci de votre aide.

L'algo :

while toto do
begin
if flag = true then ShowMessage('-Erreur-');
end;

6 réponses

atomefougere Messages postés 32 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 5 décembre 2005
22 sept. 2005 à 14:41
Si tu cherches à afficher le message une fois et à sortir de la boucle, utilise l'instruction break.

Si tu n'as aucune condition de sortie dans ta boucle, j'ai un peu de mal à en comprendre l'utilité.

Que cherches-tu vraiment à faire ?
0
fallen angels Messages postés 7 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 28 septembre 2005
22 sept. 2005 à 14:55
en fait, je test si des fichiers corespondent à certaints critéres.
j'ai donc positionné un timer qui scrute des répertoires toute les heures.
des qu'un fichier correspond a mon critere, je veux recevoir un message et un seul et sans que le soft s'arrete...
suis-je plus claire ?
0
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
23 sept. 2005 à 03:51
j'ai testé ceci peut-être une solution pour ce que tu veux faire modifie le temps pour testé car 1 heure c'est long ...

unit Unit1;


interface


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;


type
TForm1 = class(TForm)
public
{ Déclarations publiques }
end;


type
scrute_toute_les_heures = class(TThread)
protected
procedure Execute; override;
constructor Create();
end;


type
scrute = class(TThread)
protected
procedure Execute; override;
constructor Create();
end;


procedure ScruteFichier;

var
Form1: TForm1;
finThread:Boolean;


implementation
{$R *.dfm}

constructor scrute_toute_les_heures.Create;
begin
FreeOnTerminate := True;
inherited Create(false);
Priority := tpNormal;
finThread:=false;
end;
procedure scrute_toute_les_heures.Execute;
var
StartCount,
EndCount,
Frequency: TLargeInteger;
ElapsedTime: Extended;
begin
while finThread=false do
begin
QueryPerformanceFrequency(Frequency);
QueryPerformanceCounter(StartCount);
ElapsedTime:=0;
repeat
if finThread=false then sleep(5900) else break; // dors ~~60 secondes
QueryPerformanceCounter(EndCount);
ElapsedTime := (EndCount - StartCount)/Frequency;


until ElapsedTime>3600; //3600 ça fait bien 1 heure !


if finThread=false then scrute.Create;
end;
end;


constructor scrute.Create;
begin
FreeOnTerminate := True;
inherited Create(false);
Priority := tpNormal;
end;
procedure scrute.Execute;
begin
ScruteFichier;
end;


procedure ScruteFichier;
begin
// ?
MessageDlg('', mtError,[mbOK] ,0);
// ?
end;



initialization
scrute_toute_les_heures.Create;
finalization
finThread:=true;


end.

yve
0
fallen angels Messages postés 7 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 28 septembre 2005
27 sept. 2005 à 13:24
bien essayé (quoique un peu compliqué) c'est exactement ça mais... marche po !
il ne fait aucun doute que tu as tapé dans le mille concernant l'algo sauf que le dialog "MessageDlg('', mtError,[mbOK] ,0);" s'affiche toute les minutes (j'ai modifié la tempo) alors que le but recherché et dans afficher une et une seule !
Betement je pense qu'il y a quelque chose du genre :
If MessageDlg('', mtError,[mbOK] ,0) Then // pour detecter qu'une boite est affichée !
Begin
....
End;

Cordialement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
28 sept. 2005 à 03:27
oui, c'est en effet le cas mais, le but était aussi de ne pas nuire au soft donc le thread laisse l'aplication rouler et l'alerte ne bloque pas la fiche,...., ce cas là étant réglé ,reste à savoir quand afficher l'alerte ...
Au plus simple j'aurais pensé utiliser un Boolean mais faudrais peut-être prévoir un moyen de le réinitialiser ? une option sur la fiche ? ou après 24 heures on réinitialise automatiquement ?


procedure ScruteFichier;
begin
if dejaAfficher=false then
begin
dejaAfficher:=true;
MessageDlg('', mtError,[mbOK] ,0);
end;
// ?
end;

ça dépend de ce que tu veux faire ...
Yve
0
fallen angels Messages postés 7 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 28 septembre 2005
28 sept. 2005 à 09:28
C'est ce que j'ai fait aussi mais cela ne convient pas !
pas possible d'ajouter un bouton pour reinitialiser le flag car il n'y a pas de fiche !
le truc serait que tant qu'il y a un message a l'écran le programme n'en génére pas de nouveau !
c'est important car même avec une tempo d'une heure, le week end le programme tourne et si l'événement survient je me retrouve le lundi avec une 50e de boites à tuer... c'est galére !
C'est étonnant qu'il n'y ai pas de tests sur les boites de dialogues ?
A+
0
Rejoignez-nous