Pour commencer un tuto sur le site
et le lien sur la FAQ
Pour commencer un tuto sur le site
et le lien sur la FAQ
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
Bonjour,
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
Salut JeanNoel53
Que veux tu faire exactement sur la manipulation des paragraphes, l'ideale si tu sais manipuler VB Word c'est de poster un bout de code Visual basic
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
Bonjour,
Mon application actuelle lit un document Word bloc par bloc. Un bloc est constitué du test qui précède un retour chariot, soit un paragraphe.
Pour chaque paragraphe, il analyse le style et le format du texte
Je dois donc avoir l'équivalent sous OLE et si j'ai bien trouvé dans les liens que tu a fourni jusqu'à présent j'ai tout ce qui faut pour le style et le format. Mis je n'ai rien sur le read text ni sur la gestion du curseur sur le bloc courant.
La partie Layout est facile pour moi à convertir avec ce que j'ai sur le net
La difficulté pour moi est dans InitializePointBloc, GoNextBloc et ReadBloc
ce serait d'avoir ces informations.
La partie Layout est facile pour moi à convertir avec ce que j'ai sur le net
La difficulté pour moi est dans InitializePointBloc, GoNextBloc et ReadBloc
Pour le link je link avec Trois librairies borland
bcbaxserver, memmanager et OLE32
Par contre le module est au coeur d'une DLL qui parle à l'application maîtresse
La il faut proceder par etape et traduire un module, on commence par " InitializePointBloc " que doit executer ce module
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
Bonjour,
Quels sont les références sur ce sujet?
Que doit executer ton module " InitializePointBloc "
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
Bonjour,
voici le besoin
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 /*---------------------------------------------------------------*/ /*Name : InitializePointBloc */ /*---------------------------------------------------------------*/ /*Role : Point on bloc of text in the document */ /*Preconditions : The document is open */ /*In : Nothing */ /*InOut : Nothing */ /*Resources : MS WORD API */ /*Return : Error code */ /*Constraints : */ /*Behavior : */ /*---------------------------------------------------------------*/ // //PROC InitializePointBloc //DO // IF(Document is not empty) THEN // [Point on the first available Bloc] // ELSE // [Error code ="Empty document"] // FI //OD
Je ne comprend pas ce que tu veux, que represente Bloc
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
Dans ce cas le bloc est une portion de texte limité par un retour chariot, soit le texte présent entre deux retour chariot acceptant la convention que le début du document et la fin du document ont le même rôle que le retour chariot.
Pour Word une chaine de caracteres terminee par un retour chariot est un paragraphe, pour selectionner un paragraphe et placer le curseur au debut ou a la fin du paragraphe voici le code
si c'est pour un paragraphe quelconque et le curseur place n'importe ou dans ce paragraphe ceci suffit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 // OleFunction("Item", 1) represente le paragraphe 1 vWDocument.OlePropertyGet("Paragraphs").OleFunction("Item", 2).OlePropertyGet("Range").OleFunction("Select"); // on place le curseur au debut du paragraphe vMSWord.OlePropertyGet("Selection").OleFunction("MoveLeft", 2, 1); // on place le curseur a la fin du paragraphe vMSWord.OlePropertyGet("Selection").OleFunction("MoveRight", 2, 1);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 // on place le curseur au debut du paragraphe vMSWord.OlePropertyGet("Selection").OleFunction("MoveLeft", 2, 1); // on place le curseur a la fin du paragraphe vMSWord.OlePropertyGet("Selection").OleFunction("MoveRight", 2, 1);
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
Bonjour,
D'abord des chaleureux remerciement pour l'aide déjà apportée.
J'ai retenu la première proposition pour InitPointBloc et j'ai réussi à régénérer la DLL de lecture Word. J'ai donc commencé a tester et j'ai buté sur la première requête OLE avec une exception EOLESysError avec le message "opération non disponible"
je met le code ci-dessous
C'est la première des requêtes OLE.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 vMSWord = Variant::GetActiveObject("Word.Application");
Peut être aurais je du faire quelque chose avant, ou ma requête est elle mal formée?
Je serait bien de savoir
Le code s'ecrit comme ceci, on verifie que Word n'est pas deja ouvert ce qui evite d'avoir plusieur fois l'application ouverte
En essayant le programme en mode pas a pas en passant par le try...catch une exeption est levee et le debuger nous previent, en mode programme cette exeption est egalement levee mais rien ne l'indique c'est un comportement normal, c'est pour cela que je mets en commentaire cette ligne pour mes essais
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 try { // ici on regarde si Word est deja ouvert vMSWord = Variant::GetActiveObject("Word.Application"); } catch(...) { // sinon on ouvre Word vMSWord = Variant::CreateObject("Word.Application"); }
donc tu click OK pour signaler que tu a vue l'execption et tu verra que ton programme reprend dans le catch// vMSWord = Variant::GetActiveObject("Word.Application");
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
Bonjour, et merci encore pour ton suivi
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é:
Si on prend le bloc de code de la FAQ, dans mon implémentation, on butte sur
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 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;
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:
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 ?
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 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; }
Ce sera d'avoir ta réponse
comment a tu declare tes variables
vLink
vReadOnly
vFormat
vReadPass
l'ideale est d'avoir declare ses variables en Variant
pour NomDocument essaie pour les essais de le declarer comme ceci " c:\\nom de chemin " declare en Variant si cela passe sans erreur il faut modifier une seule chaine a la fois sinon cela devient difficile a debugger
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
Bonjour,
J'ai tout déclaré en variant voilà le bloc de déclaration:
J'ai modifié la déclaration de NonDocument pour le faire passer en variant.
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 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;
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.
tu peu essayer
on ne sais jamaisWideString(vFileName)
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
Bonjour,
Je suis toujours tes conseils avec intéret
J'ai essayé ta proposition
Je te joins le code dans lequel se produit l'erreur, car elle ne provient peut-être pas du nom de fichier.
Dans ce code le premier argument de Args est null.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 template <class P1, class P2, class P3, class P4, class P5> Variant Variant::OleFunction(const String& name, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { TAutoArgs<5> args; args[1] = p1; args[2] = p2; args[3] = p3; args[4] = p4; args[5] = p5; return OleFunction(name, static_cast<TAutoArgsBase*>(&args)); }
Je n'ai pas réussi a atteindre la fonction OleFunction( name, static cast(...))
je vous remercie à nouveau du suivi que vous apportez à ce problème, c'est
Bonjour
J'ai essayé la faq en dll, en normal et en static ,en le mettant dans le produit, et l'erreur ci dessus s'est reproduite.
Ma conclusion est que la Faq ne marche pas. Je laisse les responsables du site le soin de l'infirmer ou de modifier la faq.
Comme les titres ont une morphologie différente des paragraphe, j'ai extrait l'information de la morphologie du texte
Et donc de ce fait le problème est résolu
à+
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager