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 :

Delphi Comment coller sous OpenOffice ? (marche pas)


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Par défaut Delphi Comment coller sous OpenOffice ? (marche pas)
    Bonjour à tous,
    je suis en train de faire un petit programme et dans la fin de mon programme je dois pouvoir copier les informations que j'ai dans un mémo et les coller dans un tableur Openoffice Calc.

    Pour se faire, j'ai suivi la doc:
    http://delphi.developpez.com/faq/?page=openoffice

    En particulier ceci et ceci:
    http://delphi.developpez.com/faq/?pa...engeneconnecte
    http://delphi.developpez.com/faq/?pa...lleropenoffice


    Malheureusement au moment de compiler j'obtiens des erreurs.

    Voici le code du lien numéro 3 que j'ai inséré dans mon code après avoir au préalablement ajouter (comme cela est noté dans le lien 2) :

    -ajouter ComObj aux uses
    -Déclarer les variables globales openOffice (OpenOffice Document)
    -ajouter ceci au code de la Faq(cfr lien 2):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        if  VarIsEmpty(OpenOffice) then
            OpenOffice := CreateOleObject('com.sun.star.ServiceManager');
    LE copié collez venant de la Faq et modifié:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    procedure TForm1.PasteClipBoard;
    var
       OOoServer, OOoDesktop, OOoDocument,
       OOoClip, OOoClipContents, OOoTypes, VariantArr: Variant;
    
       I: Integer;
    
       AStr: String;
    
    begin
    
    if  VarIsEmpty(OpenOffice) then
            OpenOffice := CreateOleObject('com.sun.star.ServiceManager');//rajouté par moi pour me connecter cfr lien 2
    
       // On vérifie qu'il n'y a pas déja un service openoffice d'instancié
       if not isNullEmpty(OOoServer) then
          OOoServer := Unassigned;
    
       Screen.Cursor:= crHourglass;
       try
          OOoServer    := CreateOleObject('com.sun.star.ServiceManager');
          OOoDesktop    := CreateUnoService('com.sun.star.frame.Desktop');
    
          // On crée un tableau de variant qui contiendra la propriété "cachée" du document
          VariantArr := VarArrayCreate([0, 0], varVariant);
          VariantArr[0] := OOoServer.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
          VariantArr[0].Name := 'Hidden';
          VariantArr[0].Value := True;
    
          OOoDocument := OOoDesktop.LoadComponentFromURL('private:factory/swriter','_blank',0,VariantArr);
       finally
          Screen.Cursor:= crDefault;
       end;
    
       try
              databrut.SelectAll; // on sélectionne tout le memo //deux lignes ajoutées par moi-même
              databrut.CopyToClipboard; // on l’envoie dans le presse-papiers
    
    
          // On instancie le service openoffice gérant le presse papier
          OOoClip := CreateUnoService('com.sun.star.datatransfer.clipboard.SystemClipboard');
    
          // On récupère le contenu de presse papier
          OOoClipContents := OOoClip.getContents;
    
          // On récupère les formats de données compatibles: Unicode-Text, Richtext, Bitmap, HTML-Text
          OOoTypes := OOoClipContents.getTransferDataFlavors;
    
          // L'objet récupéré nous donne accès aux propriétés:
          // HumanPresentableName : le nom du format des données façon "intelligible" ex.: Unicode-Text
          // MimeType : le nom du format des données ex.: text/plain;charset=utf-16
          // DataType : le nom des classes d'objet à utiliser pour la conversion ex.: String
    
          AStr := '';
          For I := VarArrayLowBound(oTypes, 1) to VarArrayHighBound(oTypes, 1) do
          begin
             // Ce qui nous intéresse, c'est de récupérer une chaine
             // donc on s'arrete dés que l'on a trouvé une données de type chaine
             if oTypes[i].HumanPresentableName = 'Unicode-Text' then
             begin
                // getTransferData retourne un variant, mais comme on sait que c'est une chaine on caste la valeur de retour.
                AStr := String(oClipContents.getTransferData(oTypes[i])) + #13#10;
                break;
             end;
          end;
          // Appel de la fonction getText qui retourne l'ensemble du texte du document sous forme d'objet,
          // sur lequel on appelle la fonction setString qui écrase le contenu par la valeur chaine         
          OOoDocument.getText.setString(AStr);
       except
          on e:Exception do
             ShowMessage(e.Message + #13#10 + e.ClassName);
       end;
    end;

    La première erreur qui me parvient du compilateur est que isNullEmpty n'est pas déclaré. en le remplaçant comme un peu plus haut par VarIsEmpty le compilateur accepte.

    La seconde erreur pour le comparateur a été CreateUnoService, j'ai fais des recherches sur le web mais pas moyen de trouver comment solutionner et essayer de comprendre sur base de mes connaissances.

    Alors pas content j'ai essayer d'ouvrir un simple document ooocalc en suivant les FAQ openoffice pour voir si déja cela fonctionne:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    procedure Tmagic_tree.Button1Click(Sender: TObject);
    var
        OpenDesktop : Variant;
        LoadParams : Variant;
    begin
         if  VarIsEmpty(OpenOffice) then
            OpenOffice := CreateOleObject('com.sun.star.ServiceManager');
    
       OpenDesktop := OpenOffice.createInstance('com.sun.star.frame.Desktop');
       LoadParams := VarArrayCreate([0, -1], varVariant);
       Document := openDesktop.LoadComponentFromURL( 'private:factory/scalc', '_blank', 0,  LoadParams);
    end;
    ce code a fonctionné, et j'ai donc fait un lien entre OpenOffice.createInstance et CreateUnoService. En le remplacant CreateUnoService par OpenOffice.createINstance dans mon premier code le compilateur ne buggait plus.. (ouéé... ou pas).

    ensuite les deux variables suivantes non déclarée qui mon été rapportée par Delphi étaient:
    oTypes :
    oClipContents :
    (errreur variables non déclarées)
    pour se faire je les ai déclarées comme Variant localement .

    Une fois tout ceci fait; mon Delphi (6) arrrive enfin a compilé. mais lorsque j'appuye sur mon button pour lancer la procédure. rien ne se lance. je me doute que c 'est du a mes modifications.. mais je suis incapabable de dire à cause de laquel.

    Et vous?
    merci l'aide que vous pourrez me fournir. si vous avez besoin de plus d'information n'hésitez pas.

    Merci

  2. #2
    Membre expérimenté
    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 : 46
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Par défaut
    Salut,
    désolé il me semblait avoir fournis tout le code à la faq....mais bon ça remonte à longtemps donc voici les fonctions que j'utilise:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    function IsNullEmpty(AObject: Variant): Boolean;
    begin
        Result := VarIsEmpty(AObject) or VarIsNull(AObject) or VarIsClear(AObject);
    end;
     
    function CreateUnoService(const AServiceName: String): Variant;
    begin
        try
            Result := AApp.createInstance(AServiceName);
        except
        end;
    end;
     
    procedure StartOpenOffice;
    begin
        try
            if not IsNullEmpty(AApp) then
                AApp := Unassigned;
            AApp := CreateOleObject('com.sun.star.ServiceManager');
            ADeskTop := CreateUnoService('com.sun.star.frame.Desktop');
            AUno := CreateUnoService('com.sun.star.frame.DispatchHelper');
            ALocale := CreateUnoService('com.sun.star.Lang.Locale');
        except
            on E: Exception do
            begin
                AApp := Unassigned;
                Abort;
            end;
        end;
    end; 
     
    function PasteClipBoard: String;
    var
        OOoClip, OOoClipContents, OOoTypes: Variant;
        I: Integer;
    begin
        Result := '';
        try
            OOoClip := CreateUnoService('com.sun.star.datatransfer.clipboard.SystemClipboard');
     
            OOoClipContents := OOoClip.getContents;
            OOoTypes := OOoClipContents.getTransferDataFlavors;
            For I := VarArrayLowBound(OOoTypes, 1) to VarArrayHighBound(OOoTypes, 1) do
            begin
                if OOoTypes[i].HumanPresentableName = 'Unicode-Text' then
                begin
                    Result := String(OOoClipContents.getTransferData(OOoTypes[i])) + #13#10;
                    Break;
                end;
            end;
        except
            on E: Exception do
            begin
                CTErrorDlg('OfficeReportCreation', [E.Message]);
                Abort;
            end;
        end;
    end;
    A toi de voir pour ce que tu recherche dans le presse-papier avec le "HumanPresentableName" (comme je le dis dans l'article)

    Faut que je retrouve le mail que j'avais envoyé à la faq pour corrigé cet erratum......

Discussions similaires

  1. Copier coller qui ne marche pas d'un classeur à un autre
    Par longuy31 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/06/2010, 12h02
  2. Réponses: 1
    Dernier message: 20/04/2009, 15h22
  3. [E-07] Copier/Coller qui ne marche pas
    Par bdx-77 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/12/2008, 07h00
  4. Image visible sous condition: marche pas !
    Par docjo dans le forum IHM
    Réponses: 7
    Dernier message: 23/04/2008, 23h19

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