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

API, COM et SDKs Delphi Discussion :

[WORD] pilotage ole Delphi [FAQ]


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 32
    Points : 17
    Points
    17
    Par défaut [WORD] pilotage ole Delphi
    Bonjour à tous
    Je développe une application en delphi 7 où j'ai besoin de gérer des documents word. J'ai trouvé ce tuto très bien : http://lfe.developpez.com/PasWord/
    Le problème c'est que le code pour créer une instance ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try
        vMSWord := GetActiveOleObject('Excel.Application');
    except
        vMSExcel := CreateOleObject('Excel.Application');
    end;
    Il renvoit "opération non disponible". Si je met la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vMSWord := GetActiveOleObject('Excel.Application');
    dans l'ouverture de mon application cela marche mais si un document word est deja ouvert cela créé une nouvelle instance.

    Le code pour fermer le document:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vMSWord.Quit;
    vMSWord :=  unassigned;
    Ce code marche seulement si l'utilisateur n'a pas fermé le document sinon il provoque une erreur.
    Voilà j'aimerais savoir si il y a un moyen de ne crée qu'une seule instance de word à chaque fois et de laisser l'utilisateur décider si il veut ou non fermer le document.
    Merci

  2. #2
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    Pardon je me suis trompé dans mes lignes je voulais mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try
        vMSWord := GetActiveOleObject('Word.Application');
    except
        vMSExcel := CreateOleObject('Word.Application');
    end;
    bien sur

  3. #3
    Membre expérimenté
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Points : 1 392
    Points
    1 392
    Par défaut
    ou pas :

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    Non non pas tout

  5. #5
    Membre expérimenté
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Points : 1 392
    Points
    1 392
    Par défaut
    Citation Envoyé par missmarion
    Pardon je me suis trompé dans mes lignes je voulais mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try
        vMSWord := GetActiveOleObject('Word.Application');
    except
        vMSExcel := CreateOleObject('Word.Application');
    end;
    bien sur
    Est ce normal que les deux objets ole soient différents ?

    et

  6. #6
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    décidement je suis pas réveillée ce matin les 2 lignes ont bien le même nom:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try
        vMSWord := GetActiveOleObject('Word.Application');
    except
        vMSWord := CreateOleObject('Word.Application');
    end;
    Mais toujours la même erreur

  7. #7
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    salut,
    dans , au sujet de GetActiveOleObject ils disent:
    Si la classe ou l'interface IDispatch ne sont pas correctement renvoyés,une erreur EOleSysError se produit.
    j'ai jamais eu besoin de gérer le cas de double instance donc mon code gère une instance à la fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	try
    		XlApp := CreateOleObject('Excel.Application');
    		if VarType(XlApp) <> VarDispatch then Abort;
    		XlApp.Visible := False;
    		XlApp.DisplayAlerts := False;
    	except
    		on E: Exception do
    			XlApp := Unassigned;
    	end;
    D'abord ils vous ignorent, ensuite ils se moquent de vous, puis ils vous combattent, enfin vous gagnez (Gandhi)

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    la clé de registe pour Word.Application existe-elle ?

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    Merci à tous pour vos messages.
    Citation Envoyé par HumanTool
    j'ai jamais eu besoin de gérer le cas de double instance donc mon code gère une instance à la fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	try
    		XlApp := CreateOleObject('Excel.Application');
    		if VarType(XlApp) <> VarDispatch then Abort;
    		XlApp.Visible := False;
    		XlApp.DisplayAlerts := False;
    	except
    		on E: Exception do
    			XlApp := Unassigned;
    	end;
    Oui mais là tu vérifie pas si il y a deja une instance de creer, si c'est le cas cela en créée une autre.
    Citation Envoyé par Laurent Dardenne
    Salut,
    la clé de registe pour Word.Application existe-elle ?
    Désolé je suis débutante je vois pas ce que tu entend par là

  10. #10
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par missmarion
    Désolé je suis débutante je vois pas ce que tu entend par là
    La méthode que tu appelles lit dans la base de registre une clé du même nom. Cette clé contient une entrée nommée CLSID (classe ID) qui est le GUID ( i.e un identifiant unique) du serveur OLE/COM de WORD.
    Cela facilite l'écriture faire Getxxx('Word.Application') est plus facile que Getxxx('{000209FF-0000-0000-C000-000000000046}').

    Mais en relisant ton post initiale je me demande si je ne suis pas HS ?
    Que fait l'appel suivant ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateOleObject('Word.Application');

  11. #11
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Laurent Dardenne
    Mais en relisant ton post initiale je me demande si je ne suis pas HS ?
    Que fait l'appel suivant ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateOleObject('Word.Application');
    Il crée une instance de Word.
    Merci d'essayer de se pencher sur mon problème mais je commence à croire qu'il n'existe pas de solution à mon problème.

  12. #12
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par missmarion
    mais je commence à croire qu'il n'existe pas de solution à mon problème.
    "Qui veut vivre est condamné à l'espoir"
    Je regarde ça dés que j'ai 5 minutes, j'en profiterais pour améliorer la FAQ si besoin est.

  13. #13
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Le code existant fonctionne mais la nouvelle instance de word est par défaut 'invisible'.
    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
     
    var WordApplication:Variant;
     
    Begin
     Try
      WordApplication:=GetActiveOleObject('Word.Application'); 
     except
      // OleCheck, appellée par GetActiveOleObject, déclenche une exception EOleSysError
      // message 'Opération non disponible'
        on EOleSysError do
         begin
          WordApplication:= CreateOleObject('Word.Application');
          WordApplication.Visible:=True;
         end;
    end;
    Pour ton prb de fermeture, vérifie si la collection de document est vide.
    En utilisant un TWordApplication tu peux tester les événement de fermeture et d'ouverture de document.
    Tu peux mixer, les 2 variant et TWordApplication, regarde TOleserver dans l'aide en ligne, procedure ConnectTo(svrIntf: _Application);

  14. #14
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Laurent Dardenne
    Le code existant fonctionne mais la nouvelle instance de word est par défaut 'invisible'.
    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
     
    var WordApplication:Variant;
     
    Begin
     Try
      WordApplication:=GetActiveOleObject('Word.Application'); 
     except
      // OleCheck, appellée par GetActiveOleObject, déclenche une exception EOleSysError
      // message 'Opération non disponible'
        on EOleSysError do
         begin
          WordApplication:= CreateOleObject('Word.Application');
          WordApplication.Visible:=True;
         end;
    end;
    Je sais pas si qui cloche chez moi mais ton code me renvoit encore la même erreur 'opération non disponible' il ne rentre pas dans le except. Mais pourquoi, c'est bizar, Merci quand même d'essayer.

  15. #15
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Sous l'EDI l'erreur est déclenchée dans tous les cas sauf si tu désactives la prise en charge de l'exception EOleSysError.
    Tu as placé un point d'arrêt dans le bloc except ?
    Et en dehors de l'EDI est-ce que cela fonctionne ?

  16. #16
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Laurent Dardenne
    Sous l'EDI l'erreur est déclenchée dans tous les cas sauf si tu désactives la prise en charge de l'exception EOleSysError.
    Tu as placé un point d'arrêt dans le bloc except ?
    Et en dehors de l'EDI est-ce que cela fonctionne ?
    Oui j'ai placé un pont d'arrêt dans le bloc mais il plante à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    try
    WordApplication := GetActiveOleObject('Word.Application');
    Il rentre pas du tout dans le except.
    Sinon comment désactive t-on la prise en charge de l'exception EOleSysError?
    Merci pour ton aide.

  17. #17
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par missmarion
    Il rentre pas du tout dans le except.
    Quel est le résultat si tu adaptes la portion de code en retirant la ligne on EOleSysError do ?
    Citation Envoyé par missmarion
    Sinon comment désactive t-on la prise en charge de l'exception EOleSysError?
    Regarde dans la FAQ Delphi, il y a une rubrique à ce sujet.

  18. #18
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Laurent Dardenne
    Quel est le résultat si tu adaptes la portion de code en retirant la ligne on EOleSysError do ?
    Même erreur
    Citation Envoyé par Laurent Dardenne
    Regarde dans la FAQ Delphi, il y a une rubrique à ce sujet.
    Je vais voir. Merci

  19. #19
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Communique nous le code dans son intégralité (un site ftp c'est parfait).
    A quel endroit dans ton code tu reprends la main en mode trace ?

  20. #20
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 175
    Points
    175
    Par défaut
    bonjour, j'ai le même pb,
    as-tu réussi à trouver la solution ?
    je ne trouve pas comment desactiver eOleSysError, as tu trouvé ?

Discussions similaires

  1. Pilotage OLE d'Excel à partir de Delphi
    Par patrickbruneau dans le forum Delphi
    Réponses: 1
    Dernier message: 29/08/2006, 14h51
  2. Pilotage OLE Word avec Visual C++
    Par baka02 dans le forum MFC
    Réponses: 2
    Dernier message: 20/03/2006, 13h04
  3. Pilotage Ole de word
    Par beauchastel dans le forum Langage
    Réponses: 6
    Dernier message: 10/01/2006, 10h43
  4. [D6]Pilotage Ole d'Adobe Acrobat à partir de Delphi?
    Par brocexco dans le forum Langage
    Réponses: 1
    Dernier message: 17/10/2005, 10h17
  5. [AUTOMATION WORD]Pilotage Word par Delphi
    Par Sunny dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 05/12/2002, 17h09

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