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 :

Problème de création de document avec OLE


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Développeur delphi junior
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur delphi junior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Par défaut Problème de création de document avec OLE
    Bonjour,

    Tout d'abord je vous place dans le contexte.
    Je suis en mission de R&D pour mon entreprise. Cette mission consiste à trouver les ressources et développer un module pour lier le progiciel (déjà créé par l'entreprise) et OpenOffice. J'utilise pour cela notre bon vieux internet pour chercher des tuto sur le pilotage OLE. J'ai déjà piloté Excel via ces fonctions.
    Mes sources :


    Maintenant mon problème :
    Je cherche donc à créer un document via OLE/COM mais lors de la création j'ai : "Le variant ne référence pas un objet Automation."
    Je ne vois pas ce qu'il me manque.
    Mon code :
    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
    procedure TFormMenuPrinc.XPBitBtnValiderClick(Sender: TObject);
    var
      OfficeDesktop, Params, Document: Variant;
      DocumentExist: Boolean;
    begin
      //création du fichier
      MemoInfo.Lines.Add(MSGINF + 'Création du fichier.');
      OfficeDesktop:= OpenOffice.CreateInstance('com.sun.star.frame.desktop');
      Params:= VarArrayCreate([0, -1], varVariant);
      Document:= OfficeDesktop.LoadComponentFromURL(TypeDoc, '_blank', 0, Params);
      //test si le fichier est bien créé
      DocumentExist:= not(VarIsEmpty(Document) or VarIsNull(Document));
      if DocumentExist then
        MemoInfo.Lines.Add(MSGINF + 'Le document a été créé avec succès.')
      else
        MemoInfo.Lines.Add(MSGERR + 'Le document n''a pas été créé.');
    end;
    A savoir que :
    TypeDoc et OpenOffice sont des properties.
    Le code m'affiche l'erreur cité précédemment lors de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Document:= OfficeDesktop.LoadComponentFromURL(TypeDoc, '_blank', 0, Params);
    J'ai testé tout le reste du code, la connexion à OpenOffice ne pose pas de problème et reste active, et la déconnexion fonctionne également. C'est le seul problème que je trouve à l'exécution de l'application.

    Si je n'ai pas été assez clair dites-le moi, je m'efforcerai de mieux m'exprimer.

    Je remercie d'avance tous ceux qui se pencheront sur mon problème. Quant à moi je continue de chercher une solution au problème.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Document:= OfficeDesktop.LoadComponentFromURL(TypeDoc, '_blank', 0, Params);
    Quel est la valeur de TypeDoc ?
    Cette valeur a-t-elle été correctement formatée et préfixée ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeDoc := 'file:///' + StringReplace(TypeDoc, '\', '/', [rfReplaceAll, rfIgnoreCase]);

  3. #3
    Membre averti
    Homme Profil pro
    Développeur delphi junior
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur delphi junior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Par défaut
    TypeDoc vaut 'private:factory/swriter' puisque je cherche à créer le fichier et non l'ouvrir, ou alors je n'ai pas bien compris la FAQ

    qui est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LoadParams := VarArrayCreate([0, -1], varVariant);
       Document := openDesktop.LoadComponentFromURL( 'private:factory/swriter', '_blank', 0,  LoadParams);
    Dans la FAQ

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 576
    Billets dans le blog
    65
    Par défaut
    au cas ou , je vérifie toujours si mes variants sont bien initialisé avant d'y faire appel .

    Code un vieux 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
    var properties,CoreServ,prop : Variant;
        vSheet,vCell : Variant;
        n : Integer;
    begin
    if (VarIsEmpty(OO_Service) or VarIsNull(OO_Service)) then
       OO_Service:=CreateOleObject('com.sun.star.ServiceManager');
    if not(VarIsEmpty(OO_Service) or VarIsNull(OO_Service)) then
     begin
       if (VarIsEmpty(OO_DeskTop) or VarIsNull(OO_DeskTop)) then
              OO_Desktop:= OO_Service.CreateInstance('com.sun.star.frame.Desktop');
     end;
    if (VarIsEmpty(OO_DeskTop) or VarIsNull(OO_DeskTop)) then
     begin
       MessageDlg('Le service Open Office n''est pas ouvert',mtError,[mbOk],0);
       Exit;
     end;
    properties:=VarArrayCreate([0,0],varVariant);
    CoreServ:= OO_Service.CreateInstance('com.sun.star.reflection.CoreReflection');
    CoreServ.forName('com.sun.star.beans.PropertyValue').CreateObject(prop);
    prop.name:='Hidden';
    prop.Value:=True;
    properties[0]:=prop;
    if (Length(Fichier.Text)>0) AND FileExists(Fichier.Text)
       then OO_FileName:=FileToURL(Fichier.Text)
       else OO_FileName:='private:factory/scalc';
    OO_Doc := OO_Desktop.LoadComponentFromURL(OO_FileName,
                                              '_blank',
                                               0,
                                              properties);

  5. #5
    Membre averti
    Homme Profil pro
    Développeur delphi junior
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur delphi junior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Par défaut
    Cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CoreServ:= OO_Service.CreateInstance('com.sun.star.reflection.CoreReflection');
    CoreServ.forName('com.sun.star.beans.PropertyValue').CreateObject(prop);
    prop.name:='Hidden';
    prop.Value:=True;
    properties[0]:=prop;
    Elle est facultative non ?

    De plus mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    VarArrayCreate([0,0],varVariant)
    est en fait
    VarArrayCreate([0, -1], varVariant)
    C'est peut-être cela qui pose problème ?


    EDIT : Grâce à ton code SergioMaster je me rend compte que mon Variant
    OfficeDesktop ne reste pas initialisé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if not (VarIsEmpty(OOService) or VarIsNull(OOService)) then
        if (VarIsEmpty(OfficeDesktop) or VarIsNull(OfficeDesktop)) then
          OfficeDesktop:= OOService.CreateInstance('com.sun.star.frame.desktop');
     
        // même après passage complet dans la condition au dessus donc affectation à OfficeDesktop
    // la programme entre comme si c'était vide ou null
      if (VarIsEmpty(OfficeDesktop) or VarIsNull(OfficeDesktop)) then
      begin
        MemoInfo.Lines.Add(MSGERR + 'Le service Open Office n''est pas ouvert');
        Exit;
      end;
    Il doit surement me manquer des fichiers à installer car le FileToUrl ne fonctionne pas non plus, mais je les trouve où ?

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 576
    Billets dans le blog
    65
    Par défaut
    Elle est facultative non ?
    heu , dans mon cas je cache openoffice , donc non elle ne l'est pas je ne sais plus si on en a besoin dans le cas inverse , c.a.d. quand VarArrayCreate([0, -1], varVariant)
    au pire tu peux mettre prop.Value:=False;


    je me rend compte que mon Variant
    OfficeDesktop ne reste pas initialisé.
    c'est bien ce que je pensais

    FileToUrl ne fonctionne pas
    normal c'est une de mes vieilles fonctions maison (non unicode) dont voici le code
    à améliorer
    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
    function FileToURL(F : String) : String;
    var i : Word;
        R : String;
    begin
    R:='file:///'+SaveDialog1.FileName;
    // transforme le nom du fichier en adresse URL
    while (Pos('\',R)>0) do    {les \ en /}
      begin
        i:=Pos('\',R);
        Delete(R,i,1);
        Insert('/',R,i);
      end;
    while (Pos(' ',R)>0) do    {les espaces en %20}
      begin
        i:=Pos(' ',R);
        Delete(R,i,1);
        Insert('%20',R,i);
      end;
    result:=R;
    end;

  7. #7
    Membre averti
    Homme Profil pro
    Développeur delphi junior
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur delphi junior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Par défaut
    heu , dans mon cas je cache openoffice , donc non elle ne l'est pas je ne sais plus si on en a besoin dans le cas inverse , c.a.d. quand VarArrayCreate([0, -1], varVariant)
    au pire tu peux mettre prop.Value:=False;
    Dans la FAQ il ce n'est mis pour la lecture seule d'un fichier. J'ai quand même le params en false

    Edit : Je fait une rectification... mon objet OficeDesktop est bien initialisé mais lors du debug "OfficeDesktop = inconnu"
    je rappel son init : (OfficeDesktop est devenu OOBureau)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     OOBureau:= OOService.CreateInstance('com.sun.star.frame.desktop');
    Edit 2 : J'ai trouvé !!!! L'erreur venait du fait que lors de l'initialisation le :
    com.sun.star.frame.desktop
    devait être :
    com.sun.star.frame.Desktop maintenant le bureau de travail se créer correctement.

    Sujet Résolu merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problèmes d'impression de document avec pdf creator
    Par sergentgarcia dans le forum Word
    Réponses: 5
    Dernier message: 27/11/2007, 14h23
  2. Réponses: 1
    Dernier message: 29/05/2007, 00h00
  3. [GD] Problème de création d'image avec GD2
    Par Halex78 dans le forum Bibliothèques et frameworks
    Réponses: 15
    Dernier message: 31/03/2007, 15h46
  4. Réponses: 2
    Dernier message: 19/02/2006, 16h10
  5. [Ant] [Ejb] Probléme de création d'ejb avec Genic
    Par rivierem dans le forum JOnAS
    Réponses: 7
    Dernier message: 25/06/2004, 16h21

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