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 :

[Compatibilité] Signifier un changement à la classe appelante


Sujet :

Windows Forms

  1. #1
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut [Compatibilité] Signifier un changement à la classe appelante
    Bonjour,

    Je suis toujours sur mon MessageBox amélioré (cf signature).
    L'API est équivalente à celle de MessageBox : une méthode Show qui prend les paramètres de la boite et qui retourne un DialogResult.
    Le problème de l'aide est déjà résolu (cf un autre sujet).

    Je suis en train d'ajouter la gestion du case à cocher de type "Ne plus afficher ce message".
    Le problème est qu'il faut informer la classe appelante de l'état de cette case.
    J'ai envisagé plusieurs solutions :
    • Utiliser un event personnalisé : Impossible car l'utilisateur n'a pas accès à une instance de ma classe.
    • Utiliser un event de la classe parent : Impossible car aucun event ne correspond à cette action dans S.W.F.Form, et on ne peut pas définir de nouvel event.
    • Utiliser une autre valeur de retour : Impossible sans casser la compatibilité ascendante de l'API.
    • Utiliser un paramètre passé par référence : Impossible car Show utilise un nombre variable de paramètres (params Object[])
    • Utiliser un delegate passé en paramètre : Hmmm pas convaincu... que ça marche et que ce soit propre/

    Je me tourne vers vous en espérant obtenir d'autres perspectives, si vous en avez.

    Merci à tous.
    Saum'

  2. #2
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 118
    Points
    118
    Par défaut
    Ok, je sais pas si j'ai bien compris toute la problématique, mais ne pourrais-tu pas faire un truc du genre :

    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
     
    public class EnhancedMessageBoxCaller{
      private bool showMoreWarning = true;
     
      public EnhancedMessageBoxCaller(){}
     
      public void noMoreWarning(){
        showMoreWarning = false;
      }
     
      public showMyMsgBox(){
        if(showMoreWarning)
          EnhancedMessageBox.Show(/* arguments mandatory */, this);
        // c'est dans la classe EnhancedMessageBox que tu
        // apelles noMoreWarning() en utilisant le this si la case est cochée
      }
     
      public static void Main(string[] args){
        EnhancedMessageBoxCaller e = new EnhancedMessageBoxCaller();
        e.showMyMsgBox();
      }    
    }
    Ou alors c'est pas ça ?

    Edit : Ah, merde, j'avais pas lu ton avant dernier point.

  3. #3
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Le problème est que je ne connais pas les méthodes de la classe appelante A, je ne peux connaitre que le type de A et le cas échéant utiliser ses méthodes.
    Par exemple pour gérer l'aide, je déclenche un événement du formulaire actif en utilisant la reflection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MethodInfo met = _activeForm.GetType().GetMethod("OnHelpRequested", BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.FlattenHierarchy | BindingFlags.Instance);
    if (null != met)
    {
        // Call for help on the active form.
        met.Invoke(_activeForm, new object[] { new HelpEventArgs(MousePosition) });
    }
    J'utiliserais bien un mécanisme similaire, mais il n'existe pas de méthode dans Form qui correspondrait à un changement d'état d'un checkbox ou quelquechose s'en approchant.

    Il faut garder à l'esprit que InformationBox est un composant qui ne doit absolument pas dépendre d'autre chose que les classes du framework. L'idée est de pouvoir ajouter l'assembly dans un projet existant et utiliser InformationBox en l'état.
    J'ai donc besoin d'un mécanisme générique qui me permet de pouvoir récupérer ou informer l'utilisateur de la valeur de cette case, sans modifier le type de retour de la fonction Show.

    En tout cas, merci de ta réponse.

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Bon je crois que je fais ajouter une surcharge de la méthode Show qui prendra en paramètre ref un booléen destiné à contenir l'état final de la case à cocher.
    C'est je pense la solution la moins compliquée à mettre en place sans pour autant casser la compatibilité.

    Je laisse encore le topic ouvert quelques heures au cas où l'un de vous aurait une idée géniale

  5. #5
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Je suis donc resté sur la dernière solution indiquée. Allez hop, résolu.

    Merci.

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

Discussions similaires

  1. Appel d'une méthode d'une classe appelante
    Par FMC dans le forum Langage
    Réponses: 2
    Dernier message: 12/01/2008, 13h46
  2. Cookie et changement de classe css.
    Par luxmen dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/11/2007, 23h02
  3. Changement de classe d'une variable
    Par lebigboss dans le forum Langage
    Réponses: 1
    Dernier message: 15/05/2007, 16h51
  4. rechargement contexte lors d'un changement de classe
    Par n00noors dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 10/08/2006, 17h21
  5. [Js] changement de classe css qui annule le lien
    Par michaelbob dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 10/05/2006, 15h07

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