IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

comment implémenter TX textcontrol dans un projet Windev (activeX richText compatible Word)


Sujet :

Contribuez

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 11
    Points
    11
    Par défaut comment implémenter TX textcontrol dans un projet Windev (activeX richText compatible Word)
    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...

  2. #2
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Merci pour ta participation.

    Concernant le fond, je ne peux pas vraiment dire quoi que ce soit, vu que je n'ai pas d'utilité de ce type de composant.

    Concernant la forme, utilise les balises [ code ] [/ code ] qui permettent de bien mettre en évidence le code et de plus permettent de conserver l'indentation.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 11
    Points
    11
    Par défaut
    ok merci DelphiManiac
    (mais les tab ne sont pas recopiés, j'ai mis des espaces à la place)

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 11
    Points
    11
    Par défaut astuce pour faire un apercu avant impression
    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é (à la place du hdc de l'imprimante).

    Cet exemple affiche l'apercu de la 1ère page avec un zoom à 25% :

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

Discussions similaires

  1. comment Integrer une API dans son projet
    Par felops dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 12/04/2008, 18h40
  2. [MEX] Comment appeler des modules dans un projet
    Par fatenov dans le forum MATLAB
    Réponses: 4
    Dernier message: 22/11/2007, 22h58
  3. Comment inseré une image dans mon projet?
    Par Micheal1221 dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/07/2006, 14h00
  4. Comment integrer plusieurs API dans un projet ?
    Par nice dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 04/07/2006, 15h15
  5. Réponses: 3
    Dernier message: 16/02/2006, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo