IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Ouverture d'un programme associé à son fichier


Sujet :

Langage Delphi

  1. #1
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut Ouverture d'un programme associé à son fichier
    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
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 685
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 097
    Points
    13 097
    Par défaut
    Citation Envoyé par petitcoucou31 Voir le message
    Ai je le droit de faire ce que je fais ? (le cas 3).
    Ben non. Ton programme est bien lancé une deuxième fois. L'OS ne peut pas savoir que tu utilises un Mutex pour une instance unique
    La deuxième application devrait en fait avertir la première (ex. WM_COPYDATA) qu'un nouveau fichier est disponible puis quitter immédiatement.

  3. #3
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    Merci a toi AndNotOr,

    tu confirmes ce que je pensais...
    j'ai donc codé un petit programme console qui est associé aux types fichiers à ouvrir et envoie les messages à l'application générale pour lui dire quel fichier ouvrir . Il s'occupe aussi d'ouvrir l'application générale si cette dernière n'est pas lancée.

    cela marche, mais il me reste un problème.

    je voudrai que l'application console (celle qui envoie le message a l'application) soit complétement invisible.. je ne sais pas encore comment faire.
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  4. #4
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    Pour rendre la console invisible, j'ai changé cette directive par {$APPTYPE CONSOLE} par {$APPTYPE GUI}
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 685
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 097
    Points
    13 097
    Par défaut
    Pourquoi une application supplémentaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //Contrôle si "Essai" est deja lancé
    if GetlastError <> ERROR_ALREADY_EXISTS then 
    begin
      //Non => démarrage normal
    end
    else  
    begin 
      //Oui => Retrouve la fenêtre TFUessai, lui envoi le fichier et quitte
      h := FindWindow('TFUessai',...);
      SendMessage(h, WM_COPYDATA, ...);
      Halt;
    end;
    Reste plus qu'à coder une méthode d'ouverture de fichier qui sera soit appelée depuis la création de la fiche, soit depuis le handler WM_COPYDATA.

Discussions similaires

  1. OUverture d'un programme .exe en cliquant sur son fichier associé
    Par Joch1er dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 30/04/2013, 21h07
  2. Réponses: 0
    Dernier message: 17/05/2008, 09h06
  3. Réponses: 2
    Dernier message: 03/09/2007, 23h06
  4. Associer programme à type de fichier (registry)
    Par Belegkarnil dans le forum Windows XP
    Réponses: 2
    Dernier message: 31/08/2006, 08h49
  5. ouverture d'un programme par double clic sur un fichier
    Par zieg18 dans le forum Visual C++
    Réponses: 6
    Dernier message: 12/07/2006, 10h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo