cs_Forman
Messages postés600Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 6 avril 20101 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és600Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 6 avril 20101 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és600Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 6 avril 20101 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.
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])
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 ?
6 oct. 2006 à 12:58
6 oct. 2006 à 11:30
Le principe du "system modal" a disparu (pour les progs mode user 'normaux') avec win3.1 et le 16 bits en général.
6 oct. 2006 à 10:18
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!
6 oct. 2006 à 10:13
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.
6 oct. 2006 à 00:41
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
5 oct. 2006 à 23:28
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
5 oct. 2006 à 22:18
Je ne vois pas d'explication à ton problème pour l'instant. Tu utilises quelle version de Delphi?
5 oct. 2006 à 21:21
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
5 oct. 2006 à 20:54
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