Pour commencer un tuto sur le site
et le lien sur la FAQ
Version imprimable
Pour commencer un tuto sur le site
et le lien 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:
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: