FAQ DelphiConsultez toutes les FAQ

Nombre d'auteurs : 123, nombre de questions : 919, dernière mise à jour : 14 juin 2019  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.

Commentez


SommaireMicrosoft OfficeMicrosoft WordSélection et déplacement (14)
précédent sommaire suivant
 

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.

Mis à jour le 18 janvier 2014 bidou

Aller au début du document

Code delphi : Sélectionner tout
1
2
3
Param1:=wdStory; 
Param2:=False; 
WordApplication1.Selection.HomeKey(Param1,Param2);
Aller à la fin du document
Code delphi : Sélectionner tout
1
2
3
Param1:=wdStory; 
Param2:=False; 
WordApplication1.Selection.EndKey(Param1,Param2);
L'assignation de la valeur wdExtend au paramétre Extend permet d'étendre la sélection courante du document.
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;
Ici, la méthode renvoie un nombre entier qui indique le nombre de caractères correspondant au déplacement de la sélection ou la valeur 0 (zéro) si le déplacement a échoué.

Pour plus de détails voir la documentation d'Office et particuliérement Les méthodes de l'objet Selection MoveStart, MoveEnd, MoveXXX etc

Mis à jour le 18 janvier 2014 bidou

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;

Mis à jour le 18 janvier 2014 bidou

Pour sélectionner tout le texte :

Code delphi : Sélectionner tout
MaZone:=DocWord.StoryRanges.Item(wdMainTextStory);

Mis à jour le 18 janvier 2014 bidou

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;
En changeant la collection Paragraphs par une autre on sélectionne ce que l'on veut

Mis à jour le 18 janvier 2014 bidou

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;

Mis à jour le 18 janvier 2014 Laurent Dardenne

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);
De plus, comme vous le voyez, passer par la manipulation des objets Range nous oblige à déclarer les paramètres avant de les utiliser.

Mis à jour le 18 janvier 2014 bidou

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;

Mis à jour le 18 janvier 2014 bidou

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);

Mis à jour le 18 janvier 2014 bidou

À 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);
Là, malgré le EndOf, le paragraphe est encore sélectionné
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;
Place le point d'insertion après le troisième paragraphe

Mis à jour le 18 janvier 2014 bidou

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;

Mis à jour le 18 janvier 2014 bidou

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;
Ma phrase va s'insérer comme la première phrase du paragraphe suivant, car la marque de paragraphe est inclue dans l'objet Range. La syntaxe correcte est :
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;

Mis à jour le 18 janvier 2014 bidou

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));

Mis à jour le 18 janvier 2014 bidou

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;

Mis à jour le 18 janvier 2014 Laurent Dardenne

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2019 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.

 
Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -

Partenaire : Hébergement Web