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

Utilisateur anonyme - 5 oct. 2006 à 20:54
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 - 6 oct. 2006 à 12:58
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

cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
6 oct. 2006 à 12:58
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...
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 oct. 2006 à 11:30
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.
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
6 oct. 2006 à 10:18
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!
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
6 oct. 2006 à 10:13
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.
Utilisateur anonyme
6 oct. 2006 à 00:41
Bon le code est, comme toujours, très propre (pas de surprises) ;-)
On apprend toujours beaucoup de choses avec tes codes. (Merci de cette nourriture pour neurones)

Je n'ai pas encore tout bien compris :-)
Mais je ne désespère pas (je vais avoir besoin d'un peut plus de temps) pour bien comprendre le tout (surtout l'utilisation de Interface pour passer les infos d'une appli à l'autre)

Par contre je pense que le niveau initié est un peut "léger"

Ce qui serait bien ce serait de pouvoir s'affranchir de la boite de dialogue par un switch dans la ligne de commande (Ex: /F /S [F:Force S:SendParam])

En tous cas 10/10 très bien
@+
Cirec
Utilisateur anonyme
5 oct. 2006 à 23:28
ça y est j'ai trouvé le problème :

Sous D2005 dans l'unité SyncObjs.pas il y a déjà une Classe TMutex de déclaré

J'ai donc modifié dans Mutex.pas ainsi que dans RunOnce.pas:
TMutex en TFMutex

F pour Forman :-)

et ça fonctionne


bon maintenant je peut me mettre à explorer le code :)
@+
Cirec
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
5 oct. 2006 à 22:18
Merci Cirec, effectivement j'avais oublié de nettoyer le zip.

Je ne vois pas d'explication à ton problème pour l'instant. Tu utilises quelle version de Delphi?
Utilisateur anonyme
5 oct. 2006 à 21:21
j'ai un problème ... je n'arrive pas à compiler le code :

ConnectionBuffer.pas(239)
Connection.pas(210)
PipeConnection.pas(118)
Server.pas(173)
PipeServer.pas(97)
Mutex.pas(91)
RunOnce.pas(78) Erreur: E2250 Aucune version surchargée de 'Create' ne peut être
appelée avec ces arguments
RunOnce.pas(79) Erreur: E2003 Identificateur non déclaré : 'Locked'
RunOnce.pas(80) Erreur: E2003 Identificateur non déclaré : 'Enter'

je n'ai rien trouvé de spécial pourtant il ne semble pas accepter la chose ?

@+
Cirec
Utilisateur anonyme
5 oct. 2006 à 20:54
Salut,

un petit commentaire (c'est pas celui que tu attendais :-) pas encore) :
Il y a beaucoup de fichiers inutile dans ton archive !

Pour le code je regarde ça ...

@+
Cirec
Rejoignez-nous