Bonjour a tous,
Le titre du "Post" n’étant pas explicite pour mon problème, je vais essayer détailler.
Je pars d'un programme existant développé sous Delphi7, fonctionnant sous Windows XP, dont je possède toutes les sources.
A ce jour le programme fonctionnement normalement
- Lancement du programme (exécutable)
- Ouverture des fichiers à utiliser depuis une fonction du programme.
La modification demande "a ouvrir le tout (programme et fichier)" , simplement en cliquant sur le fichier a utiliser.
exemple. si les fichiers *.txt sont associés au Bloc-note, un clic sur un fichier ayant l'extension txt, ouvre le Bloc-notes et le fichier cliqué.
Et si je clique sur plusieurs fichiers , j'ouvre autant de bloc note que nécessaire.
Ceci a été réaliser en utilisant la méthode "d'association de fichier au application" Windows et en gérant le passage des paramètres (paramstr(n)). Cela fonctionne.
Voici mon problème.
L'application ne peut avoir qu'une seule instance, ceci est géré à l'ouverture de l'application par un "CreateMutex" (voir code si dessous ) donc contrairement a l'exemple du bloc-note (en rouge) je ne peux pas et ne veux pas lancer plusieurs applications en même temps.
mais je dois quand ouvrir le dernier fichier cliqué, dans son application en perdant bien sur le dernier fichier qui avait été chargé.
exemple. un clic sur un fichier ayant l'extension txt, ouvre le Bloc-notes et le fichier cliqué °1 . Un autre clic sur un fichier ayant l'extension txt, ouvre le fichier cliqué °2 qui remplace le fichier cliqué n°1 sans ouvrir une second bloc-note.
Voici ci-dessous une version simplifié de mon programme. la fonction ouverture fichier se trouve dans des unités de Uessai.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 program Essai; uses Forms, windows, UEssai in 'UEssai.pas' {FEssai}, ... GetCheminDll in 'UEssa\GetCheminDll.pas'; {$R *.res} begin if ParamStr(1)<>'' then NomProgrammeLien:=ParamStr(1); SetlastError(NO_ERROR); CreateMutex (nil, false, 'CtrlPhoenix'); if GetlastError <> ERROR_ALREADY_EXISTS then // controle si "Essai" est deja lancé begin //-------------------------------------------------------------- Application.Initialize; Application.CreateForm(TFUessai, FUessai); .... .... Application.Run; end else begin ouvreFichier(Paramstr(1)) end; end.
Cas 1° Quand le programme n'est pas encore ouvert si ParamStr(1)='' fonctionnement normal , on attends que le programme se lance et on ouvre le fichier avec une fonction "ouvreFichier(Paramstr(1))"
Cas 2° Quand le programme n'est pas encore ouvert si ParamStr(1)<>'' ouverture par lien , on lance et attends que le programme soit ouvert et on lance automatiquement la fonction "ouvreFichier(Paramstr(1))"
Cas 3° Quand le programme est déjà ouvert et si ParamStr(1)<>'' ouverture par lien , mais si on voit qu'une instance du programme existe déja , il faudrait seulement lancer automatiquement la fonction "ouvreFichier(Paramstr(1))" qui se trouve dans le ELSE du test "GetlastError".
Mais cela ne marche pas, j'ai bien accès a ma fonction d'ouverture , mais des que j'utilise un composant de la fiche Fessai, je plante !! je ne sais rien de plus car je ne sais pas faire de pas à pas dans ce mode de fonctionnement.
Ai je le droit de faire ce que je fais ? (le cas 3).
En attende de vous réponses ou de vos conseils.. merci
Partager