FAQ DelphiConsultez toutes les FAQ
Nombre d'auteurs : 124, nombre de questions : 934, dernière mise à jour : 23 octobre 2024 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).
Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.
L'équipe Delphi de Developpez.com.
- Comment est structuré le document ?
- Comment se déplacer dans le document ?
- Comment sélectionner un paragraphe ?
- Comment sélectionner tout le texte ?
- Comment sélectionner un paragraphe, une phrase, un mot ?
- Comment sélectionner une zone contiguë de mots ou de phrases ?
- Comment aller à une page ?
- Comment utiliser la recherche de Word ?
- Comment remplacer les valeurs trouvées ?
- Pourquoi ai-je toujours un texte sélectionné ?
- Pourquoi travailler avec l'objet Range et l'objet Selection ?
- Pourquoi la mise en page change-t-elle lorsque je change le texte de mon paragraphe ?
- Que représente la collection Sentences ?
- Comment retrouver la position du curseur ?
Le pilotage de Word est plus simple que celui d'Excel car le déplacement dans le document se trouve facilité par l'utilisation d'un objet Range qui spécifie une plage cible.
Le document se subdivise Globalement comme suit:
Document => StoryRanges => Paragraphs => Sentences => Words => Characters
StoryRanges représentent les zones de votre document
- wdMainTextStory : texte principal
- wdEvenPagesHeaderStory : En-tête
- wdEvenPagesFooterStory : Pied de page
Paragraphs représente une zone terminée par un retour chariot
Sentences est une zone terminée par un point.
Words et Characters sont suffisamment explicites
Il existe d'autres collections particulières tel que :
- Les signets (Bookmarks)
- Les listes (ListParagraphs)
- Les tableaux (Tables)
- Les champs (Fields)
- Les contrôles de formulaire (FormFields)
- etc.
Lorsqu'on sélectionne une zone, on peut composer son objet Range de plusieurs éléments de ses collections. Beaucoup d'utilisateurs ont tendance à déclarer très tôt un objet Range et à manipuler celui-ci. En pilotage c'est une erreur. Il est beaucoup plus lisible et efficace de manipuler les objets sachant qu'ils ont tous une propriété Range directement accessible.
Pour tous les exemples suivants, j'ai créé une copie du texte français de la 'GNU Free Documentation License' sur un document tuto.doc.
Aller au début du document
Code delphi : | Sélectionner tout |
1 2 3 | Param1:=wdStory; Param2:=False; WordApplication1.Selection.HomeKey(Param1,Param2); |
Code delphi : | Sélectionner tout |
1 2 3 | Param1:=wdStory; Param2:=False; WordApplication1.Selection.EndKey(Param1,Param2); |
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | var Unit_, Extend : OleVariant; Nb_Car_Deplaces : Integer; // Nombre de caractére de déplacement begin Unit_:=wdStory; Extend:=wdExtend; Nb_Car_Deplaces:=lWordApplication1.Selection.HomeKey(Unit_,Extend); end; |
Pour plus de détails voir la documentation d'Office et particuliérement Les méthodes de l'objet Selection MoveStart, MoveEnd, MoveXXX etc
Dans cet exemple la même zone (paragraphe 4) est désignée de deux manières différentes, c'est à dire par l'objet Paragraph et par l'objet Range
Code delphi : | Sélectionner tout |
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 | var DocWord:_document; NomFichier:OLEVariant; MaZone:Range; MesPar: Paragraphs; MonPar: Paragraph; Param1, Param2 : OLEVariant; begin WordApplication1.Connect; WordApplication1.Visible:=True; NomFichier:='d:\tuto.doc'; DocWord:=WordApplication1.Documents.Open(NomFichier,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam); // Sélection par l'objet Range Param1:=wdParagraph; Param2:=3; MaZone:=DocWord.Paragraphs.First.Range.Next(Param1,Param2); MaZone.Font.ColorIndex:=5; // Sélection par l'objet Paragraph MesPar:=DocWord.Paragraphs; MonPar:=MesPar.Item(4); MonPar.Range.Select; end; |
Pour sélectionner tout le texte :
Code delphi : | Sélectionner tout |
MaZone:=DocWord.StoryRanges.Item(wdMainTextStory);
Pour sélectionner un paragraphe :
Code delphi : | Sélectionner tout |
1 2 3 4 | MesPar:=DocWord.Paragraphs; MonPar:=MesPar.Item(4); MonPar.Range.Select; end; |
Pour sélectionner un paragraphe dans un texte on utilise la collection WordDocument.Paragraphs.Item(Index).
Pour sélectionner un mot dans une phrase on utilise la collection Range.Words(Index) d'un paragraphe.
Ensuite pour définir la zone, qui doit être une variable de type Range et pas OleVariant, on utilise la méthode SetRange de sorte qu'elle fasse référence à une suite de mots ou de paragraphes.
Code delphi : | Sélectionner tout |
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 50 51 52 53 54 | var Unit_, Extend: OleVariant; UnTexte:Olevariant; MaZone: Range; StartZone: Integer; EndZone: Integer; begin // Définit le texte à convertir UnTexte:='mot '+#13#10+ 'Test deux mots contigüe en gras'+#13#10+ 'Test plusieurs lignes en italique'+#13#10; //Se positionne en début de document Unit_:=wdStory; Extend:=wdExtend; WordApplication1.Selection.HomeKey(Unit_,Extend); //Se positionne en début de document WordApplication1.Selection.HomeKey(Unit_,Extend); //Insère le texte WordDocument1.Range.InsertAfter(UnTexte); // Utilise la méthode SetRange pour redéfinir la valeur de // la variable MaZone de sorte qu'elle fasse référence // aux trois premiers paragraphes du document actif. MaZone:=WordDocument1.Paragraphs.Item(1).Range; StartZone:=WordDocument1.Paragraphs.Item(1).Range.Start; EndZone:=WordDocument1.Paragraphs.Item(3).Range.End_; MaZone.SetRange(StartZone,EndZone); // Bascule le mode italique MaZone.Italic:=wdToggle; // Sélectionne le deuxième mot du deuxième paragraphe MaZone:=WordDocument1.Paragraphs.Item(2).Range.Words.Item(2); StartZone:=MaZone.Start; // Sélectionne le troisième mot du deuxième paragraphe MaZone:=WordDocument1.Paragraphs.Item(2).Range.Words.Item(3); EndZone:=MaZone.End_; //Référence les mots 2 et 3 du second pararaphe MaZone.SetRange(StartZone,EndZone); // Bascule le mode Gras MaZone.Bold:=wdToggle; end; |
Pour aller à une page (la page 1 ici)
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | DocWord:=WordApplication1.Documents.Open(NomFichier,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam); Param1:=WdGotoPage; Param2:=wdGotoAbsolute; Param3:=1; DocWord.GoTo_(Param1,Param2,Param3,EmptyParam); |
Avec le code suivant on récupère toutes les occurrences de ce qui passé dans le paramètre Param1, ici c'est la chaine 'UnMot'.
Code delphi : | Sélectionner tout |
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 | var DocWord:_document; NomFichier:OLEVariant; MaZone,MaRecherche:Range; Param1, Param2, Param3, Param4, Param5, Param6 : OLEVariant; begin WordApplication1.Connect; WordApplication1.Visible:=True; NomFichier:='d:\essai.doc'; DocWord:=WordApplication1.Documents.Open(NomFichier,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam); Param1:=0; MaZone:=DocWord.Range(Param1,Param1); Param1:='UnMot'; Param2:=False; Param3:=True; Param4:=wdFindStop; Param5:=wdCharacter; Param6:=1; with MaZone.Find do begin while Execute(Param1,Param2,Param2,Param2,Param2, Param2,Param3,Param4,emptyparam,emptyparam,emptyparam)=true do begin; MaRecherche:= Parent as Range; MaRecherche.Font.colorindex:=5; end; end; end; |
Le code suivant remplace toutes les occurrences de texte trouvées par la chaîne 'toto' :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | DocWord:=WordApplication1.Documents.Open(NomFichier,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam); Param1:=0; MaZone:=DocWord.Range(Param1,Param1); Param1:='tata'; Param2:=False; Param3:=True; Param4:=wdFindStop; Param5:=wdCharacter; Param6:=wdReplaceAll; Param7:='toto'; MaZone.Find.Execute(Param1,Param2,Param2,Param2,Param2, Param2,Param3,Param4,emptyparam,Param7,Param6); |
À cause de leur comportement parfois identique, on peut confondre l'utilisation des objets Range et Selection, or les deux objets sont différents. Pour pouvoir basculer facilement de l'un à l'autre il faut utiliser une variable Range.
Prenons un exemple
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | WordApplication1.Connect; WordApplication1.Visible:=True; NomFichier:='c:\tuto.doc'; DocWord:=WordApplication1.Documents.Open(NomFichier,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam); DocWord.Paragraphs.Item(3).Range.Select; Param1:=wdWord; Param2:=False; DocWord.Paragraphs.Item(3).Range.EndOf(param1,param2); |
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | MaPlage:Range; begin WordApplication1.Connect; WordApplication1.Visible:=True; NomFichier:='c:\tuto.doc'; DocWord:=WordApplication1.Documents.Open(NomFichier,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam); DocWord.Paragraphs.Item(3).Range.Select; Param1:=wdWord; Param2:=False; MaPlage:=DocWord.Paragraphs.Item(3).Range.EndOf(param1,param2); MaPlage.Select; end; |
Cela permet de gérer des opérations sur une plage sans modifier l'emplacement du point d'insertion. Supposons que je veuille insérer deux signets, l'un sur un mot, l'autre sur le point d'insertion, je peux faire :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Var Zone1:Range; Param1,Param2,Zone2:OleVariant; begin WordApplication1.Selection.TypeText('Monsieur '); Param1:=wdWord; Zone1 := WordApplication1.Selection.Words.First.Previous(Param1,Param2); Zone1.Bookmarks.Add('genre',EmptyParam); Zone2 := WordApplication1.Selection.Range; With WordApplication1.ActiveDocument.Bookmarks Do Begin Add('Nom', Zone2 ); DefaultSorting := wdSortByName; ShowHidden := True; End; end; |
Il s'agit là d'une erreur classique. Vous confondez le paragraphe et l'objet Range le désignant. Prenons un exemple :
Code delphi : | Sélectionner tout |
1 2 3 4 5 | Var Zone:Range; begin Zone:=DocWord.Paragraphs.Item(8).Range; Zone.Text := 'Ceci est un nouveau paragraphe'; end; |
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 | Var Zone:Range; begin Zone:=DocWord.Paragraphs.Item(8).Range; Zone.Text := 'Ceci est un nouveau paragraphe'; Zone.InsertParagraphAfter; end; |
Sentences est une collection renvoyant les "phrases" de son conteneur (document, paragraphe…).
Par phrase on entend tout ce qui est compris entre des points et/ou des retours chariots.
Notez que c'est donc différent des lignes Word
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 | WordApplication1.Connect; WordApplication1.Visible:=True; NomFichier:='c:\tuto.doc'; DocWord:=WordApplication1.Documents.Open(NomFichier,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam); Phrases:=docword.Sentences; showmessage(inttostr(phrases.Count)); |
L'objet Information renvoie des informations relatives à la sélection ou à la plage spécifiée.
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | var VertPos, HorizPos :Olevariant; begin // Récupére la position verticale du curseur VertPos := WordApplication1.Selection.Information[wdFirstCharacterLineNumber]; // Récupére la position horizontale du curseur HorizPos := WordApplication1.Selection.Information[wdFirstCharacterColumnNumber]; end; |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.