[help] Probleme avec l'évenement d'un composant [Résolu]

Signaler
Messages postés
10
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
11 juin 2006
-
Messages postés
10
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
11 juin 2006
-
Bonjour,

Je dévellope ces temps ci des composants et donc j'ai du créé des évenements mais mon problème est que c'est evenement peuve etre utilisé que a 1 endroit à la fois . Si jessaye d'utilisé le meme évenement à 2 endroit différant (en meme temp) il y en a  un des 2 qui ne va pas marcher !! Alors que 1à la fois les 2 marches. Donc je ne sait pas si je doit rajouter quelque chose dans les déclaration ou autre

Dans mes composant il sont déclarér de cette manière :

public delegate void OnDetectHandler(object sender,double RR);
public event OnDetectHandler OnDetect;

puis dans mon code j'utilise :

Detect.OnDetect +=new ECG.DetectR.OnDetectHandler(Detect_OnDetect);

J'espère avoir été clair et que quelqu'un sera me répondre ! Merci d'avance

9 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Petit exemple pour résumé :
Je fais une classe qui a les events :

public
class
Class1
{
  
public
delegate
void
RienEventHandler();
  
public
event
RienEventHandler Rien;
  
public Class1()
   {
     
if (Rien !=
null)
this.Rien();
   }

   public
void Test()
   {
     
if (Rien !=
null)
this.Rien();
   }

   public
void X()
   {
     
foreach (
Delegate del
in Rien.GetInvocationList())
      {
        
if (del !=
null)
Console.WriteLine(del.Method.Name);
      }
   }
}

Dans une autre classe, qui utilise class1, on aura :

public
partial
class
Form1 :
Form
{
  
private
Class1 cl1 =
new
Class1();
  
public Form1()
   {
     
this.InitializeComponent();
      cl1.Rien +=
new
Class1.
RienEventHandler(
this.cl1_Rien1);
   }
 

   private
void Form1_Load(
object sender,
EventArgs e)
   {
      cl1.Rien +=
new
Class1.
RienEventHandler(
this.cl1_Rien2);
      cl1.X();
   }

  
private
void cl1_Rien1()
   {
     
Console.WriteLine(
"1");
   }

   private
void cl1_Rien2()
   {
     
Console.WriteLine(
"2");
   }
}La méthode X, va écrire ceci :

cl1_Rien1
cl1_Rien2

Se sont en effet les deux event handler auxquels je me suis inscrit.

<hr size="2" /> VC# forever
=13319
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Salut,
Non pas très clair en fait.
Ca veut dire quoi "utilisé le meme évenement à 2 endroit différant (en meme temp)" ?
Un petit exemple de code?

<hr size= "2" /> VC# forever
=13319
Messages postés
10
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
11 juin 2006

EN fait pour etre plus clair, Sur ma form1, g ce composant, DetectR ( Pour donez plus de précisions c un filtre qui permet de traiter un electrocardiogramme ) et un autre composant qui st un autre filtre et en fait g créé les composant pour qu'il comunique entre eux directement ce qui veut dire que lors de l'instanciation du 2ème filtre, ce composant crée automatiquement l'evenement si l'utilisateur a choisie le filre :

        public ECG.DetectR DetectionR
        {
            get
            {
                return Detect;
            }
            set
            {
                Detect=value;
                if (Detect!=null)
                    Detect.OnDetect +=new ECG.DetectR.OnDetectHandler(Detect_OnDetect);

            }

Mais je déclare aussi dans ma form1 :

this.detectR1.OnDetect += new ECG.DetectR.OnDetectHandler(this.ici);

Ce qui fait que normalement je souhaiterai que lors de l'evenement OnDetect il envoi bien mes paramettre au 2 fonction en meme temps mais malheuresement il arrive a en envoyer que a 1 a la fois. mais si j'en déclare que 1 ca marche tres bien...

J'espere que la c plus clair lol merci d'avance pour les réponse
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Ok, donc ce que tu veux dire, c'est que ton event à plusieurs abonné (plusieurs handler en fait).
La liste est stockée dans un tableau et tu peux y avoir accès en appelant la méthode GetInvocationList de ton event. Tu peux vérfier quelles méthodes seront appelées.

Une chose qu'il faut garder en tête, si je me souviens bien, c'est qu'on a aucun moyen de savoir dans quel ordre les éléments seront dans le tableau, et donc aucun moyen de savoir dans quel ordre ils seront executés.
C'est à dire que chaque eventHandler ne soit pas dépendre d'un autre, car on peut pas savoir si celui-ci sera executé avant ou après.

<hr size= "2" /> VC# forever
=13319
Messages postés
10
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
11 juin 2006

Oki merci, je ne savai pas pour le systeme de tableau et GetInvocationList()
!  En tous cas merci pour ton aide !
Messages postés
10
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
11 juin 2006

apres vérification, j'ai remarqué que le problème ne venait pas de la ^^ En fait le problème est le suivant par exemple g aussi un composant qu g fait qui permet de tracer des graph mais le probleme c'est que si j'en instancie plusieur par exempl : scop1,scop2,scop3 et que je veuille par exemple appeller la méthode Trace de scop2, il va quand meme tracer comme si j'avais appelez trace depuis scop1 je vous mets un bout du code de mon composant du graph  :

        private void OnPaint(object sender,PaintEventArgs e)
        {

                g= CreateGraphics();
                Cadre=new Rectangle(0,0,this.Width,this.Height);
                ClCd=new SolidBrush(f);
                g.FillRectangle(ClCd,Cadre);
                Eponge=new Rectangle(0,0,20,this.Height);
                ClEp=new SolidBrush(f);
                ClTrace=new Pen(c);
                sym=this.Height/2;

                sx1=0;
                sy1=0;
                sx2=this.Width;
                sy2=this.Height;
                sx=sx1+1;
                sy0=sym;

        }

        public void Trace(double y)
        {   
       
                this.sy=(int)(sym-y);
           
            if (sy < sy1)
                sy = sy1;
            if (sy > sy2)
                sy = sy2;
            // Tracé de la courbe
            g.DrawLine(ClTrace,sx-1,sy0,sx,sy);
               
        //Eponge
            Eponge.X=sx+1;
            if (sx <= sx2-20)
                g.FillRectangle(ClEp,Eponge);
            sx++;
            if(sx>sx2)
            {
                Eponge.X=sx1;               
                g.FillRectangle(ClEp,Eponge);
                sx=sx1+1;
            }
            sy0=sy;
        }

Donc si je fait scop2.Trace(valy), le programme agie comme si s'etai scop1.Trace(valy). !

merci
Messages postés
10
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
11 juin 2006

c'est vrai que je suis en composant, le problème  c'eai que j'avais mit un static sur 'g' alors qu'il ne fallai pas :s dsl du dérangement mais ca fait que 3 semaine que je fait du c# pour mon stage :) Sinon si quelqu'un aurai un tuto ou un cour sur le transfert de message par flow ou flux de donnéé entre composant ca serai cool car j'ai vu que s'est possible en delphi mais j'ai rien trouvé en c# ! merci
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Euh, donc le problème est résolu pour finir ou pas ?

<hr size= "2" /> VC# forever
=13319
Messages postés
10
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
11 juin 2006

oui oui :) merci  encore :)