PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Equivalent de Word dans Windev - TXtextControl - patch Windev pour faire fonctionner le correcteur
Equivalent de Word dans Windev - TXtextControl - patch Windev pour faire fonctionner le correcteur
Débuté par Christophe Navarro, 08 oct. 2013 15:29 - 9 réponses
Membre enregistré
89 messages
Popularité : +4 (4 votes)
Posté le 08 octobre 2013 - 15:29
Bonjour à tous,
j'utilise dans un projet l'activeX TextControl en association avec l'assemblage .Net TxSpellChecking.

Ces éléments permettent d'intégrer dans un projet Windev (ou autre environnement) un éditeur de texte compatible 100% Word avec de nombreuses fonctionnalités et tout ca sans avoir besoin que Word soit installé sur la machine.

Aprés de nombreux obstacles rencontrés j'ai fini par arriver à faire fonctionner le tout, en effet un petit manque dans Windev empechait l'utilisation du correcteur orthographique (speelchecking),
PCsoft a rapidemment émis un patch correctif pour corriger ce manque (merci à eux) que vous pouvez télécharger ici version 18 63c mini nécessaire) : http://stg.webdev.info/Telechargement_Support_WEB/FR/telec_ST.awp…
Ce correctif sera inclus dans la version 19 de Windev.

J'ai donc décidé de partager mon expérience afin d'aider ceux qui essayent d'utiliser ce composant, je n'ai pas encore fini d'explorer toutes ses possibilités donc les compléments d'information et autres critiques sont les bienvenues.

1 - L'éditeur de texte

a - les controles activeX

Au nombre de 5 : la barre de controle, le corps du document, la barre de statut, les règles horizontale et verticale

il faut commencer par relier les objets entre eux, les 2 barres et les 2 règles sont associés au corps en indiquant leur n° handle au corps, voici mon code d'initialisation :

ax_corps>>buttonbarhandle=ax_bar>>hwnd
ax_corps>>statusbarhandle=ax_status>>hwnd
ax_corps>>rulerhandle=ax_regleH>>hwnd
ax_corps>>verticalrulerhandle=ax_regleV>>hwnd
ax_regleV>>direction=1 //vertical


b - les fonctions de base (ouvrir un document Word, l'enregistrer, l'imprimer)

Pour ouvrir un document Word il existe plusieurs options a passer à la fonction Load() décrite dans la doc, dans le code ci-dessous j'ouvre un document contenant des champs de fusion au format Word, avant d'executer la fonction Load() il faut paramétrer certains attributs afin de rendre 'compatible' les champs de fusion Word avec les fonctions publipostage du composant :

fic est chaîne

SI ficdoc="" ALORS
fic="*.docx"
SINON
fic=fExtraitChemin(ficdoc,fFichier+fExtension)
FIN

ficdoc = fSélecteur("", fic, "Sélectionnez un fichier...", "Tous les fichiers (*.*)" + TAB + "*.*" + RC + "Document Word" + TAB + "*.docx" + RC + "Document Word 97-2003" + TAB + "*.doc", "*.docx", fselExiste)

SI ficdoc<>"" ALORS
ax_corps>>enablespellchecking=0 //on désactive les fonctions de correction orthographique de l'activeX sinon ca risque de faire planter l'activeX
ax_corps>>LoadSaveAttribute(15) = True //on récupère les champs de fusion du document pour pouvoir les utiliser avec les marked fields (fieldnext(), fieldcurrent...)
ax_corps>>LoadSaveAttribute(17) = "MERGEFIELD" + Caract(9) + "PRINTDATE"
SI ax_corps>>load(ficdoc,-1,13)=0 ALORS
ficdoc=""
Erreur("Problème à l'ouverture du fichier")
SINON
MaFenêtre..Titre+=" - "+ficdoc
FIN

ax_corps>>enablespellchecking=1 //on reactive les fonctions de correction orthographique de l'activeX
FIN



Pour enregistrer le document qu'on vient de modifier ou créer, rien de spécial, fonction Save() :

fic,rep est chaîne

SI ficdoc="" ALORS
fic="nomdoc.docx"
ficdoc = fSélecteur(rep, fic, "Sélectionnez l'emplacement et le nom du fichier à enregistrer...", "Tous les fichiers (*.*)" + TAB + "*.*" + RC + "Document Word" + TAB + "*.docx" + RC + "Document Word 97-2003" + TAB + "*.doc", "*.docx", fselCrée + fselExiste)
FIN

SI ficdoc<>"" ALORS
SI ax_corps>>save(ficdoc,-1,13)=0 ALORS
Erreur("Problème à l'enregistrement du fichier")
FIN
FIN



Pour imprimer :

SI iAperçu ALORS //si apercu demandé
ax_corps>>PrintDevice=Handle(Image1) //ATTENTION ce code fonctionne pas, pour avoir l'apercu le principe est de dire que l'imprimante de sortie est un champ image
ax_corps>>PrintPage(1)//TX utilise le visual basic dans leurs exemples et je suppose qu'un champ image en VB n'a pas la meme structure qu'un champ image Windev donc plantage
// si qq'un a une astuce je suis preneur !
SINON
SI ficdoc="" ALORS
AX_enreg_doc()
FIN
SI ficdoc<>"" ALORS ax_corps>>printdialog(ficdoc)
FIN



c - Autres fonctionnalités

vous pouvez modifier tout l'environnement, personnaliser la barre de controle, ouvrir des boites de dialogues (voir la doc), voici qq ex :


ax_corps>>viewmode=2 //mode d'affichage de la page (2=vue tridimensionnelle, voir doc)
ax_bar>>poszoom=0 //masque la combo du zoom dans la barre de controle
ax_bar>>posgrowfont=1004 //affiche le bouton pour augmenter la police dans la barre de controle en position 4 avec un espacement devant
ax_bar>>posshrinkfont=1005 //affiche le bouton pour diminuerla police dans la barre de controle en position 5 avec un espacement devant
ax_bar>>posshrinkfont=5 //affiche le bouton pour diminuerla police dans la barre de controle en position 5 sans un espacement devant


Pour changer la langue des menus :

ax_corps>>language=49 //cette ligne permet de contourner un bug (windev ou activex...) : ca n'initialise pas la langue demandée du 1er coup
ax_corps>>language=33 //francais


d - Astuce

Pour ne pas passer par l'installateur de TX pour activer l'activeX sur vos postes clients vous pouvez simplement copier les Dll Tx19xxx.dll et lancer la commande RegSvr32.exe pour déclarer l'ocx à Windows :
repexe est chaîne=ComplèteRep(fRepExe())
LanceAppli(ComplèteRep(SysRep(srSystème))+"regsvr32.exe "+Caract(34)+repexe+"tx4ole19.ocx"+Caract(34)+" /s") //on met /s pour Silent, pas d'affichage de la console à l'écran



2 - Le correcteur orthographique

Pour activer le correcteur orthographique la ca se complique un peu, celui-ci n'est pas intégré à l'activeX et il faut intégrer un assemblage .Net pour y arriver.
il faut commencer par télécharger et installer le .net TX Spell Checking : http://www.textcontrol.com/en_US/products/spelldotnet/overview/

Puis ensuite télécharger ce qu'ils appellent le 'wrapper' (nommé AxTxSpell) pour relier notre activeX à l'assemblage .Net : http://www.textcontrol.com/en_US/blog/archive/20121121/

Ce fichier compressé n'est pas un programme installable, c'est un code source (fichier AxTXSpell.vbproj) écrit en VB qu'il faut Builder depuis visual studio (vous pouvez télécharger la version express gratuitement).

Une fois buildé vous obtiendrez un fichier AxTXSpell.dll qu'il faudra copier à coté de votre exe. c'est cette classe qui sera intégrée dans votre projet Windev et permettra de piloter le .Net.

Téléchargez l'aide (fichier AxTXSpell.chm) qui est bien faite et qui pourra vous aidez (notament pour le déploiement sur les postes clients dans la partie Distributing your applications).
Avant d'intégrer la dll au projet il vous faudra d'abord déclarer à Windows la dll avec la commande RegAsm.exe :

repexe est chaîne=ComplèteRep(fRepExe())
LanceAppli("C:\Windows\Microsoft.NET\Framework\v2.0.50727\regasm.exe "+Caract(34)+repexe+"AxTXSpell.dll"+Caract(34))



Pour implémenter ce correcteur :

Tout d'abord assurez vous que celui-ci soit activé avec la propriété
ax_corps>>enablespellchecking=1
(a mettre dans votre code d'initialisation)

Puis dans votre projet Windev, intégrer le 'wrapper' AxTxSpell.dll en allant dans le menu atelier - .Net - Liste des assemblages .Net, cliquez sur 'Parcourir...' et sélectionnez la dll.
Déclarer ensuite la classe dans votre code d'initialisation :
clSpellCheck est un AxTXSpell.AxTXSpellChecker


Pour relier l'activeX au correcteur et que la correction se fasse à chaque modification du texte, il faut utiliser l'événement 'SpellCheckText' de l'ActiveX, dans votre code d'initialisation indiquez ceci :

ActiveXEvénement("SpellEvent",ax_corps,"SpellCheckText") //quand l'activeX a besoin du correcteur il execute la procédure SpellEvent()


Voici le code de ma procédure Windev SpellEvent :
//L'événement ActiveX possède 2 paramètres :
// Text : paramètre en entrée de type String, rempli avec le texte de l'éditeur par défaut
// tbpos : paramètre en sortie de type long array, on doit fournir les positions début et fin de chaques mots mal orthographiés

Procedure SpellEvent(Text,tbpos)

TBiw est un tableau de AxTXSpell.IncorrectWord()

v,i,nbsugg est un entier
c est chaîne
sugg est chaîne

clSpellCheck.Check(Text)//analyse orthographique du texte
tbpos<-clSpellCheck.MisspelledWordPositions //affectation des positions des mots mal orthographiés au paramètre de sortie de l'événement
//clSpellCheck.MisspelledWordPositions est un long array (tableau d'entiers long)
TBiw=clSpellCheck.IncorrectWords//recupération de la liste des mots mal orthographiés dans un tableau

Libellé4=""
//pour afficher dans un libellé la liste des mots mal orthographiés (si besoin) :
SI TBiw<>Null ALORS
POUR v=1 _A_ Dimension(TBiw)
SI TBiw[v]<>Null ALORS
//affichage des mots mal orthographiés
SI Libellé4<>"" ALORS Libellé4+=" "
c=TBiw[v].text
Libellé4+=c
FIN
FIN
FIN

//affichage dans un libellé des positions début et fin des mots mal orthographiés (tableau retourné à l'événement activeX pour le dessin des lignes rouges)
v=0
SI tbpos<>Null ALORS
Libellé4+=RC
POUR TOUT i DE tbpos
v++
SI Modulo(v,2)=0 ALORS //il faut parcourir le tableau 2 par 2 occurrences (position début sur ligne 1, position fin sur ligne 2)
Libellé4+="-"
SINON
SI v>1 ALORS Libellé4+=" "
FIN
Libellé4+=i
FIN
SINON
Libellé4=""
FIN

Libérer TBiw


le 1er paramètre de cette procédure est prérempli par l'activeX avec le texte du document.
le 2ème paramètre est un tableau de classes incorrectWords qu'il faut renseigner pour le retourner à l'activeX.
la propriété MisspelledWordPositions du wrapper fournit ce tableau, il y a juste à l'affecter directement au 2eme paramètre de la procédure.
Ce tableau contient en faite les positions début et fin de chaque mots mal orthographiés et provoque leur soulignement en rouge une fois passé à l'activeX.
C'est ce passage de paramètre qui n'était pas possible avec Windev avant que je demande à PCsoft un correctif (à faire sinon vous n'aurez pas le soulignement en rouge), vous pouvez le télécharger ici :
http://stg.webdev.info/Telechargement_Support_WEB/FR/telec_ST.awp…

Pour avoir des suggestions de mots on peut utiliser les méthodes CreateSuggestions() et get_getSuggestions().
Cette petite procédure retourne une liste de suggestions (3 maxi) dans un tableau de chaines :

Procedure recup_suggestions(texte_a_analyser)
TBsugg est un tableau de chaîne
clSpellCheck.CreateSuggestions(texte_a_analyser,3)
nbsugg=clSpellCheck.Suggestions
SI nbsugg>0 ALORS
TBsugg=clSpellCheck.get_getSuggestions()
RENVOYER TBsugg
SINON
RENVOYER null
FIN


on pourrait ajouter ces suggestions dans un menu contextuel en cliquant sur un mot par ex mais je n'ai pas encore planché sur la cas, je ne sais pas si on peut modifier le menu contextuel de l'activeX, si qq'un a une expérience sur ce sujet elle sera la bienvenue !


3 - Les dictionnaires

Par défaut le dictionnaire Anglais est utilisé par le correcteur, il est possible d'en ajouter d'autres, ce sont de simples fichiers au format OpenOffice.
Le dictionnaire francais s'appelle fr.aff, vous pouvez télécharger tout les dicos ici : http://www.textcontrol.com/en_US/downloads/dictionaries/
Voici le code pour activer un nouveau dictionnaire (le correcteur va chercher le dico dans le sous répertoire 'Dictionaries' de votre appli) :
cldictionaryFR est un AxTXSpell.OpenOfficeDictionary(ComplèteRep(fRepExe())+"Dictionaries\fr.aff")
clSpellCheck.AddOpenOfficeDictionary(cldictionaryFR)
cldictionaryFR.IsSpellCheckingEnabled=1
cldictionaryFR.IsGetSuggestionsEnabled=1



4 - le publipostage

pour l'instant je teste les diverses fonctions de manipulation des champs de fusion avec ce genre d'instructions :
ax_corps>>FieldInsert("")
i=ax_corps>>FieldCurrent
ax_corps>>Fielddata(i)="prenom"
ax_corps>>FieldEditAttr[i]=0x10
ax_corps>>fieldtext="chris"
ax_corps>>FieldChangeable=1

ca me créé bien un champ sur fond gris affiché 'chris', le curseur de la souris change en survol...
je continue mes tests dans le but de pouvoir faire une fusion dans un nouveau document (je sais déjà qu'il faut utiliser un 2eme activeX textcontrol avec la méthode ax_2emeCorps>>LoadFromMemory(ax_corps>>SaveToMemory(13,1),13,1)

si vous avez des conseils, n'hésitez pas...
Membre enregistré
89 messages
Popularité : +4 (4 votes)
Posté le 19 février 2014 - 01:15
Je fais un petit ajout à mon précédent post, je cherchai comment faire un apercu avant impression avec TxTextControl et finalement c'est assez simple :
il faut récupérer le handle du device context d'un champ image et l'indiquer à la propriété
Ax_corps>>PrintDevice
(à la place du hdc de l'imprimante).

Cet exemple affiche l'apercu de la 1ère page avec un zoom à 25% :
Ax_corps>>PrintDevice=API("user32.dll","GetDC",Handle(Image1))
ax_corps>>PrintZoom=25
ax_corps>>printpage(1)


Muni de ces fonctions il devient facile de créer une fenetre affichant un apercu avant impression (par ex pour visualiser la fusion d'un publipostage)
Posté le 19 février 2014 - 10:24
Bonjour Chris,

merci pour le partage car ce sujet est très intéressant. Est-il possible d'avoir un projet pour voir en application ce fameux module ?

dans tout les cas félicitation pour tes recherches.
Membre enregistré
89 messages
Popularité : +4 (4 votes)
Posté le 19 février 2014 - 15:03
Bonjour Cedric,merci,
je ne peux pas extraire ma fenetre de mon projet pour en faire un projet autonome (trop de liens...), désolé, mais j'essaierai de prendre le temps de le faire car c'est plus parlant avec un exemple concret c'est sur.
Il va falloir que tu prennes un petit moment pour télécharger et installer TxTextControl version ActiveX mais ensuite l'implémentation dans Windev est trés simple si tu suis mes instructions.
Ce qui est plus long c'est de 'brancher' le correcteur orthographique à cause du wrapper qu'il faut builder avec VisualBasic si tu ne l'as pas déjà.

Bon dev
Posté le 21 février 2014 - 02:08
c'est un sujet qui m'intéresse j'essaierai de prendre un peu de temps pour me lancer dedans car l'idée de m'affranchir de word me plaît beaucoup.
Dans tous les cas si tu peux mettre à dispo un projet minimaliste je suis preneur.

Bon dev.
Posté le 11 mars 2014 - 11:53
Bonjour,

J'utilise TXTCONTROL depuis des années mais je bute souvent sur les mêmes problèmes, à savoir :

- l'enregistrement : regsrv32.exe a besoin de droits administrateur sur le pc, un utilisateur classique ne peut y arriver, je me trompe?
- je n'arrive pas à générer une table des matières...

Bon dev à tous,

Albert Lemoine
Posté le 26 mai 2014 - 16:59
Bonjour,

Déjà, merci pour toutes ces informations, cela m'a bien aidé!

Je me permets juste quelques remarques :
- je n'arrive pas à faire fonctionner l'activeX avec les docX, j'ai donc du repasser au format doc pour que cela fonctionne.
- j'avais systématiquement une erreur avec le dictionnaire français, pour corriger ça, il m'a fallu transformer la variable TBiw en tableau dynamique :
TBiw est un tableau dynamique de AxTXSpell.IncorrectWord()

Et pour compléter sur le publipostage, vous pouvez récupérer les champs existants en faisant une boucle :
i = AX_corps>>fieldnext(0,0)
TANTQUE i > 0
AX_corps>>Fieldcurrent = i
i = AX_corps>>fieldnext(i,0)
FIN

Il suffit ensuite de traiter la valeur de AX_corps>>fieldtext pour alimenter facilement le document.


Par contre, je bute sur 3 points, peut-être pourriez-vous éclairer ma lanterne ?
1 - Est-il possible de modifier le menu contextuel de l'activeX (pour les suggestions de correction) ? Vous disiez ne pas avoir encore planché sur le sujet dans le premier post, peut-être avez-vous pu avancer depuis ?
2 - Je souhaiterai récupérer un publipostage créé sous word. Pour l'instant, je récupère bien le document ainsi que les différents champs, mais pas la requête qui va avec. Auriez-vous une idée ?
3 - Je n'arrive pas à faire fonctionner le code pour l'aperçu avant impression :
Vous avez appelé la méthode Automation 'printpage'.
En tentant d'invoquer la méthode <printpage> ou de lire la propriété <printpage>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
'Erreur 800A4E2A : Impossible d'imprimer la page.'
En tentant d'invoquer la méthode <printpage>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
'Erreur 800A4E2A : Impossible d'imprimer la page.'
En tentant de lire la propriété <printpage>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
'Erreur 8002000E, Nombre de paramètres incorrect'
En tentant d'écrire la propriété <printpage>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
'Erreur 80020005, Type incorrect pour le paramètre -1627651'
Posté le 12 septembre 2014 - 14:45
Utilisant Tx Text Control depuis quelques années, je viens de migrer une application en Windev 19 - 64 bits et je constate que cette version de Windev n'affiche plus l'activeX Txt Text Control dans la combo listant les ActiveX.

Quand j'ouvre la même application en Windev 19 - 32 bits pas de souci, tout fonctionne comme auparavant.

Quelqu'un a t'il remarqué ce phénomène ? Est ce un bug ?
Posté le 12 septembre 2014 - 17:26
Bonjour Greg

le principe de base s'applique ici aussi... Si 64 bits, alors il faut du
64 bits POUR TOUT, y compris l'activeX.

32 bits et 64 bits sont fachés, ils ne se parlent pas :-)

D'ailleurs, c'est bien indiqué sur le site de txtControl :
http://www.textcontrol.com/en_US/support/documentation/dotnet/n_intro_3264bit.htm

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

NOUVEAU: WXShowroom.com est disponible : Montrez vos projets !
Plus d'information sur http://fabriceharari.com


On 9/12/2014 6:45 AM, Greg wrote:
Utilisant Tx Text Control depuis quelques années, je viens de migrer une
application en Windev 19 - 64 bits et je constate que cette version de
Windev n'affiche plus l'activeX Txt Text Control dans la combo listant
les ActiveX.

Quand j'ouvre la même application en Windev 19 - 32 bits pas de souci,
tout fonctionne comme auparavant.

Quelqu'un a t'il remarqué ce phénomène ? Est ce un bug ?
Posté le 05 juin 2015 - 15:04
Bonjour,

Le correctif, permettant d'avoir le soulignement en rouge, a-t-il bien été appliqué à la version 19 ?

Parce que je rencontre le même problème et en faisant mes recherches, je tombe sur le thread...