![]() |
![]() |
![]() |
|
![]() |
![]() |
![]() |
Utilisation du correcteur orthographique de WordDate de publication : 14/07/2005 , Date de mise a jour : 31/07/2005
Par
Nono40 (nono40.developpez.com)
Utilisation du correcteur orthographique de Microsoft Word dans une application Delphi. I. Introduction II. Avant de commencer III. Première méthode : WordApplication.CheckSpelling III-A. Début du projet III-B. Objets word utilisés III-C. Principe de gestion de la correction III-D. Tester et corriger chaque mot III-E. Ajouter 'remplacer tout' et 'ignorer tout' III-F. Changer la langue de vérification IV. Seconde méthode : utiliser la boîte de dialogue de Word III-A. Début du projet IV-B. Objets word utilisés IV-C. Corriger le texte IV-D. Changer la langue de vérification V. Gestion des dictionnaires V-A. Ajouter un dictionnaire personnalisé V-B. Associer un dictionnaire perso à une langue V-C. Connaître la liste des dictionnaires disponibles VI. Téléchargement et liens I. Introduction
Il est parfois nécessaire d'utiliser un correcteur orthographique dans une application. Les méthodes proposées ici vont utiliser le correcteur intégré à Microsoft Word.
Deux approches bien différentes seront présentées par la suite. La première utilise directement les fonctions de test et de proposition de correction orthographique de Word. Cette méthode permet de maîtriser complètement le processus de correction, la gestion des remplacements et la gestion du dictionnaire sera manuelle. Elle doit être préférée dans le cas où le texte à analyser ne peut pas être corrigé dans sa globalité. Un exemple concret est la correction d'un fichier XML ou HTML dans lequel il ne faut pas corriger les balises et entêtes. La deuxième méthode utilise la boîte de dialogue de correction de Word. Ici il n'est pas possible de filtrer les parties de texte à corriger. En revanche, toutes les actions de remplacement et d'ajout au dictionnaire sont gérées automatiquement. Cette méthode est préférable dans le cas de correction de textes comme des mails ou des fichiers texte. II. Avant de commencer
Pour utiliser l'une ou l'autre des deux méthodes il faut commencer par créer et importer l'unité de bibliothèque de type.
Dans le menu composants, choisissez "Importer un composant..." puis choisir l'option "importer une bibliothèque de type" :
![]()
Dans la liste des bibliothèques de type disponibles, choisir "Microsoft Word 11.0 Object Library"
![]()
Dans la fenêtre suivante, choisissez le répertoire d'enregistrement de la nouvelle unité.
![]()
Puis choisissez de créer l'unité. Cette option permet de garder l'unité disponible pour tous les projets. Dans le cas contraire (ajouter au projet), l'unité ne sera créée et ajoutée que pour le projet en cours.
![]()
Vous aurez sans doute une erreur de compilation de cette unité : Erreur : Word_TLB.pas(34713): E2015 Operator not applicable to this operand type Cette erreur est sur la ligne :
Il faut la modifier comme suit :
Voilà l'unité de type créée, pour l'utiliser ajoutez Word_tlb dans la clause uses.
III. Première méthode : WordApplication.CheckSpelling
Cette méthode utilise un test et une correction mot à mot. On garde un contrôle complet sur les mots testés, les corrections proposées et la gestion du dictionnaire perso. En revanche, le traitement est plus compliqué et l'exécution plus longue. ![]() III-A. Début du projet
Dans un nouveau projet, ajoutez une nouvelle fenêtre qui servira pour la gestion de la correction. Donnez-lui l'aspect suivant :
![]()
Dans cette fenêtre créez une nouvelle méthode publique prenant en paramètre un TRichEdit qui contiendra le texte à corriger.
III-B. Objets word utilisés
Pour mettre cette méthode en oeuvre il nous faut déjà créer un objet WordApplication. Une fois connecté à Word il faudra créer un document vide. Bien que ce document ne soit pas utilisé, il est indispensable aux fonctions de correction de Word. Voici alors le début de la méthode Verifie :
Notez l'utilisation de ConnectKind afin de créer une nouvelle instance de Word dans tous les cas même s'il est déjà ouvert. Ceci permet d'être totalement indépendant des instances déjà ouvertes, et en particulier de demander la fermeture de Word sans se soucier des documents déjà ouverts.
III-C. Principe de gestion de la correction
Le texte à corriger doit être découpé en mots puis tous les mots testés un par un. De plus il faut pouvoir stopper la correction et la reprendre facilement.
L'algorithme suivant est choisi :
Ceci donne le code suivant :
En cas de mot mal orthographié, il faut afficher la fenêtre avec la liste des propositions puis attendre la réponse de l'utilisateur.
Dans la fenêtre des propositions, placez la propriété modalresult de tous les boutons à mrOk (sauf celui d'affichage du dictionnaire perso) puis associez les évènements suivants :
III-D. Tester et corriger chaque mot
Le texte est maintenant bien découpé en mots, pour tester l'orthographe il suffit d'appeler la méthode Word.CheckSpelling().
Cette méthode prend un mot en paramètre et retourne True si l'orthographe est correcte. On peut difficilement faire plus simple...
Si le mot n'est pas correctement orthographié, la méthode Word.GetSpellingSuggestions() permet d'en connaitre la liste de suggestion. Cette méthode retourne un objet SpellingSuggestions. SpellingSuggestions.Count contient le nombre de suggestions possibles. SpellingSuggestions.Item(N).Name contient la Nième suggestion.
La code permettant d'afficher la liste des suggestions est le suivant :
Le remplacement le plus probable est toujours donné en premier de la liste, par défaut le champ "remplacé par" sera donc rempli par la première possibilité.
Il suffit alors de sélectionner le mot en question dans le richedit puis d'appeler la fenêtre de correction. Le code minimal de correction devient :
III-E. Ajouter 'remplacer tout' et 'ignorer tout'
Nous allons garder les mots à ignorer et ceux à remplcacer dans deux listes distinctes. Quand un nouveau mot à corriger est rencontré, on teste s'il fait partie de la liste 'ignorer tout'. Si oui, on passe au mot suivant. Ensuite on teste s'il fait partie de la liste 'remplacer tout'. Si oui on effectue le remplacement automatiquement.
Bien sûr il faut remplir les listes au fur et à mesure des demandes :
III-F. Changer la langue de vérification
La méthode WordApplication.CheckSpelling() utilise le dictionnaire de la langue par défaut de Microsoft Office. Le paramètre MainDictionary est ignoré dans tous les cas (on peut même mettre une valeur bidon sans problème...). Le seul moyen de changer la langue est le suivant :
Comme la limitation de WordApplication.CheckSpelling() est trop pénalisante, nous allons utiliser l'objet SpellingErrors de l'objet Range.
SpellingErrors contient la liste des erreurs du texte associé à l'objet Range. Si Range ne contient qu'un seul mot, alors SpellingErrors indiquera si le mot est correct ou non. De même les propositions de remplacement seront demandées sur l'objet Range plutôt que sur l'objet WordApplication.
Dans le code il faut remplacer :
Par :
Maintenant pour choisir la langue, il faut fixer en début de vérification la langue par défaut de l'objet WordApplication.Selection. Ceci n'a besoin d'être fait qu'une seule fois pour toute la vérification, mais peut être modifié en cours en cas de besoin.
IV. Seconde méthode : utiliser la boîte de dialogue de Word
Cette méthode va traiter le texte dans sa globalité. Il y a beaucoup moins de contrôle possible sur la gestion de la correction. En revanche le code est nettement plus simple et la correction grammaticale est aussi effectuée.
![]() III-A. Début du projet
Dans un nouveau projet, ajoutez une nouvelle unité simple qui servira pour la gestion de la correction.
Dans cette unité créez une nouvelle procédure publique prenant un paramètre un TRichEdit qui contiendra le texte à corriger.
IV-B. Objets word utilisés
Pour mettre cette méthode en oeuvre il nous faut déjà créer un objet WordApplication. Une fois connecté à Word il faudra créer un document vide. Bien que ce document ne soit pas utilisé, il est indispensable aux fonctions de correction de Word. Voici alors le début de la méthode Verifie :
Notez l'utilisation de ConnectKind afin de créer une nouvelle instance de Word dans tous les cas même s'il est déjà ouvert. Ceci permet d'être totaleùent indépendant des instances déjà ouvertes, et en particulier de demander la fermeture de Word sans se soucier des documents déjà ouverts.
IV-C. Corriger le texte
La méthode choisie ici est simple, le texte à corriger va être placé dans le document ouvert. Puis nous allons appeler la fenêtre de gestion de la correction de Word. Il se chargera lui-même de toutes les opérations liées à la correction. En fin de traitement il n'y a plus qu'à récupérer le texte corrigé et à le placer de nouveau dans le RichEdit.
Pour appeler une des boîtes de dialogue standards de Word il faut utiliser la collection WordApplication.Dialogs. Cette collection est indexée par un liste d'identificateurs, celui qui nous intéresse est wdDialogToolsSpellingAndGrammar. Il suffit ensuite d'appeler la méthode Show de l'objet boîte de dialogue. Tout la correction sera alors gérée par Word.
La méthode Show retourne une valeur de type Integer permettant de connaître la cause de fermeture de la boîte de dialogue.
La valeur qui nous intéresse ici est "0", sortie par annulation.
Le code complet de la correction devient :
IV-D. Changer la langue de vérification
C'est ici très simple de la changer, il faut fixer la langue par défaut de l'objet Document.Content.
Ce code doit être placé juste avant l'affectation du texte à Document.Content.Text.
V. Gestion des dictionnairesV-A. Ajouter un dictionnaire personnalisé
Un dictionnaire est un simple fichier texte contenant un mot par ligne. Pour ajouter un mot il suffit de mettre à jour le fichier. Dans l'exemple nous allons ajouter un dictionnaire nommé MonDicoPerso.dic et le placer là où se trouve l'exécutable.
Il est souvent très utile d'avoir un dictionnaire pour y ajouter les mots courants.
L'objet WordApplication dispose d'une propriété CustomDictionaries. Cette propriété est une collection d'objets Dictionarie. La propriété CustomDictionaries.Item() permet d'atteindre les dictionnaires un par un. L'ajout d'un dictionnaire à cette liste est permanente tant qu'il n'est pas explicitement supprimé. Au début de la correction il faut tester la présence du dictionnaire personnalisé et ne l'ajouter qu'en cas de besoin.
En appliquant les points ci-dessus voici le code pour créer, lire et lier le dictionnaire :
Dans le code de gestion de la première méthode il faut prendre en compte le choix 'ajouter au dictionnaire' :
Il n'est pas nécessaire de supprimer puis de lier à nouveau le dictionnaire dans Word. Il sera automatiquement pris en compte à la prochaine demande de correction.
Le code du bouton pour afficher le dictionnaire est simplement un ShellExecute appelant NotePad :
V-B. Associer un dictionnaire perso à une langue
Dans la section précédente le dictionnaire personnalisé ne dépend pas de la langue. Si vous voulez le rendre dépendant d'une langue il faut ajouter le code suivant une fois le dictionnaire ajouté à la liste :
V-C. Connaître la liste des dictionnaires disponibles
Avant de demander une correction dans une langue particulière, il faut s'assurer qu'il existe un dictionnaire principal associé.
La collection WordApplication.Languages donne la liste des langues utilisables dans Word. Pour chacune des langues il est possible de connaître le dictionnaire associé s'il existe. Cette collection est indexée sur les identificateurs des langues (wdxxxxx). Elle ne contient pas d'index ordinal de 1 à Languages.Count. C'est un des rares cas où VB à un avantage sur Delphi, en effet en VB l'instruction For Each permet de balayer une collection sans en connaitre d'index. En delphi il faut utiliser l'énumérateur de collection _NewEnum de l'objet collection afin de connaitre tous les éléments sans en connaitre d'index. La méthode _NewEnum.Next permet d'extraire un certain nombre d'éléments de la collection, ici ils seront lus un par un.
Le code suivant remplit un TLisView avec la liste des langues utilisables :
VI. Téléchargement et liens
Fichiers sources de cet article : Miroir 1 : Sources des exemples [11Ko] Dans le cas où le miroir 1 ne fonctionne pas : Miroir 2 : Sources des exemples [11Ko]
Version PDF de cet article : Miroir 1 : Version PDF Dans le cas où le miroir 1 ne fonctionne pas : Miroir 2 : Version PDF Utiliser Word dans DelphiMSDN : CheckSpelling MethodMSDN : Displaying Built-in Word Dialog Boxes More Automation In Delphi
Merci à Olivier Lance et Laurent Dardenne pour leurs remarques et la correction orthographique.
|
Copyright © 2005 Bruno Guérangé. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.