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

C++Builder Discussion :

Pilotage OLE WORD : masquer message de Word


Sujet :

C++Builder

  1. #1
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut Pilotage OLE WORD : masquer message de Word
    Bonjour a tous,

    Mon programme génère un document Word via OLE en utilisant les signets. Le problème est qu'après un certain nombre d'insertions, un message de WORD apparait :
    Espace mémoire insuffisant. Une fois terminée, cette action ne pourra pas être annulée. Continuez?
    Je clique sur "Oui" et la génération de mon document se termine normalement.

    Je recherche un moyen de ne pas afficher ce message pour éviter à l'utilisateur de devoir répondre à cette question.

    J'ai essayer un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vMSWord.OlePropertySet("DisplayAlerts", false);
    qui n'a aucun effet.

    Pour infos le document généré n'est pas très lourd (entre 100 et 500Ko), la mémoire et le CPU du PC n'est pas saturée. Par contre c'est vrai que j'insère plusieurs centaines de ligne de textes.

    Avez vous une idée pour eviter que ce message n'apparaisse?

    Merci d'avance
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut sat83
    J'ai eut un probleme similaire lors de l'utilisation d'Excel/Word pour un Mailing, comme ces Boites de dialogue sont gerees par Excel/Word on n'arrive pas a avoir la main dessus dans notre programme.
    La solution que j'avais trouve etait d'ouvrir un Thread de tester l'ouverture de la boite et de simuler l'appuie du Button "ok", pour moi l'ouverture etait systemetique.
    Peut etre un Thread et un Timer qui ferme le Thread apres un delai si la boite n'apparait pas, si elle apparait on ferme la boite et on quitte le Thread
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  3. #3
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Bonsoir
    Je ne suis pas convaincu par cette solution de thread simulant l'appui sur un bouton
    dans le cas du code présenté par blondelle ja'i constaté une petite erreur et
    je l'ai modifié en m'inspirant de la documentation Microsoft
    la nouvelle expression facultative associe une source de données dans le document spécifié. Cela devient un document principal si elle ne l'est pas déjà.
    Sub OpenDataSource(Name As String, [Format], [ConfirmConversions], [ReadOnly], [LinkToSource], [AddToRecentFiles], [PasswordDocument], [PasswordTemplate], [Revert], [WritePasswordDocument], [WritePasswordTemplate], [Connection], [SQLStatement], [SQLStatement1], [OpenExclusive], [SubType...
    Pour trouver ces informations sur la méthode OpenDataSource , procédez comme suit :

    1. Dans Microsoft Office Word 2003 et dans Microsoft Word 2002, pointez sur macro dans le menu Outils , puis cliquez sur Visual Basic Editor .

    Dans Microsoft Word 2007, cliquez sur l'onglet développeur , puis cliquez sur Visual Basic dans le groupe code .
    2. Dans Visual Basic Editor, cliquez sur Explorateur d'objets dans le menu Affichage .
    3. Dans la zone de recherche de texte , tapez OpenDataSource et puis cliquez sur Rechercher .

    Expression [SubType] facultative
    Le paramètre [SubType] est un facultatif valeur de type Variant qui détermine la méthode que Word utilise pour ouvrir une source de données. Il est une des contraintes WdMergeSubType. Pour que Word utilisent les mêmes méthodes de connexion en tant que dans les versions antérieures de Word, à savoir dynamique de données (DDE) pour des sources de données Microsoft Access et Microsoft Excel, utilisez SubType: = wdMergeSubTypeWord2000.

    WdMergeSubType contraintes sont les suivants :
    wdMergeSubTypeAccess
    wdMergeSubTypeOAL
    wdMergeSubTypeOLEDBText
    wdMergeSubTypeOLEDBWord
    wdMergeSubTypeOther
    wdMergeSubTypeOutlook
    wdMergeSubTypeWord
    wdMergeSubTypeWord2000
    wdMergeSubTypeWorks
    en utilisant ainsi ce nouveau paramètre Word ne me pose plus de questions à savoir quelle donnée utiliser dans le fichier Excel
    j'ai crée une base de donnée excel contenant plus de 5000 entrées et word fait son travail de merging sans aucune problème (Résutat :création d'un document de 5000 pages !!!)
    ci dessous le code 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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit17.h"
    #include <utilcls.h>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm17 *Form17;
    Variant vMSWord, vWDocuments, vWDocument;
    //---------------------------------------------------------------------------
    __fastcall TForm17::TForm17(TComponent* Owner)
    	: TForm(Owner)
    {
      Button2->Visible = false;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm17::Button1Click(TObject *Sender)
    {
     try
    		{
    //    vMSWord = Variant::GetActiveObject("Word.Application");
    	vMSWord = Variant::CreateObject("Word.Application");
    		}
    catch(...)
    		{
    	vMSWord = Variant::CreateObject("Word.Application");
    		}
    vMSWord.OlePropertySet("Visible", true);
    //vFileName = "c:\\Debut de lettre.doc";
    //vWDocuments = vMSWord.OlePropertyGet("Documents");
    //vWDocument = vWDocuments.OleFunction("Open", vFileName);
    vWDocuments = vMSWord.OlePropertyGet("Documents");
    vWDocument = vWDocuments.OleFunction("Add");
    Button2->Visible = true;
    if (Form17->Visible) // mettre l'appli toujours au premier plan
      {
    Form17->Visible = true;
    Form17->BringToFront();
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm17::Button2Click(TObject *Sender)
    {
      Variant Address, ReturnAddress, AutoText;
    Address = "";
    ReturnAddress = "";
    AutoText = "";
    // on va effectuer un mailling Enveloppe
    vWDocument.OlePropertyGet("MailMerge").OlePropertySet("MainDocumentType", 2); // wdEnvelopes = 2
    // type d'enveloppe
    vWDocument.OlePropertyGet("Envelope").OlePropertySet("DefaultSize", "DL");
    // initialisation a "" expediteur, destinataire
    vWDocument.OlePropertyGet("Envelope").OleProcedure("Insert", false, Address, AutoText, false, ReturnAddress);
    // parametrage et affichage expediteur
    vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Size", 8);
    vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Name", "Arial");
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", "blondelle jean-pierre");
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeParagraph");
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", "chemin xxxx");
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeParagraph");
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", "quartier xxxx");
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeParagraph");
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", "30000 xyxyxyxy");
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeParagraph");
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", "France");
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeParagraph");
    // on se positionne sur la fenetre destinataire
    vWDocument.OlePropertyGet("Envelope").OlePropertyGet("Address").OleProcedure("Select");
    vMSWord.OlePropertyGet("Selection").OleProcedure("MoveDown", 5, 2); // wdLine = 5, Count = 2
    // affichage des parametres de fusion
    vWDocument.OlePropertyGet("MailMerge").OlePropertyGet("Fields").OleProcedure("Add", vMSWord.OlePropertyGet("Selection").OlePropertyGet("Range"), "Prenom");
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", " ");
    vWDocument.OlePropertyGet("MailMerge").OlePropertyGet("Fields").OleProcedure("Add", vMSWord.OlePropertyGet("Selection").OlePropertyGet("Range"), "Nom");
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeParagraph");
    vWDocument.OlePropertyGet("MailMerge").OlePropertyGet("Fields").OleProcedure("Add", vMSWord.OlePropertyGet("Selection").OlePropertyGet("Range"), "ADRESSE");
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeParagraph");
    vWDocument.OlePropertyGet("MailMerge").OlePropertyGet("Fields").OleProcedure("Add", vMSWord.OlePropertyGet("Selection").OlePropertyGet("Range"), "CODE_POSTAL");
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", " ");
    vWDocument.OlePropertyGet("MailMerge").OlePropertyGet("Fields").OleProcedure("Add", vMSWord.OlePropertyGet("Selection").OlePropertyGet("Range"), "Ville");
    Variant PasswordDocument, PasswordTemplate, WritePasswordDocument, WritePasswordTemplate, SQLStatement, SQLStatement1,SubType;
    PasswordDocument = "";
    PasswordTemplate = "";
    WritePasswordDocument = "";
    WritePasswordTemplate = "";
    SQLStatement = "";
    SQLStatement1 = "";
    SubType=8; // wdMergeSubTypeWord2000   Nouveau paramètre
    String Chemin, Connection;
    Chemin = "C:\\tableau.xls";
    Connection = "Feuille de calcul entière";
    // ouverture de la source
    // une boite de dialogue s'affiche
    vWDocument.OlePropertyGet("MailMerge").OleProcedure("OpenDataSource", Chemin.c_str(), 1, false, true, false, false, PasswordDocument, PasswordTemplate, false, WritePasswordDocument, WritePasswordTemplate, Connection.c_str(), SQLStatement, SQLStatement1, false,SubType); // Appel à la fonction OpenDataSource modifiée
    // parametre de l'adresse Gras, Times New Roman, Size 16
    vWDocument.OlePropertyGet("Envelope").OlePropertyGet("AddressStyle").OlePropertyGet("Font").OlePropertySet("Bold", true);
    vWDocument.OlePropertyGet("Envelope").OlePropertyGet("AddressStyle").OlePropertyGet("Font").OlePropertySet("Name", "Times New Roman");
    vWDocument.OlePropertyGet("Envelope").OlePropertyGet("AddressStyle").OlePropertyGet("Font").OlePropertySet("Size", 16);
    // caracteres en majuscules
    vWDocument.OlePropertyGet("Envelope").OlePropertyGet("AddressStyle").OlePropertyGet("Font").OlePropertySet("AllCaps", 9999998);
    // on fusionne
    vWDocument.OlePropertyGet("MailMerge").OleProcedure("Execute", false);
    PasswordDocument=Unassigned;
    PasswordTemplate=Unassigned;
    WritePasswordDocument=Unassigned;
    WritePasswordTemplate=Unassigned;
    SQLStatement=Unassigned; // ne pas oublier de libérer les variants de type variables locales
    SQLStatement1=Unassigned;
    SubType=Unassigned;
    Address=Unassigned;
    ReturnAddress=Unassigned;
    AutoText=Unassigned;
    
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm17::Button4Click(TObject *Sender)
    {
      Application->Terminate(); 
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm17::Button3Click(TObject *Sender)
    {
       vWDocuments.OleFunction("Close", NULL, NULL);
        vMSWord.OleFunction("Quit");
    	// on libere tous les Variants de type variable globale
    	vMSWord = Unassigned;
    	vMSWord = Unassigned;
    	vWDocument= Unassigned;
    }
    //---------------------------------------------------------------------------
    Bien que ne connaissant par coeur tous les fonctions de Word je reste persuadé qu'il y a une similitude avec le problème que tu nous a exposé

    Bonne chance dans tes recherches

    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Merci DjmSoftware pour ton explication, je testerais le code que tu a modifie, j'avais enregistre les macro a l'aide de l'enregistreur automatique et probablement pas lu correctement l'aide en ligne, la solution du thread (qui cela dit fonctionne parfaitement) permetait de ne pas etre bloque en attendant de trouver une autre solution
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

Discussions similaires

  1. [WORD] pilotage ole Delphi
    Par missmarion dans le forum API, COM et SDKs
    Réponses: 19
    Dernier message: 28/09/2010, 11h19
  2. pilotage OLE : Builder -> Word -> pdf
    Par LotfiB dans le forum C++Builder
    Réponses: 18
    Dernier message: 22/02/2009, 18h52
  3. Pilotage OLE WORD - Remplacer des termes-
    Par bru-no dans le forum C++Builder
    Réponses: 10
    Dernier message: 19/03/2007, 22h51
  4. Pilotage OLE Word avec Visual C++
    Par baka02 dans le forum MFC
    Réponses: 2
    Dernier message: 20/03/2006, 13h04
  5. Pilotage Ole de word
    Par beauchastel dans le forum Langage
    Réponses: 6
    Dernier message: 10/01/2006, 10h43

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