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

Windows Forms Discussion :

Combiner deux events


Sujet :

Windows Forms

  1. #1
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut Combiner deux events
    Bonjour,

    je voudrais savoir s'il est possible de combiner deux events,
    mon problème exact est le suivant :
    1. j'ai un textBox, pour lequel je voudrais executer un traitement lorsque j'effectue la selection de ces caractères, mais malheureusement, il n'y a pas un event qui détecte le changement de la propriété : SelectionLength
    2. donc j'ai pensé à chercher à combiner les deux events MouseDown & MouseMove, mais je ne sais pas si c'est possible ou pas (peut etre que ce que je suis entrain de dire est une bétise )
    3. sinon, est ce qu'il possibilité de créer un event pour textBox, qui détecte le changement de la propriété : SelectionLength .?


    Merci d'avance
    Bien cordialement

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    Il ne faut pas oublier que la modification de la sélection peut se faire également au clavier.

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    donc vaudrait mieux gérer mousemove et keypress
    (sur mousemove, vérifier l'état de boutons de souris, si y en a un qu'est enfoncé c'est bon)

    et avoir une variable lastselectionlength
    sur les 2 evenements selectionlength != lastselectionlength alors tu appelles le void que tu veux

    voir meme ne pas vérifier l'état du bouton sur le mousemove, comme ca les events peuvent gérées dans le meme void
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut
    salam,

    merci pour vos réponses,
    la solution est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void zone_MouseMove(object sender, MouseEventArgs e)
    {
         if (zone.SelectionLength != 0)
         {
              //traitements à effectuer
         }
    }
    Bien cordialement

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

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Salut !
    Il n'y a aucun message windows qui est envoyé quand la sélection change. Du moins, a ma connaissance. Donc même en surchargeant le WndProc, on n'arrive pas a récupérer un message du genre WM_SELECTIONCHANGED.
    Pour arriver à quelque chose, il faudra gérer tout une combinaison de cas.
    Il existe en effet de nombreux cas où la sélection change. Quand on sélectionne à la souris, au clavier, ctrl+A, l'utilisation des propriété SelectionStart/Length, parfois même le glisser/déposer.

    La meilleure solution que j'ai à te proposer est donc une approche basée sur un timer qui vérifie à intervalle régulier si la selection à changée. Il faut savoir que les EditBox ont déjà un timer visiblement pour faire clignoter le caret. J'aurais aimé m'en servir, mais bien que j'arrive à capter le code du message via spy++ (c'est 0x0118), dans la surcharge de WndProc je n'arrive pas à l'avoir.

    Voici donc un bout de code avec implémentation d'un timer supplémentaire
    Code csharp : 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
     
    public class MyTextBox : System.Windows.Forms.TextBox
    {
    	public event EventHandler SelectionChanged;
     
    	private int _MySelStart		= 0;
    	private int _MySelLength		= 0;
    	private Timer tm;
     
    	public MyTextBox()
    	{
    		tm = new Timer();
    		tm.Interval = 250;
    		tm.Tick += new EventHandler(tm_Tick);
    		tm.Start();
    	}
     
    	~MyTextBox()
    	{
    		tm.Stop();
    		tm.Dispose();
    	}
     
    	void tm_Tick(object sender, EventArgs e)
    	{
    		CheckSelectionChanged();
    	}
     
    	private void CheckSelectionChanged()
    	{
    		if (SelectionLength != _MySelLength || (SelectionStart != _MySelStart && SelectionLength != _MySelLength))
    			OnSelectionChanged();
    	}
     
    	protected virtual void OnSelectionChanged()
    	{
    			if (SelectionChanged != null)
    				SelectionChanged(this, new EventArgs());
    			_MySelStart = SelectionStart;
    			_MySelLength = SelectionLength;
    	}
    }

    Ce code implémente une surcharge de du textbox classique en ajoutant un évènement SelectionChanged. Cet évènement est améliorable en créant ton propre délégué et en faisant quelques controles de plus, tu pourra obtenir un évènement qui t'indiquera les paramètres de sélection AVANT que celle-ci ne change. Et tu pourra même permettre l'annulation de ce changement.

    Les limitations sont les suivantes :

    - le timer est membre d'instance, autrement dit, si tu pose 200 de ces textbox, tu aura 200 timer. Il serait appréciable de rendre ce timer statique, mais il faudra faire des contrôles supplémentaire pour le rendre ThreadSafe.

    - La notification du changement de sélection se fait dans les 250ms qui suivent ce changement. Ce temps est réglable. Temps trop court = beaucoup de ressources consommées, temps trop long = délai trop long avant notification. A adapter à tes besoins donc.

    - L'utilisation d'un timer implique que le test afin de savoir si la sélection à changée se fait de manière périodique et donc sera effectué totalement inutilement 99% du temps.

    C'est soit ca, soit tu override (ou pose un handler) sur tous évènements suceptibles de changer la sélection pour une raison X ou Y. En plus de surcharger les propriétés SelectionLength et SelectionStart (cette dernière n'est pas virtuelle). Sans oublier les méthodes Select(), SelectAll() et peut être même ScrollToCaret() permettant de sélectionner du texte. En supposant que ce soit possible ^^'.


    Edit :
    Ta solution ne semble pas du tout bonne par rapport à la problématique énoncée.
    Le traitement se fera des dizaines et des dizaines de fois pour la même sélection.
    Tu sélectionne un texte, la condition sera vérifiée, tu déplaces ensuite la souris, la condition est toujours vrai.
    A contrario, tu sélectionne un texte au clavier, ta condition n'est pas vérifiée car le Mouse_Move ne sera pas lancé.

  6. #6
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut
    salut ctxnop,

    je te remercie beaucoup pour l'effort que t'as fait pour me proposer une solution,
    j'avoue que t'as solution m'a beaucoup inspiré pour les traitements que je vais faire,

    Merci beaucoup encore une fois
    Bien cordialement

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

Discussions similaires

  1. Combiner deux evenements de la souris
    Par bracket dans le forum 2D
    Réponses: 5
    Dernier message: 12/04/2009, 19h35
  2. Combiner deux images
    Par bruno bdf dans le forum 2D
    Réponses: 3
    Dernier message: 04/07/2008, 13h56
  3. Combiner deux champs en un seul
    Par nicolas2603 dans le forum IHM
    Réponses: 2
    Dernier message: 12/12/2007, 12h08
  4. Combiner deux matrices
    Par bernard6 dans le forum MATLAB
    Réponses: 4
    Dernier message: 13/04/2007, 14h32
  5. [C#] Combiner deux DLL ?
    Par choas dans le forum Windows Forms
    Réponses: 5
    Dernier message: 11/05/2006, 22h51

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