Changement de curseur sur Shape (rectangle) [Résolu]

Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
- - Dernière réponse : gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
- 30 juin 2014 à 14:40
Bonjour,
Je me permets de solliciter vos neurones pour un petit problème que je ne réussis pas à résoudre.
J'ai un petit document Word, appelé poétiquement ZonesDeTextes.docx où se trouvent 2 "Shapes". Ce sont deux rectangles vides au beau milieu de la feuille du document Word.

J'ai utilisé l'instruction oWord.ActiveDocument.Shape(1).TextFrame.TextRange.Text ="ce que je veux", pour inscrire dans ces 'shapes' du texte.

Ensuite, j'ai beau eu chercher, je n'ai pas trouvé le moyen de :
1) mettre le curseur sur une des 'Shapes', à partir de l'écriture du code. J'ai essayé 'Focus' que j'ai trouvé sur mdsn mais j'avoue que je ne comprends pas très bien comment écrire le code avec cette méthode 'Focus'...
2) passer d'une Shape à l'autre lorsque le nombre de caractères écrits dans la shape(1) est supérieur à celui voulu.

If oWord.ActiveDocument.Shapes(1).TextFrame.TextRange.Text.Lenght>MaxLenght then oWord.ActiveDocument.Shapes(2).TextFrame.TextRange.Text =" "


Voilà, si vous voulez des précisions, je me tiens bien sûr à votre disposition,
Merci d'avance,
Grég
Afficher la suite 

Votre réponse

12 réponses

Messages postés
12396
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
0
Merci
Bonjour, je n'ai pas VB sous la main, mais en général Focus s'utilise comme ceci:
monControle.Focus()


Par contre, si ton besoin est de mettre le curseur dans un Shape du document word et laisser l'utilisateur le remplir jusqu'à un nombre de carractéres défini?
Penser aux balises de coloration syntaxique: bouton <>, préciser le langage :<code csharp>.
Quand la solution est trouvée, mettre la discussion Résolue.
Commenter la réponse de Whismeril
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
0
Merci
Salut,
Je n'avais plus de clavier...ce qui complique affreusement la tâche pour écrire des commentaires sur CCM...

Bien. Merci pour ton instruction.
Je ne comprends pas bien la fin de ton commentaire mais effectivement, mon souhait est de :
1) remplir des Shapes à partir d'un formulaire (pour ça, c'est à peu près OK)
2) Pour d'autres Shapes, placer directement le curseur "dedans" et y taper le texte que l'utilisateur désire afficher.
3) Lorsque l'on est arrivé à la "fin" de la Shape, c'est à dire lorsque la chaîne de caractères intégrée arrive au côté droit, en bas de la Shape, alors on ouvre un autre document (ça, ça ne devrait pas poser de pbm) et le curseur se place directement "dans" la Shape de l'"autre document" (j'imageine qu'on tape une instruction du type

Dim ArrivéeALaFinDeLaShape As Boolean
If ArrivéeALaFinDeLaShape=True Then Shape4.focus()
End If


Merci,Grég
Whismeril
Messages postés
12396
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
(j'imageine qu'on tape une instruction du type

Dim ArrivéeALaFinDeLaShape As Boolean
If ArrivéeALaFinDeLaShape=True Then Shape4.focus()
End If



Je ne pense pas, il faut regarder s'il existe un événement Change ou Keypress dans le Shape auquel tu pourrais t'abonner pour savoir le nombre de caractères tapés.
Sinon ça ne va pas être simple
gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
-
Merci mais excuse mon ignorance mais je ne comprends pas bien le terme "abonner"
gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
-
Désolé, j'aurais dû écrire "Merci et excuse...".

Sinon, j'ai trouvé sur mdsn de microsoft une fonction Shape.KeyPress. Il s'agit vraisemblablement d'un évènement qui apparaît lors de la frappe d'une touche, quand la 'Shape' a le focus.

Il y a en plus un exemple de Procédure :

Private Sub RectangleShape_KeyPress(Byval sender As Object, Byval e As System.Forms.KeyPressEventArgs) Handles RectangleShape_KeyPress
Dim ch As Char
ch = e.KeyChar
MsgBox("Vous avez pressé la touche "&ch)
End Sub


J'imagine que si cela fonctionne, je rajoute un 'compteur' et ça devrait faire l'affaire. Non ?

Dim i As Integer
Dim imax As Integer = 20
While i < imax
RectangleShape_KeyPress(??????)
Wend

Private Sub RectangleShape_KeyPress(Byval sender As Object, Byval e As System.Forms.KeyPressEventArgs) Handles RectangleShape_KeyPress
Dim ch As Char

ch = e.KeyChar
oWord.ActiveDocument.Shapes(4).TextFrame.TextRange.Text = ch
i=i+1
End Sub


Par contre, si jamais ça ne devait pas être trop à côté de la plaque, je ne sais pas trop quoi mettre à la place des ?????? dans
RectangleShape_KeyPress(??????)


Merci, Grég
gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
-
Alors, tout d'abord, avant même la question de l'argument à entrer dans la fonction RectangleShape_KeyPress(), j'ai tenté l'écriture du code précédent.
Il ne m'a pas fallu longtemps pour avoir une erreur :

Dans :
RectangleShape_KeyPress(ByVal sender As Objet, ByVal e As System.Forms.KeyPressEventArgs) Handles RectangleShape.KeyPress


System.Forms.KeyPressEventArgs n'est pas reconnu
ni RectangleShape (après Handles...)

J'ai tenté
Imports Microsoft.VisualBasic.PowerPacks 


car Shape.Keypress est dans l'espace de nom Microsoft.VisualBasic.PowerPacks mais l'éditeur ne le prend pas 'PowerPacks'...
Bref, je patauge... Help, please...!
Commenter la réponse de gregml
Messages postés
12396
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
0
Merci
Bonjour, la syntaxe que tu montres correspond à du VB.Net, il s'agit donc du KeyPress de VB, pas celui de word.
Je n'ai pas eu le temps de chercher hier soir, je tenterai ce soir.

Pour comprendre le principe de l'événement et de l'abonnement à cette éventent, je via continuer mon analogie avec les humains.

L'humain possède deux objets de type Oreille, dont le rôle est de transformer tout son reçu en impulsions électriques qui sont envoyée sur le "réseau" du système nerveux.
Le cerveau a donc besoin de surveiller ce réseau, de trier tout ce qui passe et quand il s'agit d'un son l'envoyer dans le lobe qui va bien.
Il y a donc une partie du cerveau dont le travail est de sniffer le réseau, quand il y passe quelque chose cette partie génère un événement "HouHouYaUnMessage".
Il y a une seconde partie du cerveau qui s'est abonnée à cet événement, c'est à dire qui scrute la pile d'événement en attendant uniquement "HouHouYaUnMessage".
Quand cet événement passe, la seconde partie, lie l'entête du message pour savoir s'il sagit de son, d'image, de douleurs etc... et en fonction génère "HouHouYaDuSon",
"HouHouYaDeLimage", "AieAieAie", etc...
Enfin notre lobe qui va bien s'est abonné à "HouHouYaDuSon" et quand cet événement passe décrite le message.

Pour ton cas, il faut donc chercher si dans l'espace de nom de word, objet Shape, on peut s'abonner à un événement qui te permettras de savoir si le texte change.
Commenter la réponse de Whismeril
Messages postés
3244
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
13 décembre 2018
0
Merci
Bonjour

Après avoir lu et relu ce n'est pas clair .
Tu dis qu'il y a deux rectangles et ensuite tu as écrit
remplir des Shapes à partir d'un formulaire
donc des shapes (au pluriel) c.a.d les deux shapes ?!
ensuite
Pour d'autres Shapes, placer directement le curseur
Combien de shapes y a t'il ?
aussi
2) Pour d'autres Shapes, placer directement le curseur "dedans" et y taper le texte que l'utilisateur désire afficher.

Quelle est la différence entre le 1
1) remplir des Shapes à partir d'un formulaire (pour ça, c'est à peu près OK)
et
2) Pour d'autres Shapes, placer directement le curseur "dedans" et y taper le texte que l'utilisateur désire afficher.

A la phase initiale les deux rectangles sont vides.
Via le vb.net tu remplis un des deux rectangles
ensuite tu remplis le 2 ième rectangle avec le texte que l'utilisateur désire afficher ?
Commenter la réponse de cs_ShayW
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
0
Merci
Oui bonjour et merci de vos réponses.

Pour répondre à Whis, je vais donc chercher dans Mdsn, dans la section Espace de nom de Shape s'il existe cet abonnement. Je te dirais l'état d'avancement de mes lourdes recherches...

Pour répondre à ShayW, effectivement mon exposé n'est pas clair.
Je parle de 2 rectangles, puis d'autres... de shapes remplies à artir du code et d'autres par l'utilisateur. Je reconnais que ce n'est pas limpide.

En fait, mon projet global repose sur le fait de "coller" l'image d'un document administratif dans lequel se trouvent plusieurs renseignements à saisir par l'utilisateur. A titre d'exemple, cela peut être la déclaration d'impôt (je te rassure, ce n'est pas le cas, je ne compte pas tricher avec le fisc!!). J'ai fait une copie d'écran de ce document et à la place des saisies faites directement par l'utilisateur sur l'écran, j'ai placé aux mêmes endroits des 'Shapes' censées accueillir les renseignements fournis par l'utilisateur.

Ainsi, pour être moins général, certains contrôles attendent la reception des nom, prénom, âge, code postal... et seront réutilisés dans d'autres parties du document "image", donc sont rentrées par le biais d'un formulaire, qui alimentera des variables du code.

D'autres contrôles sont de l'affichage de saisie de textes de longueur importante (plusieurs lignes voire plusieurs pages). Ces phrases sont bornées par les lignes des Shapes. Ces shapes communiquent les unes par rapport aux autres car lorsqu'on arrive "au bout", c'est-à-dire en bas à droite, d'une Shape, on placera directement le curseur dans la Shape qui suit.

Pour ce qui est des 2 Shapes dont je parlais, il s'agissait du test de "communication" entre ces 2 shapes.

J'espère avoir été plus clair et vous remercie de toute façon tous deux,
Grég
Whismeril
Messages postés
12396
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
Je n'ai pas encore regardé du coté des chapes de word s'il y a des événements auxquels s'abonner.

Par contre ça me parait plus simple de tout saisir dans ton IHM.
1 tu peux te créer des zone de textes très longues (Texbox multilignes, RichTextBox, ...) et ensuite transférer le texte en le morcelant comme il faut.
2 ça évite à l'utilisateur de jongler entre deux applications
Commenter la réponse de gregml
Messages postés
12396
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
0
Merci
Bon et bien il n'y a aucun évènement.

Pour te montrer un exemple Intellisens (la liste déroulante qui te propose les "outils" disponible selon le type d'objet) matérialise les évènements par un éclair.
Sur l'image ci-dessous, une vue pour un TextBox

On voit des évènements, des méthode (cube rose) et des propriétés (main sur une liste).
Si tu regardes ce que te propose intellisense pour oWord, Shapes, TextFrame, TextRange et Text: aucun événement.


Pour en revenir à ton problème, si tu reste dans l'idée de faire jongler ton utilisateur entre 2 applis, la seule solution que je voie est de faire tourner un rimer qui teste en permanence le contenu de ton shape, et quand celui-ci atteint le seuil critique change de shape et teste le nouveau shape.
Je ne suis pas convaincu que ce soit la bonne méthode.

Penser aux balises de coloration syntaxique: bouton <>, préciser le langage :<code csharp>.
Quand la solution est trouvée, mettre la discussion Résolue.
Commenter la réponse de Whismeril
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
0
Merci
ok merci pour cette "prise de position".
Mon problème était que, ne réussissant pas à placer (à "coller") physiquement des Textbox sur une image "collée" elle-même sur un document Word, nous en étions arrivés à la possibilité de se servir de Shapes plutôt que de Textbox.

Après, effectivement, il semble que l'étendue des méthodes soit moindre avec des Shapes...

Je vais tenter de comprendre ce qui bloquait avec ces Textbox.

Grég
Whismeril
Messages postés
12396
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
Mon problème était que, ne réussissant pas à placer (à "coller") physiquement des Textbox sur une image "collée" elle-même sur un document Word, nous en étions arrivés à la possibilité de se servir de Shapes plutôt que de Textbox.
heu....
Y'a encore un truc que je n'ai pas du comprendre.
Tu fais bien une IHM VB.Net, dans laquelle l'utilisateur va cocher des case, ou choisir dans des listes déroulantes ou écrire du texte, et tout ça est mouliné pour remplir un Word?
Commenter la réponse de gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
0
Merci
sauf à ce que, à l'intérieur même de mon image, aux dimensions d'une feuille de document Word soit un format 24*29, je puisse convertir certaines parties en parties 'Word'.
Pour être plus clair, peut-être est t-il possible de copier et coller une image sur un document Word ? On a une image Jpeg "collée" sur une feuille Word. Puis de "rogner" par une sélection adéquate certaines parties de l'image Jpeg pour qu'elles soient en fait du .doc, à partir des quelles on pourrait inclure des Textbox.
C'est faisable ?
Commenter la réponse de gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
0
Merci
Salut,

EN fait, en choisissant la propriété 'Dessin dessus' de l'image collée sur le document, j'ai réussi à coller une "Zone de texte" sur l'image.
Ainsi, j'ai des zones de texte (celles que l'on obtient à partir de Word, en effectuant un : Insertion > Zone de texte dans l'application Word.

Ces zones de texte sont-elles bien des Textbox lorsqu'on veut les utiliser dans le code en langage VB.net ?
Dès lors une instruction du type :

For each ctrl as Control in Me.Controls
If typeof ctrl is Textbox Then
Ctrl.Text = Textbox.Id
End


me permet de nommer toutes les textbox, non ?

Merci
Commenter la réponse de gregml
Messages postés
12396
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
0
Merci
Bonjour, peut etre que mettre l'image en arrière plan répondrait à ton besoin.
Cela revient à remplacer le fond blanc par un image.
Tu peux ensuite écrire dessus comme sur une page blanche.

Voir ici
http://protuts.net/inserer-image-arriere-plan-plusieurs-pages-word-2007/
Commenter la réponse de Whismeril
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Dernière intervention
13 août 2017
0
Merci
Bonjour gregml,

Non, les zones de texte de Word ne sont pas des TextBox. Par contre, vous pouvez déposer des TextBox dans un document Word. Comment ? C'est une autre histoire. Cela dépend de la version de Word. Je ne saurai vous l'expliquer que dans Word 2010.
Cordialement.
Commenter la réponse de Zermelo
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
0
Merci
Bonjour à tous,

Je réussis enfin à obtenir ce que je voulais, à savoir des zones de texte, sur une image, où l'on peut écrire à partir du code, par une instruction du genre :
RichTextBox.Text = "chaîne de caractère"


Première victoire...
En revanche, j'essaie également de "remplir" une textbox ou une RichTextbox grâce à la frappe au clavier de caractères par l'utilisateur. J'aimerais pouvoir limiter le nombre de caractères frappés.

J'ai tenté un truc du genre (avec 15 caractères maximum):

Private Sub RichTextBox_KeyPress(Byval sender As System.Objet, ByVal  As System.Windows.Forms.KeyPressEventArgs) Handles RichTextBox.KeyPress
Dim count As Integer =0
While Count < 15
RichTextBox.Text = e.KeyChar
Count=count+1
End While
End Sub


mais, ça ne fait qu'afficher 2 caractères dans la RichTextBox, en les remplaçant à mesure que l'on change de caractère frappé. Frappant, non ?

Auriez-vous une petite solution à mon petit problème.
Je vous suis reconnaissant,
Grég
Whismeril
Messages postés
12396
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 décembre 2018
-
gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
-
Bonjour Whis,
Ravi de t'avoir en "live". Comment vas-tu ?
Merci de te pencher sur mon problème informatique.

J'ai bien tenté le petit code que tu as trouvé mais ça n'a pas fonctionné. Je l'ai intégré dans mon petit programme (et c'est probablement l'articulation qui coince)

Option Strict On
option Explicit On
Imports ImageSurForm
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.Word

Public Class Form1
Dim oWord As New Word.Application

Private Sub richTextBox1_click(Byval sender As System.Objet, ByVal  e As System.EventArgs) Handles RichTextBox1.click
Dim texte As String
RichTextBox1.Focus()
AddmyText(texte)
End Sub

Private Sub AddMyText(ByVal textToAdd As String)
richTextBox1.MaxLength = 20

If textToAdd.Length > richTextBox1.MaxLength Then
             MessageBox.Show("Texte trop long")
    Else
        richTextBox1.SelectedText = textToAdd
    End If
End Sub
End Class


Voilà. Le résultat de ce petit code est que je peux écrire tant que je veux dans la RichTextBox1, sans limitation à 20 caractères.

Merci,
Grég
Commenter la réponse de gregml

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.