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/Telechargemen..._18&REF=302259
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 :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
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 :

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
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() :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
SI iAperçu ALORS //si apercu demandé (iApercu est une case à cocher)
  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 :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
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/pro...tnet/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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
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é
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
//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/Telechargemen..._18&REF=302259

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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
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/dow.../dictionaries/
Voici le code pour activer un nouveau dictionnaire (le correcteur va chercher le dico dans le sous répertoire 'Dictionaries' de votre appli) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
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...