COMPOSANT RUNONCE: AUTORISER UN SEUL LANCEMENT D'UNE APPLICATION (OU NON!)

Signaler
Messages postés
3825
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 février 2021
-
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39819-composant-runonce-autoriser-un-seul-lancement-d-une-application-ou-non

Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
Si tu mets MB_SYSTEMMODAL, ça permet à la boîte de dialogue de passer par-dessus toutes les autres fenêtres (utile si le programme est en arrière-plan). Mais effectivement, la boîte n'est pas system-modale...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
MB_SYSTEMMODAL est obsolète depuis win95, le système ne lit plus ce flag.
Le principe du "system modal" a disparu (pour les progs mode user 'normaux') avec win3.1 et le 16 bits en général.
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
J'oubliais: avec la version plus haut, le switch /F empèche l'affichage de la boîte de dialogue. Avec /S:

if (Params.IndexOf('/S')=-1) and ( (Params.IndexOf('/F')>-1) or (MessageBox(...)=ID_YES) ) then
Allow:=True;

Ici, /S est prioritaire sur /F et empèche la 2ème instance à tous les coups (et là encore empèchera la boîte de dialogue de s'afficher). Pour que ça marche, il faut bien sûr que l'option "évaluation booléenne complète" du compilateur soit désactivée (mais c'est le cas par défaut).

En tout cas merci pour les notes!
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
La boîte de dialogue est juste là pour l'exemple, et ne fait pas partie du composant. Tout dépend de ce que tu mets dans l'événement OnBlockInstance:

procedure TForm1.RunOnce1BlockInstance(Sender: TObject; Params: TStrings;
var Allow: Boolean);
begin
if (Params.IndexOf('/F')>-1) or (MessageBox(0,
PChar('Voulez vous autoriser le 2ème lancement de "'+Params[0]+'" ?'),
'Confirmation',
MB_YESNO or MB_ICONQUESTION or MB_SYSTEMMODAL)=ID_YES) then
Allow:=True;
end;

Avec cette version-là, lorsque tu mets le switch /F dans sa ligne de commande, la 2ème instance est toujours autorisée.
Afficher les 9 commentaires