IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Récupérer le texte du presse papier avec My.Computer.Clipboard.GetText: Doublons


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut Récupérer le texte du presse papier avec My.Computer.Clipboard.GetText: Doublons
    Salut à tous,

    J'ai plusieurs TextBox pour lesquels certains type de contenu est interdit (des chiffres, des prix ou du textes).

    J'ai, pour cela, créé un ContextMenuStrip pour le menu contextuel lors d'un click droit (copier, coller, supprimer).

    J'ai écrit le code suivant pour l'évènement Opened du ContextMenuStrip:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    Private Sub cmsCopierCollerSuppr_Opened(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmsCopierCollerSuppr.Opened
     
            'Si le presse papier contient du texte alors
            If My.Computer.Clipboard.ContainsText = True Then
     
                If txtMagPre.Focused = True Or txtNbreVO.Focused = True Or txtNbreVF.Focused = True Or txtVolaAcheter.Focused =                    True Or txtLien.Focused = True Then
     
                    'Nbre de caractère max: 75
                    If My.Computer.Clipboard.GetText.Length <= 75 Then
     
                        tsmiColler.Enabled = True
     
                    Else
     
                        tsmiColler.Enabled = False
     
                    End If
     
                ElseIf txtAnnee.Focused = True Then
     
                    'Pour autotiser le coller, il faut que le presse papier contienne que des chiffres et moins de 5 caractères
                    If rgChiffre.IsMatch(My.Computer.Clipboard.GetText) = False And My.Computer.Clipboard.GetText.Length > 5 Then
     
                        tsmiColler.Enabled = False
     
                    Else
     
                        tsmiColler.Enabled = True
     
                    End If
     
                ElseIf txtVolAchete.Focused = True Then
     
                    'Pour autotiser le coller, il faut que le presse papier contienne que des chiffres et moins de 4 caractères
                    If rgChiffre.IsMatch(My.Computer.Clipboard.GetText) = False And My.Computer.Clipboard.GetText.Length > 4 Then
     
                        tsmiColler.Enabled = False
     
                    Else
     
                        tsmiColler.Enabled = True
     
                    End If
     
                ElseIf txtPrixEdit.Focused = True Then
     
                    'Pour autotiser le coller, il faut que le presse papier contienne un prix et moins de 6 caractères
                    If rgPrix.IsMatch(My.Computer.Clipboard.GetText) = False And My.Computer.Clipboard.GetText.Length > 6 Then
     
                        tsmiColler.Enabled = False
     
                    Else
     
                        tsmiColler.Enabled = True
     
                    End If
     
                        tsmiColler.Enabled = False
     
                End If
            End If
        End Sub
    Ensuite pour chaque bouton du ContextlenuStrip, je gère l'évènement Click

    Pour copier, j'utilise ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    My.Computer.Clipboard.SetText(txtMagPre.Text)
    Pour coller, j'utilise ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    txtMagPre.Text= My.Computer.Clipboard.GetText()
    Maintenant, il faut gérer aussi les raccourcis Ctrl + c et Ctrl + v.
    Dans l'évènement Keypress d'un TextBox :

    Code pour Ctrl + v
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    'Si ctrl+v
            If Asc(e.KeyChar) = 22 Then
     
                'Si le presse papier contient du texte et au maximum 75 caratères alors
                If My.Computer.Clipboard.ContainsText = True And My.Computer.Clipboard.GetText.Length <= 75 Then
     
                    txtMagPre.Text = My.Computer.Clipboard.GetText
     
                Else
     
                    e.Handled = True
     
                End If
            End If
    Tout fonctionne correctement (notamment la vérification de ce que contient le presse papier) mais (ah enfin) lorsque je fais Ctrl + v le contenu du presse papier apparaît deux fois. Si le presse papier contient "RRR", j'ai dans le TextBox: "RRRRRR".
    Si j'utilise le menu contextuel, je n'ai pas ce souci.
    J'ai vérifié en pas-à-pas cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    txtMagPre.Text = My.Computer.Clipboard.GetText
    Et txtMagPre.Text est bien égale au contenu du presse papier mais une fois le pas-à-pas terminé (end sub de l'évènement), le contenu du TextBox est égal à deux fois celui du presse papier.
    J'ai l'impression qu'il y a deux fois Ctrl + v.

    Merci pour vos aides et merci à tous de m'avoir lu.

  2. #2
    Membre émérite Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Par défaut
    Salut,

    Petite question toute bête, as-tu essayé de mettre ceci juste avant ta ligne pour copier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    txtMagPre.Text = ""
    txtMagPre.Text= My.Computer.Clipboard.GetText()
    Sinon il avait eu un post il y a quelques semaines d'un membre qui avait aussi des problèmes de doublons (dans son cas c'était plus que 2) comme si l'évènement se reproduisait plusieurs fois sans explication, peut-être aller chercher de ce coté-ci, vu que ton code n'a pas d'incohérence à première vue.

  3. #3
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    Merci pour ta réponse mais j'avais déjà essayé ce que tu proposes.
    Sinon je n'ai pas trouvé le post dont tu parles (j'utilises surement les mauvais mots clés)

  4. #4
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut.
    A ta place je créerai un nouveau contrôle.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    public class ValidatedTextBox
        : System.Windows.Forms.TextBox
    {
        private string _OldValue = string.Empty;
        private string _RegexValidationPattern;
     
        /// <summary>
        /// Obtient ou définit un motif Regex pour valider les données saisies.
        /// </summary>
        public string RegexValidationPattern
        {
            get { return _RegexValidationPattern; }
            set { _RegexValidationPattern = value; }
        }
     
        /// <summary>
        /// On surcharge la méthode appelée quand le texte change.
        /// </summary>
        /// <param name="e"></param>
        protected override void OnTextChanged(EventArgs e)
        {
            // Validation du texte qui viens d'être saisi (ou collé)
            if (System.Text.RegularExpressions.Regex.IsMatch(Text, _OldValue))
            {
                _OldValue = Text; // Le texte est validé et donc accepté.
                base.OnTextChanged(e); // Puisqu'on a accepté le texte, on applique exécute le code normal du TextBox.
            }
            else
                Text = _OldValue; // Le texte n'est pas validé et donc on restaure l'ancient texte.
        }
    }

    J'ai écris le code en C# par pure réflexe et j'ai la flemme de le ré-écrire en VB, je te laisse ce boulot :p
    Le principe est simple :
    Au lieu d'utiliser des TextBox classiques tu utilises cette classe. Ils sont en tout point identiques aux TextBox classiques à une exception près :

    Lorsque le texte contenu change, ce texte est validé par une expression rationnelle. Si le texte ne correspond pas à l'expression, alors l'ancien texte est restauré.
    En conséquence, que ce soit en frappe clavier, en copier/coller par raccourcit clavier ou par menu contextuel, ou encore par drag and drop, tous les cas sont gérés.

    A toi d'adapter à tes besoins, mais ca me semble plus judicieux que de gérer des évènements dans tous les sens pour gérer tous les cas et créer des menus contextuels pour écraser les menus standards, etc...

  5. #5
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    Merci ctxnop pour ton aide

    J'ai essayé pour un TextBox n'acceptant que des chiffres et 3 caratères maximum et ça fonctionne très bien.
    Je vais essayer avec les autres TextBox.
    Je reviendrai pour le résultat final.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonsoir,
    Déjà dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (System.Text.RegularExpressions.Regex.IsMatch(Text, _OldValue))
    ne doit on pas y voir le pattern en second argument?
    Et ensuite, dans l'esprit judicieux de ctxnop,
    pourquoi ne pas, classiquement, utiliser l'expression rationnelle au niveau du Validating ou du Validated de chaque TextBox?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/09/2007, 09h46
  2. Réponses: 12
    Dernier message: 10/06/2006, 19h07
  3. récupérer une image du presse papier
    Par amelhog dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/08/2005, 10h18
  4. Placer du texte dans le presse papier avec DOM
    Par Desraux dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 19/01/2005, 13h11
  5. Récupérer un évènement du presse papier
    Par cedrolin dans le forum MFC
    Réponses: 2
    Dernier message: 26/07/2004, 23h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo