Un petit composant (un de plus!) pour n'autoriser qu'un seul lancement d'une application. Je sais qu'il en existe déjà plein, mais celui-ci a un design particulier que je n'ai pas trouvé dans les autres: il est possible, lors du lancement d'une 2ème instance, de récupérer sa ligne de commande depuis la première instance, et de choisir si on en autorise le lancement ou non.
Un scénario tout bête: on imagine qu'on a programmé un éditeur multi-document associé au type de fichier *.xxx
-L'utilisateur double-clique sur le fichier a.xxx (donc une première instance de l'éditeur se lance et ouvre le fichier a.xxx).
-L'utilisateur double-clique sur le fichier b.xxx, une 2ème instance de l'éditeur est bloquée par la première qui, en récupérant la ligne de commande de l'instance bloquée, ouvre un 2ème fichier: b.xxx
-L'utilisateur lance manuellement l'éditeur (sans paramètre, donc). Cette fois-ci, on décide que la 2ème instance ne sera pas bloquée (en effet, si l'utilisateur choisit de le faire explicitement, c'est qu'il a une bonne raison de le faire a priori...)
Mon composant permet donc de faire tout cela simplement par l'intermédiaire de con événement OnBlockInstance. Avant la création de la fiche principale (c'est à dire dans le source du programme même, avant la ligne Application.Initialize) il faut rajoutter ceci:
if not TestRunOnce('Nom') then
Exit;
A la place de 'Nom' il faut mettre un identificateur unique pour votre application. Voilà la définition de la classe TRunonce:
TBlockInstanceEvent=procedure(Sender:TObject;Params:TStrings;var Allow:Boolean) of object;
TRunOnce=class(TComponent)
public
constructor Create(AOwner:TComponent);override;
function IsMaster: Boolean;
destructor Destroy;override;
published
property OnBlockInstance:TBlockInstanceEvent read FOnBlockInstance write SetOnBlockInstance;
property OnAcquireLock:TNotifyEvent read FOnAcquireLock write SetOnAcquireLock;
end;
REGLES D'UTILISATION:
+ Une seule instance du composant peut être créée par application.
+ Avant toute création d'une instance du composant, la fonction TestRunOnce doit être appelée. Sinon, une exception est déclenchée.
+ La fonction TestRunOnce ne peut être appelée qu'une seule fois.
Le non-respect d'une seule de ces règle entraîne une exception EInvalidOperation