Comment sélectionner le contenu d'une zone de texte une fois qu'il est activé?
J'ai ce simple objet Userform, où je n'ai TextBox1
et TextBox2
. J'ai entrez du texte dans les deux. Assumer l'accent est mis sur (le curseur est dans) la TextBox2
. Quand je clique sur TextBox1
, je veux tout le texte dans ce contrôle pour être surligné (sélectionné). Donc j'utilise ce code:
Private Sub TextBox1_Enter()
With TextBox1
.SetFocus
.SelStart = 0
.SelLength = Len(.Text)
End With
MsgBox "enter event was fired"
End Sub
Il y a un MsgBox
à la fin qui est chargé, cela signifie que l'événement fonctionne. Cependant, le texte n'est pas mis en surbrillance. Comment résoudre ce problème?
- Je utiliser le Enter
événement et ne souhaitez pas utiliser le MouseDown
événement, parce que j'ai besoin du code pour également fonctionner lorsque le TextBox1
est activé par programmation, donc je pense que le Enter
événement pour être le meilleur choix, car il est déclenché dans les deux cas! Un autre inconvénient de la MouseDown
événement est: quand je clique pour la deuxième fois sur le TextBox1
, je ne voudrais pas que l'ensemble du texte pour être mis en évidence plus, parce que l'accent a été mis sur le premier clic et il n'a pas été modifié après que j'ai cliqué sur le même contrôle pour la deuxième fois; ainsi, dans ce cas, je voudrais que le curseur d'agir normalement (pas de garder le texte marqué).
Mise à jour
Quand je clique une fois sur le TextBox1
, j'attends d'avoir ce résultat:
Si vous cliquez à nouveau, le point culminant serait supprimée et le curseur sera placé à l'endroit où il a été cliqué.
Vous avez déjà une propriété nommée
EnterFieldBehavior
. Vous avez juste besoin de le mettre à fmEnterFieldBehaviorSelectAll
. C'est la valeur par défaut de cette propriété, vous n'avez rien à faire sauf si vous avez modifié la valeur de la propriété. Il devrait fonctionner sans aucun bout de code.Je ne sais pas pourquoi, mais ayant le code ci-dessus ne suffit pas de travail pour moi - le texte n'est pas sélectionnée sur cliquez sur. @vacip a dit, la raison pourrait être que le réel (caché) sur événement se produit après l'Entrée de l'événement et que tout simplement annule la sélection.
J'ai vu que la propriété et essayé les deux options disponibles. Aucune utilisation. Je pense que cette propriété est buggé, parce qu'il doit faire exactement ce dont j'ai besoin et ça ne marche pas. Avez-vous testé ce comportement? Si cela fonctionne, pourriez-vous s'il vous plaît partager une capture d'écran contenant toutes les propriétés de la zone de texte, pour que je puisse l'essayer avec le même jeu?
Mon mauvais.. je devrais avoir lu la documentation correctement avant de commenter ici. Il affirme que cette propriété est uniquement pour l'Onglet de pression de touche et pas pour autre chose. C'est ici: msdn.microsoft.com/en-us/library/office/gg251742.aspx
OriginalL'auteur ZygD | 2015-05-08
Vous devez vous connecter pour publier un commentaire.
Ne peut pas être plus simple que cela, je suppose...
Si vous cliquez sur la zone de texte ou de l'onglet, il va faire ce que vous voulez. Pour désélectionner le texte, utilisez les touches fléchées.
Explication
Si vous déboguer le code, vous verrez que même si vous avez dit
.SetFocus
, l'accent n'est pas sur la zone de texte..SetFocus
ne fonctionne pas dansTextBox1_Enter()
et vous avez besoin de se concentrer pour le reste du code du travail. Et donc mon alternative...Alternative
Vous aimerez aussi cette version 🙂 Cela permet de surmonter la limitation de l'utilisation de la souris dans la zone de texte
nice, +1 :-).
Énorme merci! P. S.: Un hasard - tout récemment, j'ai commencé à travailler avec VB.NET (vraiment difficile en ce moment) et il m'est arrivé à la terre sur le blog qui est d'une grande aide 🙂 Vous êtes génial! 🙂
Veuillez ne pas visiter ce lien 🙂 je n'ai pas de mise à jour de plus. Ici c'est le lien que vous souhaitez visiter.
Mais il y a ne? Vide chargement de la page.
OriginalL'auteur Siddharth Rout
Pff, m'a pris du temps. En fait, ton code fonctionne, mais il souligne le texte AVANT l'événement click se produit. Si vous en cliquant dans la case instantanément remplace la sélection réalisée par le code.
J'ai utilisé un retard de sélection, et ça marche, même si c'est un peu dégueulasse...
Le code pour les zones de texte:
Noter qu'il fonctionne même sans le {+ TimeValue("00:00:01")} partie, mais il pourrait théoriquement arrêter de travailler à la fois. Hmm, sur une seconde pensée, il suffit de laisser. Je doute qu'il n'aurait jamais causer un problème.
Maintenant le code dans module1:
Espère que cela fonctionne pour vous aussi. Ineresting problème. 🙂 Cheers!
Application.OnTime
, et très merci pour clarifier que le sur qui se passe avant le texte est mis en évidence par mon code. Le code fonctionne, cependant, je vais attendre pendant plusieurs jours, peut-être quelqu'un d'autre pourrait fournir une autre solution (comme vous l'avez dit, ce n'est pas très belle, bien que je l'aime vraiment).OriginalL'auteur vacip
Je ne parvenais pas à le sélectionner/mettre en surbrillance le texte à l'Entrée de l'événement que les événements mousedown et mouseup, venant après sont un peu la réinitialisation de la sélection.
Je pense que la plus bonne façon de réaliser ce que vous voulez, c'est ceci :
De sorte que chaque fois que vous voulez activer l'un de la zone de texte par programmation, vous devriez appeler le sous SelectTboxText, ce qui n'est pas vraiment gênant de l'OMI. J'ai fait les 2 boutons pour cela comme un exemple.
Avez-vous testé ? parce que selon moi, Il fait ce qui était nécessaire, et non pas ce que vous pensez qu'il va faire. La vérification de la variable
LastEntered
est là pour ça, il ne le mettez en surbrillance le texte sur le PREMIER événement de souris de la même zone de texteDésolé, mon mal, j'ai totalement raté le dernier entré dans la partie. Il fonctionne maintenant.
Merci pour la contribution. Cependant, pour l'instant, j'ai mis en œuvre la solution proposée par Siddharth Déroute. J'ai fait ce que vous avez dit séparées du processus à un autre sous afin de se faire bourrer par programmation. J'ai aussi trouvé utile
msforms.textbox
, car, auparavant, j'ai appelé cette chose juste uncontrol
, ce qui n'est pas précis 🙂OriginalL'auteur Thomas G
C'est un peu une amélioration de ce que @vacip posté. L'avantage que vous obtenez est que vous n'avez pas besoin d'ajouter une méthode distincte dans le Module pour chaque nouvelle zone de texte.
Le code suivant dans votre Formulaire d'Utilisateur:
Le code suivant va dans un Module:
+ 0.00001
déclaration? C'est en secondes, minutes ou heures?Il ajoute 1 seconde et est fonctionnellement identique
TimeValue("00:00:01")
. LeOnTextBoxEnter
fonction provoque l'exécution de laSelectAllText
après 1 seconde, et attendre encore 1 seconde avant qu'il annule l'opération, dans le cas où il n'est pas exécuté pour n'importe quelle raison.OriginalL'auteur Pradeep Kumar
Je sais que c'est hors de date, mais je vais la laisser ici dans le cas où il aide quelqu'un dans ma position.
Ce que je veux est:
Tout d'abord, il est important de savoir que "Sélectionner tout le texte" est le comportement par défaut lors de la tabulation dans une zone de texte et Mettre le curseur ici" est le comportement par défaut lorsque vous cliquez sur une zone de texte, donc nous avons seulement besoin de vous soucier de ce que la souris est en train de faire.
Pour ce faire, nous pouvons garder une trace de l'Actif de Contrôle, mais uniquement lorsque la souris se déplace au-dessus de notre zone de texte (ie. avant le Clic)
Code:
OriginalL'auteur Luke
utiliser cette
OriginalL'auteur Vasily
Le comportement que vous essayez de mettre en œuvre est déjà intégrée dans le
TextBox
. Lorsque vous déplacez la souris sur le côté gauche de la zone de texte, le curseur de la souris pointe vers la droite. Si vous cliquez sur, cela permet de sélectionner tout le texte dans le champ. En cliquant n'importe où ailleurs vous pouvez le désélectionner le texte.Je vais essayer quelques autres stratégies pour voir si je peux obtenir que cela fonctionne dans l'un des Sous.
Merci, Kris, pour le commentaire. Ce haut-utilisation n'est pas très pratique, c'est pourquoi je regarde pour un autre, plus intuitive de la solution.
OriginalL'auteur Kris
Essayer le même code avec
TextBox1_MouseDown
. Il devrait fonctionner.MouseDown
seul ne m'aide pas, parce que je veux aussi être en mesure d'appeler facilement la fonction de la programmation. Jusqu'à présent, le problème semble être résolu, comme je l'ai mis en œuvre cette solution fourni par Siddharth Déroute après le déplacement de son code fourni dansMouseDown
à une fonction distincte.OriginalL'auteur Ajit S Fernando