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 :

[C#] Evenement sur classe virtual


Sujet :

Windows Forms

  1. #1
    Membre du Club Avatar de papouAlain
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 127
    Points : 64
    Points
    64
    Par défaut [C#] Evenement sur classe virtual
    j'ai deux classes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Class1
    {
    public delegate void OptionsHandler (object sender, OptionsEventArgs e);
    public virtual event OptionsHandler Selected;
     
    public Class1()
    {
    this.Selected += new OptionsHandler(OnSelected);            
    }
    public virtual void OnSelected(object sender, EventArgs e)
    {
    }
    }
    Et
    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
     
    public class Class2 : Class1
    {
     
    override public event OptionsHandler Selected;
     
    public Class2()
    {
    }
    ...
     
    Selected(this, eOptions);
    ...
     
    }
    Je souhaite que les événements se déclenchent dans Class1, bien évidemment, de façon à avoir un traitement identique pour toutes les classes qui héritent de Class1.
    or j'obtiens le résultat suivant en execution sur l'émission du Selectedet je ne comprends pas pourquoi ???
    System.NullReferenceException
    C'est au pied du mur, qu'on voit le mieux le mur !!!

  2. #2
    Membre régulier
    Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2002
    Messages : 88
    Points : 97
    Points
    97
    Par défaut
    Parceque ton event est null puisqu'aucun n'handler lui a été affecté. Il faut que tu appelles le constructeur de ta class1 dans Class2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public Class2() :base()
    { 
    }

  3. #3
    Membre du Club Avatar de papouAlain
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 127
    Points : 64
    Points
    64
    Par défaut
    en fait j'avais fait une erreur de recopie dans mon post. Je fais déjà ce que tu me conseilles. Mais ça ne semble pas suffire...
    C'est au pied du mur, qu'on voit le mieux le mur !!!

  4. #4
    Membre régulier
    Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2002
    Messages : 88
    Points : 97
    Points
    97
    Par défaut
    dommage alors...
    es tu sur que tu passes dans le constructeur de class1? (avec un point d'arrêt)
    lorsqu'il y a l'exception, tu es dans class1 ou dans class2?
    est ce que c'est Selected qui est à null et qui déclenche l'exception?
    :

  5. #5
    Membre du Club Avatar de papouAlain
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 127
    Points : 64
    Points
    64
    Par défaut
    j'ai fait un peu différemment.
    création d'une méthode dans Class1 : SendSelected
    appel de cette méthode depuis Class2.
    plus besoin de référencer l'événement dans Class2.

    résultat ça fonctionne. Certes, ça ne réponds pas à ma question...

    Mais maintenant j'ai un autre Pb qui se pose :
    je voudrais que toutes les classes héritant de Class1 reçoivent l'événement et Là ça ne fonctionne pas, car celui-ci est consommé dans la classe Class1 (et pour cause, c'est ma modification qui entraine qu'il n'est plus diffué).

    Si quelqu'un a une inspiration ?
    C'est au pied du mur, qu'on voit le mieux le mur !!!

  6. #6
    Membre régulier
    Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2002
    Messages : 88
    Points : 97
    Points
    97
    Par défaut
    il ne te suffit pas de surcharger OnSelected() dans class2?

  7. #7
    Membre du Club Avatar de papouAlain
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 127
    Points : 64
    Points
    64
    Par défaut
    justement je voudrais pas avoir à surcharger pour que mon traitement reste générique...
    C'est au pied du mur, qu'on voit le mieux le mur !!!

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par papouAlain
    justement je voudrais pas avoir à surcharger pour que mon traitement reste générique...
    Pas de bol. La méthode recommandée pour implémenter le mécanisme des événements est :
    - la classe de base déclare l'événement Toto et une méthode protected virtual OnToto qui déclenche l'événement (this.Toto) après avoir testé que this.Toto n'est pas nul.
    - les classes dérivées font un override de OnToto (sans oublier d'appeler la version de base)
    - le reste du monde se branche sur laClasse.Toto pour faire les gestionnaires externes.

    Bref, dans ton cas :
    - vire le virtual dans la déclaration de l'événement pour Class1
    - vire la redéclaration de l'événement dans Class2
    - vire l'affectation de OnSelected comme gestionnaire de l'événement
    - vire 'object sender' dans l'interface de OnSelected (c'est un paramètre utilisé pour les gestionnaires d'événement externes. il n'a rien à faire ici)
    - dans OnSelected, vérifie que this.Selected n'est pas nul, et dans ce cas, exécute this.Selected( this, e );
    - dans Class2, n'exécute pas Selected. Oublie Selected, fini, enterré, ailleurs. Exécute OnSelected (et donc pas besoin de passer this à chaque fois).
    - tu n'es pas obligé de faire d'override de OnSelected si l'implémentation que tu as mise dans Class1 te suffit.


    Au passage, oui je sais qu'en ASP.NET il y a Page_Load, Page_Init etc pour gérer les événements de la page. Et que ça contredit la 'directive' qu'au sein de la même hiérarchie de classe on fait des overrides des méthodes OnLoad et OnInit plutôt que créer des gestionnaires supplémentaires. Ce n'est jamais qu'une des nombreuses incohérences du framework. Utiliser OnLoad et OnInit est préférable, faut juste faire comprendre ça au designer (autrement dit, virer soi-même les méthodes bidons qu'il génère).


    edit:
    Oh et puis tant qu'à faire, un peu de code :)
    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
    public class Class1
    {
      public delegate void OptionsHandler ( object sender, OptionsEventArgs e );
     
      public event OptionsHandler Selected;
     
      public Class1()
      {
      }
     
      public virtual void OnSelected( OptionEventArgs e )
      {
        if ( this.Selected != null )
          this.Selected( this, e );
      }
    }
     
    public class Class2 : Class1
    {
      public Class2()
      {
      }
     
      ...
     
      this.OnSelected( eOptions );
      ...
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  9. #9
    Membre du Club Avatar de papouAlain
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 127
    Points : 64
    Points
    64
    Par défaut
    Désolé, j'avais zappé sur ta réponse...
    j'étais parti dans d'autres essais et d'autres Posts pour essayer de trouver une solution à mon problème.

    je vais essayer ce que tu me propose et je te tiens au courant.

    merci
    C'est au pied du mur, qu'on voit le mieux le mur !!!

  10. #10
    Membre du Club Avatar de papouAlain
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 127
    Points : 64
    Points
    64
    Par défaut
    je viens de faire l'essai. ça marche à moitié.
    à savoir l'événement est émis de vers . Mais consommé par celle-ci et Class3, ne le vois jamais. : : :
    C'est au pied du mur, qu'on voit le mieux le mur !!!

  11. #11
    Membre régulier
    Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2002
    Messages : 88
    Points : 97
    Points
    97
    Par défaut
    Tu veux dire que tu as plusieurs objets qui sont de type Class2 ou Class3, et qu'ils sont instanciés à la fois ? Et tu voudrais que tous les objets instanciés et dérivant de Class1 reçoivent la notification ? :
    Si c'est ça, je pense qu'il faut que l'event de Class1 soit statique et que chaque Classi dérivant de Class1 ajoute un nouvel handler sur l'event de Class1.
    Sinon réexplique ce que tu veux faire peut être, parce que moi je m'y perds

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par papouAlain
    je viens de faire l'essai. ça marche à moitié.
    à savoir l'événement est émis de vers . Mais consommé par celle-ci et Class3, ne le vois jamais. :?: :?: :?:
    Fais voir le code, t'as dû rater une étape :)

    Class3 c'est quoi ? C'est une nouvelle venue dans le topic :)


    Citation Envoyé par Pete
    Si c'est ça, je pense qu'il faut que l'event de Class1 soit statique et que chaque Classi dérivant de Class1 ajoute un nouvel handler sur l'event de Class1.
    Euh...
    Non ? :)

    Fouet ?
    Oui, voilà, fouet :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  13. #13
    Membre du Club Avatar de papouAlain
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 127
    Points : 64
    Points
    64
    Par défaut
    Class3 hérite de Class1, comme Class2.
    Mais class2, se sert au passage et Class3 reste en rideau...
    C'est au pied du mur, qu'on voit le mieux le mur !!!

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par papouAlain
    Class3 hérite de Class1, comme Class2.
    Mais class2, se sert au passage et Class3 reste en rideau...
    :evil:
    Si Class3 hérite directement de Class1, Class2 n'a rien à voir dans tout ça. Tu as juste dû rater un truc dans Class3. Son override de OnSelect ne peut pas être bloqué par celui de Class2 :)

    D'où l'intérêt de voir le code, parce que ça sent le cafouillage entre événements, gestionnaires et méthodes virtuelles :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  15. #15
    Membre du Club Avatar de papouAlain
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 127
    Points : 64
    Points
    64
    Par défaut
    Bon, je voulais pas vous imposer cette lecture longue et fastidieuse :
    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
     
    public class Class1 : System.Windows.Forms.Form
    {
    public delegate void OptionsHandler (object sender, OptionsEventArgs e);
    public event OptionsHandler Selected;		
    public Class1()
    	{
    	}
    public void Refresh (OptionsEventArgs e)
    	{
    	}
     
    public virtual void OnThemeSelected(OptionsEventArgs e)
    	{
    	if (this.Selected != null )
    		{
    		this.Selected(this, e );
    		}
    	}
    }
     
    public class Class2 : Class1
    {
    public new delegate void OptionsHandler (object sender, OptionsEventArgs e);
     
    public Class2 (ref Context thisContext): base ()
    	{
    	this.Selected += new Class1.OptionsHandler(this.onSelected);
    	}
    private void onSelected(object sender, Class1.OptionsEventArgs e)
    	{
    	base.Refresh (e);
    	}
    private void btnAppliquer_Click(object sender, System.EventArgs e)
    	{
    	this.OnThemeSelected (eOptions);
    	}
    }
    public class Class3 : Class1
    {
    public new delegate void OptionsHandler (object sender, OptionsEventArgs e);
     
    public Class3 (ref Context thisContext): base ()
    	{
    	this.Selected += new Class1.OptionsHandler(this.onSelected);
    	}
    private void onSelected(object sender, Class1.OptionsEventArgs e)
    	{
    	base.Refresh (e);
    	}
    }
    Quelques explications fonctionnelles :
    Tout commence dans Class2.btnAppliquer_Click,
    on fait appel à OnThemeSelected, qui Fire l'evt Selected dans Class1.
    et là j'aimerai que ça réagisse dans Class2 et dans Class3, par un onSelected qui appellerai mon Class1.Refresh().


    Tout à l'heure dans mon post je m'étais emmelé les crayons. En fait, j'avais rajouté un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    this.Selected += new.OptionsHandler(this.onSelected);
    private void onSelected(object sender, OptionsEventArgs e)
    	{
    	Refresh (e);
    	}
    dans Class1 et donc Class1 (et non Class2 comme je l'avais écris)consommait l'événement.

    Si je supprime cette verrue. Mon évement n'est reçu par personne...
    C'est au pied du mur, qu'on voit le mieux le mur !!!

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par papouAlain
    Quelques explications fonctionnelles :
    Tout commence dans Class2.btnAppliquer_Click,
    on fait appel à OnThemeSelected, qui Fire l'evt Selected dans Class1.
    et là j'aimerai que ça réagisse dans Class2 et dans Class3, par un onSelected qui appellerai mon Class1.Refresh().
    Ok, voilà qui éclaircit bien les choses :)

    Et donc oui, il y a bien eu cafouillage :)

    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
    public class Class1 : System.Windows.Forms.Form
    {
      public delegate void OptionsHandler (object sender, OptionsEventArgs e);
      public event OptionsHandler Selected;		
      public Class1()
      {
      }
     
      public void Refresh (OptionsEventArgs e)
      {
      }
     
      protected virtual void OnThemeSelected(OptionsEventArgs e)
      {
        if (this.Selected != null )
        {
          this.Selected(this, e );
        }
      }
    }
     
    public class Class2 : Class1
    {
      public Class2 (ref Context thisContext): base ()
      {
      }
     
      protected override void OnThemeSelected(OptionsEventArgs e)
      {
        base.OnThemeSelected( e );
        this.Refresh (e);
      }
     
      private void btnAppliquer_Click(object sender, System.EventArgs e)
      {
        this.OnThemeSelected (eOptions);
      }
    }
     
    public class Class3 : Class1
    {
      public Class3 (ref Context thisContext): base ()
      {
      }
     
      protected override void OnThemeSelected(OptionsEventArgs e)
      {
        base.OnThemeSelected( e );
        this.Refresh (e);
      }
    }
    Donc, pour reprendre ce que j'avais dit précédemment sur le mécanisme :
    - le Selected de Class1 ne sert *que* pour les classes qui n'en héritent pas. Si personne d'autre n'est censé pouvoir se rattacher à cet événement, tu n'as même pas besoin de mettre ça.
    - le OnThemeSelected est la méthode qui gère l'événement dans la hiérarchie de classes. Parce qu'au niveau des classes concernées, il n'y a pas d'événement. C'est juste une méthode comme les autres.
    - les classes dérivées doivent pouvoir spécialiser le comportement de la méthode OnThemeSelected (du moins dans ton cas), donc ce doit être une méthode 'virtual'. Donc 'protected'.
    - les classes dérivées spécialisent le comportement de cette méthode en en faisant un override, qui appelle la méthode de base et ajoute un traitement supplémentaire (dans ton cas, l'appel à Refresh)

    C'est tout. Y a pas vraiment à chercher plus loin. C'est pas une question d'événement, c'est une question d'héritage.

    La notion d'événement n'a d'utilité que quand il s'agit de se brancher sur ce qui se passe dans une autre classe, avec laquelle on n'a pas de lien privilégié. Un formulaire qui se branche sur le clic d'un bouton par exemple. Mais quand on reste au niveau d'une même hiérarchie, on s'en fout complètement, on ne s'occupe que de méthodes, virtuelles ou non.

    Que la méthode OnThemeSelected de Class1 déclenche un événement, Class2 et Class3 n'ont même pas à le savoir. C'est pas leur affaire :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  17. #17
    Membre régulier
    Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2002
    Messages : 88
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par Maniak
    Citation Envoyé par Pete
    Si c'est ça, je pense qu'il faut que l'event de Class1 soit statique et que chaque Classi dérivant de Class1 ajoute un nouvel handler sur l'event de Class1.
    Euh...
    Non ?
    Fouet ?
    Oui, voilà, fouet
    aïe ! non pas le fouet, je m'insurge

    Moi j'avais compris qu'il y avait une classe générale qui devait dispatcher une info ou un évènement à plusieurs classes spécialisées et instanciées. Genre : Class1 emet son évènement, Class2 et Class3 (qui n'ont pas de références sur Class1) reçoivent la notification. Donc je dans ce cas de figure, pourquoi pas un membre static?
    Enfin bon, tout ceci pour ma défense. Sinon, est ce résolu? (le tag... )

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par Pete
    Moi j'avais compris qu'il y avait une classe générale qui devait dispatcher une info ou un évènement à plusieurs classes spécialisées et instanciées. Genre : Class1 emet son évènement, Class2 et Class3 (qui n'ont pas de références sur Class1) reçoivent la notification.
    Dans ce cas-là, ça passerait par un 'vrai' événement oui. Les instances de Class2 et Class3 devraient se brancher sur l'événement de Class1, et leurs gestionnaires seraient exécutés automatiquement quand il faut.

    Citation Envoyé par Pete
    Donc je dans ce cas de figure, pourquoi pas un membre static?
    Ben par exemple pour Class1. Tu en crées 3 instances, chacune avec son événement Select. Tu as une dizaine d'autres objets qui se branchent sur l'événement Select de l'une ou l'autre de ces 3 instances. Si l'événement est statique, il n'y a qu'une seule liste de gestionnaires pour toutes les instances de Class1. Pas terrible. S'il est membre de Class1, chaque instance a ses gestionnaires.

    Après, il y a peut-être des utilités à avoir un événement statique, faut voir :)

    Citation Envoyé par Pete
    Sinon, est ce résolu? (le tag... :wink: )
    Bonne question :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  19. #19
    Membre du Club Avatar de papouAlain
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 127
    Points : 64
    Points
    64
    Par défaut
    Non, j'étais pas mort, seulement débordé !
    merci pour tes explications Maniak !

    je suis d'accord avec toi sur le fait que le mécanisme d'événement ne devrait pas m'etre necessaire, si mon héritage fonctionnait.
    J'ai viré tous les aspects événementiels (que j'avais rajouté au fur et à mesure car j'arrivais pas à faire fonctionner le machin). Tout ceci n'a fait que rajouter au cafouillage (c'est souvent comme ça quand le délais approche). Et ça ne le fait toujours pas.

    Je me demande si je deviens pas fada !
    J'ai refait un projet tout con à coté.
    Un formulaire (Form1) hérite d'un second (Form2).
    Dans Form 2 je n'ai qu'une Méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		protected virtual void OnMe ()
    		{
    		}
    Dans Form 1 j'ai mis un button et un TextBox.
    et juste rajouté le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    		private void button1_Click(object sender, System.EventArgs e)
    		{
    			base.OnMe();
    		}
    		protected override void OnMe()
    		{
    		textBox1.Text = "Ca marche";
    		}
    .
    Et bien quand je clique sur le button, le code se déroute bien dans Form2 (normal avec base.OnMe()), mais pas dans Form1.OnMe ce qui fait que "Ca marche" ne s'affiche jamais.
    Ca résume mon problème assez bien l'override ne semble pas s'executer.
    C'est au pied du mur, qu'on voit le mieux le mur !!!

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par papouAlain
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		private void button1_Click(object sender, System.EventArgs e)
    		{
    			base.OnMe();
    		}
    		protected override void OnMe()
    		{
    		textBox1.Text = "Ca marche";
    		}
    Et bien quand je clique sur le button, le code se déroute bien dans Form2 (normal avec base.OnMe()), mais pas dans Form1.OnMe ce qui fait que "Ca marche" ne s'affiche jamais.
    Ca résume mon problème assez bien l'override ne semble pas s'executer.
    On va y arriver on va y arriver :)

    Bon, le formulaire de base, c'est bon, n'y touche plus :)
    Le formulaire qui en hérite, au lieu de ce qui est au-dessus, il faut ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private void button1_Click(object sender, System.EventArgs e)
    {
      this.OnMe();
    }
     
    protected override void OnMe()
    {
      base.OnMe();
      textBox1.Text = "Ca marche";
    }
    Autre dose d'explications :
    - appeler base.OnMe() n'exécute que la méthode de la classe de base. Ça ne risque pas d'appeler les overrides, c'est pas le but. Tu dois appeler le OnMe de la classe en cours.
    En revanche, l'override doit appeler la méthode de base. C'est dans ce sens-là que se fait le chaînage. C'est la méthode dérivée qui est appelée, et elle retransmet l'appel à la méthode de base pour que le traitement de base soit effectué.


    Je te conseillerais fortement de te trouver un tutorial sur la POO et tout ce qui est héritage et méthodes virtuelles. Parce que c'est uniquement ça ton problème :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Capter l'evenement sur une classe suite AJAX
    Par flashnet dans le forum jQuery
    Réponses: 5
    Dernier message: 07/02/2012, 18h27
  2. Evenement sur objet dynamique
    Par CanardJM dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 19/11/2004, 13h56
  3. Evenement sur les barres de défilement d'une ScrollBox
    Par Nico118 dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/05/2004, 14h56
  4. [VB.NET] Instanciation objet (sur class perso.)
    Par DaxTaz dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/05/2004, 11h07
  5. [FLASH MX 2004] [ecouteur] evenements sur un clip
    Par marco_ dans le forum Flash
    Réponses: 2
    Dernier message: 30/04/2004, 13h28

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