Pour commencer un tuto sur le site
et le lien sur la FAQCitation:
Version imprimable
Pour commencer un tuto sur le site
et le lien sur la FAQCitation:
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:
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
Bonjour, :D
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 :ccool: 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
Bonjour,:P
Quels sont les références sur ce sujet?
:ccool:
Que doit executer ton module " InitializePointBloc "
Bonjour,
voici le besoin
Code:
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
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 suffitCode:
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:
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);
Bonjour,:P
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:
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 :ccool:
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 essaisCode:
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 catchCitation:
// vMSWord = Variant::GetActiveObject("Word.Application");
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é:
Si on prend le bloc de code de la FAQ, dans mon implémentation, on butte surCode:
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:
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 :ccool: 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
Bonjour,:P
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:
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 jamaisCitation:
WideString(vFileName)
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:
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 :ccool:
Bonjour:P
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
à+:ccool: