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 :

OLE Word mettre en gras une ligne et repasser en normal


Sujet :

C++Builder

  1. #1
    Membre Expert
    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 : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut OLE Word mettre en gras une ligne et repasser en normal
    Bonjour a tous!

    Je me lance dans la génération de document WORD via OLE à l'aide de l'excellente FAQ sur le sujet...

    Je débute en la matière, donc évidemment je suis très vite confronté a quelques problèmes :

    J'ai insérer des signet dans mon document word, et je souhaiterais ajouter plusieurs ligne de texte en mettant la première en gras pour obtenir quelque chose comme :

    NOM PRENOM
    3 rue des lilas
    75000 PARIS
    Pour ce faire je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    vBookMark = vBookMarks.OleFunction("Item", StringToOleStr("NomSignet"));
    vBookMark.OleFunction("Select");
    vContent = vBookMark.OlePropertyGet("Range");
    vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", true);
    vContent.OleFunction("InsertAfter", StringToOleStr("NOM PRENOM\n\n"));
    vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", false);
    vContent.OleFunction("InsertAfter", StringToOleStr("3 rue des lilas\n\n"));
    vContent.OleFunction("InsertAfter", StringToOleStr("75000 PARIS")) ;
    Malheureusement lorsque je fais ça, les 3 lignes sont en gras.
    Comment puis-je fais pour mettre uniquement la première ligne en gras?

    Merci d'avance...

  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
    Par défaut
    Salut sat83
    Je n'ai pas essaye mais je pense que tu a mal recopie le code sur ces deux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", true);
    //et
    vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", false);
    remplace " true " et " false " par la valeur " 9999998 ", les lignes de code deviennent conformement au code cite en reference
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", "9999998");  // true);
    //et
    vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", "9999998");  // false);

  3. #3
    Membre Expert
    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 : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    J'avais déja essayer en utilisant "9999998" en paramètre plutôt que true et false, mais malheureusement ca ne résout pas le problème.

  4. #4
    Membre Expert
    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 : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Pour écrire a l'emplacement de signets dans un document WORD, je m'était inspiré de cette page en utilisant InsertAfter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Variant vBookMark, vContent;
    vContent = vBookMark.OlePropertyGet("Range");
    vContent.OleFunction("InsertAfter", "texte");
    Finalement en utilisant l'instance vMSWord et TypeText, la mise en gras fonctionne correctement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", StringToOleStr("Bla Bla Bla")) ;
    Ce qui donne donc pour reprendre mon exemple de départ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    vBookMark = vBookMarks.OleFunction("Item", StringToOleStr("NomSignet"));
    vBookMark.OleFunction("Select");
    vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", true);
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", StringToOleStr("NOM PRENOM\n\n"));
    vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", false);
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", StringToOleStr("3 rue des lilas\n\n"));
    vMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", StringToOleStr("75000 PARIS")) ;
    Juste pour infos, la propriété Bold fonctionne également avec true ou false en paramètre (plutôt que la constante "9999998").

    _

  5. #5
    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
    Par défaut
    La constante "9999998" a ete recuperee dans le code visual basic, je pense quelle est plus appropriee que true ou false, je vois que tu te debrouille bien avec OleWord

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    Par curiosité, en regardant dans l'aide de Word, on trouve:
    Bold Property
    ...
    Can be set to True, False, or wdToggle. Read/write Long.
    Justement, wdToggle est un entier et vaut 9999998...

    Encore mieux, dans Word_2K.h et Word_XP.h, on a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef enum WdConstants
    {
      wdUndefined = 9999999, 
      wdToggle = 9999998,
      wdForward = 1073741823, 
      wdBackward = 0xC0000001, 
      wdAutoPosition = 0, 
      wdFirst = 1, 
      wdCreatorCode = 1297307460
    } WdConstants;
    D'où:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", 9999998);
    vMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", wdToggle);  // Avec #include <Word_ZZ.h>
    Ouf !!!

  7. #7
    Membre Expert
    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 : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Citation Envoyé par blondelle Voir le message
    La constante "9999998" a ete recuperee dans le code visual basic, je pense quelle est plus appropriee que true ou false, je vois que tu te debrouille bien avec OleWord
    De mon coté je trouve ça plus parlant d'utiliser les type primitif true/false dans le code pour bien définir si on veut veut passer en mode "BOLD" ou si on veut l'enlever. Plutôt que d'utiliser la même constante pour les deux actions.

    De plus, l'utilisation de chaîne de caractères dans les fonctions Ole provoque systématiquement des fuites de mémoires, ce qui n'arrive pas avec les types primitifs. Je m'étais confronté a ce problème il y a quelques temps.

    Par exemple :

    Ce code ne provoque pas de fuites de mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    wchar_t *vText= StringToOleStr( "BlablaBla");
    aMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", true);
    aMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", vText);
    aMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", false);
    SysFreeString(vText);
    Ce code provoque des fuites de mémoires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    wchar_t *vText= StringToOleStr( "BlablaBla");
    aMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", "9999998");
    aMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", vText);
    aMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", "9999998");
    SysFreeString(vText);
    En utilisant des entier, ce code ne provoque plus de fuites de mémoires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    wchar_t *vText= StringToOleStr( "BlablaBla");
    aMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", 9999998);
    aMSWord.OlePropertyGet("Selection").OleProcedure("TypeText", vText);
    aMSWord.OlePropertyGet("Selection").OlePropertyGet("Font").OlePropertySet("Bold", 9999998);
    SysFreeString(vText);
    Ma conclusion personnel :
    Utiliser un maximum les types primitifs, et si on dois utiliser des chaines de caractères utiliser SysFreeString pour bien les libérer.

    [EDIT:] D'ailleurs je pense qu'il pourrait être utile de modifier la FAQ en privilégiant les type primitifs quand c'est possible, comme mettre 9999998 plutot que "9999998"...

  8. #8
    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
    Par défaut
    C'est bien un entier et non une chaine qui doit etre passe en parametre

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/07/2014, 14h41
  2. Mettre en gras une ligne dans un Zend_Form_Element_Textarea
    Par TsCyrille dans le forum Zend_Form
    Réponses: 3
    Dernier message: 20/06/2012, 11h00
  3. mettre en gras quelques ligne d'une JList
    Par interhossa007 dans le forum Composants
    Réponses: 3
    Dernier message: 28/11/2008, 17h00
  4. [VB et Word] Se déplacer d'une ligne vers le bas...
    Par benj63 dans le forum VBA Word
    Réponses: 7
    Dernier message: 15/03/2006, 09h45
  5. [JTable] Mettre en couleur une ligne de ma JTable
    Par cedricbr dans le forum Composants
    Réponses: 3
    Dernier message: 03/03/2006, 12h47

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