Acquerir un Style de Word
Bonjour:D
Je cherche a récupérer les noms de style du paragraphe courant en C++.
J'ai initialisé le paragraphe courant et les variables qui y sont attachées par les instructions:
Code:
1 2 3 4
|
m_pCurrentRange->get_Case(& BlocCase);
m_pFormat = m_pCurrentParagraph->get_Format();
tagVARIANT Style = m_pCurrentParagraph->get_Style(); |
mais les résultats sont constants, quelque soit le style du paragraphe.
Quelqu'un pourrait il m'aider?:ccool:
Selection mal reconnu par le compilateur
Bonjour, et merci pour votre élément de réponse:D
La piste est prometteuse. Cependant l'instruction Selection est jugé par le compilateur utilisation impropre du typedef 'selection'
Pouvez vous m'aider, ce serait :ccool:
Toujours à la recherche de la bonne solution
Bonjour,:D
J'ai toujours votre lien dans mon navigateur
Il m'a convaincu que WordApplication et OLE étaient équivalent
dans Word_2k.h j'ai trouvé des éléments qui m'attirent
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
public:
virtual HRESULT STDMETHODCALLTYPE get_Application(Word_2k::WordApplication** prop/*[out,retval]*/) = 0; // [1000]
virtual HRESULT STDMETHODCALLTYPE get_Creator(long* prop/*[out,retval]*/) = 0; // [1001]
virtual HRESULT STDMETHODCALLTYPE get_Parent(LPDISPATCH* prop/*[out,retval]*/) = 0; // [1002]
virtual HRESULT STDMETHODCALLTYPE get_Index(long* prop/*[out,retval]*/) = 0; // [1]
virtual HRESULT STDMETHODCALLTYPE get_Name(BSTR* prop/*[out,retval]*/) = 0; // [2]
virtual HRESULT STDMETHODCALLTYPE set_Name(BSTR prop/*[in]*/) = 0; // [2]
virtual HRESULT STDMETHODCALLTYPE get_StyleName(BSTR* prop/*[out,retval]*/) = 0; // [3]
virtual HRESULT STDMETHODCALLTYPE get_Value(BSTR* prop/*[out,retval]*/) = 0; // [0]
virtual HRESULT STDMETHODCALLTYPE set_Value(BSTR prop/*[in]*/) = 0; // [0]
virtual HRESULT STDMETHODCALLTYPE Delete(void) = 0; // [101]
virtual HRESULT STDMETHODCALLTYPE Insert(Word_2k::Range* Where/*[in]*/,
VARIANT* RichText/*[in,opt]*/,
Word_2k::Range** prop/*[out,retval]*/) = 0; // [102] |
en en particulier la méthode getStyleName() qui correspond précisément à mon besoin.
Moi je dirai que si un style commence par "Titre", il doit être mis dans les Univers
J'ai donc mis dans mon code les lignes suivantes
Code:
1 2 3
|
Word_2k::WordApplication WordAppli = m_pWordApplication->get_Application();
wsStyle = WordAppli->getStyleName(); |
mais le compilateur n'est pas content
je vous livre ses diagnostiques ci-dessous:
Code:
1 2 3 4 5 6
|
[C++ Avertissement] WordReader.cpp(999): W8006 Initialisation de Word_2k::WdInformation avec int
[C++ Erreur] WordReader.cpp(1002): E2352 Impossible de créer une instance de la classe abstraite '_Application'
[C++ Erreur] WordReader.cpp(1002): E2353 La classe '_Application' est abstraite parce que '__stdcall _Application::get_Application(_Application * *) = 0'
[C++ Erreur] WordReader.cpp(1002): E2034 Impossible de convertir '_ApplicationPtr' en '_Application' |
Que pouvons nous faire pour le mettre d'accord
ce sera :ccool:
Demende de complements sur la Faq
Bonjour, :D
J'ai exploité les données de la Faq Word et j'y ai trouvé ce qu'il fallait pour ouvrir un document et le clore, mais je n'ai rien vu sur la lecture d'un paragraphe et la gestion du pointeur sur le texte, qui sont mes besoins de base
Comment trouver ces renseignements, ce serait :ccool:
La Faq et l'implémentation
Bonjour, et merci encore pour ton suivi:P
J'ai modifié un peu l'initialisation pour tenir compte des observations du débugger
voici le bloc de code que j'ai implémenté:
Code:
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
|
ErrorCode = INIT_NO_ERROR;
try
{
if( bIsConnected == false)
{
bIsConnected = false;
// sinon on ouvre Word
vMSWord = Variant::CreateObject("Word.Application");
vMSWord.OlePropertySet("Visible", true); // ("Visible", false)
ErrorCode = INIT_NO_ERROR;
}
if(ErrorCode == INIT_NO_ERROR)
bIsConnected = true;
else if( ErrorCode == E_INVALIDARG)
bIsConnected = false;
else if( ErrorCode == E_UNEXPECTED)
bIsConnected = false;
}
catch(Exception &exception)
{
bIsConnected = false;
ErrorCode = objStrConv.CreateReturnCode(TYPE_ERROR, MSG_CANT_START_WORD_API,MODULE_ID_WORD_READER,
MODULE_ID_WORD_READER, START_WORD_API,
CANT_START_WORD_API);
}
return ErrorCode; |
Si on prend le bloc de code de la FAQ, dans mon implémentation, on butte sur
l'instruction GetActiveObjet qui renvoi au catch de l'appelant et pas à celui de la fonction.
L'inconvénient de cette procédure c'est qu'en test on ouvre autant de Word qu'on passe sur le démarrage de l'api. opérationnellement ce n'est pas problématique car si l'utilisateur à un doc ouvert il est pertinent d'ouvrir le document de l'application dans une autre instance de Word.
Ce choix n'est pas définitif, et je reviendrai peut-être à ton implémentation ultérieurement.
J'ai implémenté le code de la FAQ pour l'Open:
Code:
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
|
AnsiString NomDocument;
erc ErrorCode;
ErrorCode = INIT_NO_ERROR;
NomDocument = WideCharToString((wchar_t *) wsFullPathName.c_str());
try
{
vFileName = NomDocument;
vLink = Unassigned;
vReadOnly = false; // lecture seule
vFormat = Unassigned;
vReadPass = Unassigned; // mot de passe du document
vWDocuments = vMSWord.OlePropertyGet("Documents");
// ici on charge un document sur la feuille
vWdDocument = vWDocuments.OleFunction("Open", vFileName, vLink, vReadOnly, vFormat, vReadPass);
}
catch(...)
{
ErrorCode = objStrConv.CreateReturnCode(TYPE_ERROR, MSG_CANT_OPEN_DOCUMENT,MODULE_ID_WORD_READER,
MODULE_ID_WORD_READER, OPEN_DOCUMENT,
CANT_OPEN_DOCUMENT);
}
if (ErrorCode == INIT_NO_ERROR)
{
m_bDocumentIsOpen = true;
}
return ErrorCode;
} |
et je sort avec l'erreur EOleSysError, Type de variable incorrect. J'ai essayé avec open en minuscule même résultat et dans le code de sysvari.h, on voit que l'arg[0] est null. est ce normal ?
Ce sera :ccool: d'avoir ta réponse
J'ai tout déclaré en Variant
Bonjour,:P
J'ai tout déclaré en variant voilà le bloc de déclaration:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
Variant vMSWord;
Variant vWDocuments;
Variant vFileName;
Variant vLink;
Variant vReadOnly;
Variant vFormat;
Variant vReadPass;
Variant vWdDocuments;
Variant vWdDocument;
long m_lNumberOfParagraphs;
long m_lNumberOfWords;
extern CWReader *pReader;
extern CStrConv objStrConv;
bool bIsConnected; |
J'ai modifié la déclaration de NonDocument pour le faire passer en variant.
Je l'affecte une seul fois par le chemin absolue de mon document: "E:\\usr\\thèse\\Tailgate\\Spx\\tailgate.doc" et cette valeur est présente dans tous les variables observées.
Mais le statut est le même, plantage au même endroit.