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 :

Passer un argument à un event


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Points : 6
    Points
    6
    Par défaut Passer un argument à un event
    Bonjour,


    Généralement un event n'a que 2 arguments, l'objet (généralement "sender") et l'argument de l'event (généralement "e"). Comment je peux faire pour rajouter encore un troisième argument ?

    Dans mon cas, je veux récupérer une variable dans l'event "Paint" (qui est c). J'ai essayé avec un delegate mais ça ne marche pas et ça n'arrive pas à avoir la variable qui est dans la classe this (sachant que cet appel se fait dans le constructeur de la classe de la form, qui est représentée par this).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    this.panel1.Paint += delegate(object sender, PaintEventArgs e)
    {
            for (int i = 0; i < 40; i++)
            {
               for (int j = 0; j < 50; j++)
               {
                  e.Graphics.DrawImageUnscaled(tmp[c], 0 + (j * 10), 0 + (i * 10));
                            c++;
               }
            }
    };
    Je veux soit avoir l'équivalent de la méthode de l'évènement paint mais avec un paramètre de plus que je choisirais moi même, soit avoir l'accès à des éléments créés dans la classe où elle est déclarée.

    Je vous remercie et espère trouver de l'aide .

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    "c" est un champ de ta classe ? si c'est le cas ça devrait fonctionner avec le code que tu as donné...

    On ne peut pas ajouter de paramètre à un évènement existant : de toutes façons, ce n'est pas toi qui déclenche l'évènement, et le framework ne peut pas savoir quel paramètre supplémentaire tu voudrais recevoir...

  3. #3
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Salut,
    tu peux créer ton propre type délégué et l'évènement dont tu as besoin. La bonne pratique dans ce cas est de garder la signature objet source ("sender") / paramètres '"e"), au besoin en dérivant System.EventArgs pour créer un type de paramètres d'évènements encapsulant les informations dont tu as besoin.
    Ceci dit, dans ton cas précis, je te renvoie à la réponse précédente. La variable "c" est censée être accessible, peux-tu nous poster la ligne de sa déclaration ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Points : 6
    Points
    6
    Par défaut
    Voici tout le 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
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace Pixel
    {
        public partial class Form1 : Form
        {
            int x = 0;
            int c = 0; //variable que je déclare ici
            Bitmap [] tmp = new Bitmap[2500];
     
     
     
            public Form1()
            {
                InitializeComponent();
     
     
                for (int b = 0; b < 2500; b++)
                {
                    tmp[b] = new Bitmap(10, 10);
                }
     
                this.panel1.Paint += delegate(object sender, PaintEventArgs e)
                {
                    for (int i = 0; i < 40; i++)
                    {
                        for (int j = 0; j < 50; j++) 
                        {
                            e.Graphics.DrawImageUnscaled(tmp[c], 0 + (j * 10), 0 + (i * 10));
                            c++; //j'ai besoin d'y accéder ici
                        }
                    }
                };
     
            }
     
            private void Form1_KeyDown(object sender, KeyEventArgs e)
            {
     
                if (e.KeyCode == Keys.D1)
                {
                    for (int i = 0; i < 10; i++)
                        for (int j = 0; j < 10; j++)
                        {
                            tmp[x].SetPixel(i, j, Color.Black);
                        }
                    x++;
     
                    ((Form)sender).Refresh();
                }
     
                else if (e.KeyCode == Keys.D0)
                {
                    for (int i = 0; i < 10; i++)
                        for (int j = 0; j < 10; j++)
                        {
                            tmp[x].SetPixel(i, j, Color.White);
                        }
                    x++;
                    ((Form)sender).Refresh();
                }
     
                else if (e.KeyCode == Keys.Delete && x != 0)
                {
                    x--;
                    for (int i = 0; i < 10; i++)
                        for (int j = 0; j < 10; j++)
                        {
                            tmp[x].SetPixel(i, j, Color.Transparent);
                        }
     
                    ((Form)sender).Refresh();
                }
     
                else if (e.KeyCode == Keys.S && x != 0)
                {
                    Bitmap bmp = new Bitmap(panel1.Width, panel1.Height);
                    panel1.DrawToBitmap(bmp, new Rectangle(0, 0, panel1.Width, panel1.Height));
                    bmp.Save("capture.bmp", ImageFormat.Bmp);
                    bmp.Dispose();
                }
     
                else if (e.KeyCode == Keys.C && x != 0)
                {
                    //putNumbers();
     
                }
     
            }
     
            //private void panel1_paint(object sender, PaintEventArgs e)
            //{
            //    int c = 0;
     
            //    for(int i=0;i<40;i++)
            //    {
            //        for (int j = 0; j < 50; j++)
            //        {
            //            e.Graphics.DrawImageUnscaled(tmp[c], 0 + (j * 10), 0 + (i * 10));
            //            c++;
            //        }
            //    }
            //}
     
     
            //static public Bitmap BitmapFromBitmapData(byte[] BitmapData)
            //{
     
            //    MemoryStream ms = new MemoryStream(BitmapData);
     
            //    return (new Bitmap(ms));
     
            //}
     
     
            //static public byte[] BitmapDataFromBitmap(Bitmap objBitmap, ImageFormat imageFormat)
            //{
     
            //    MemoryStream ms = new MemoryStream();
     
            //    objBitmap.Save(ms, imageFormat);
     
            //    return (ms.GetBuffer());
     
            //}
        }
    }

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Bizarre... je ne vois pas ce qui ne va pas. Ca fait une erreur à la compil ?

    Par contre je ne vois pas trop l'intérêt d'utiliser un délégué anonyme ici... pourquoi tu ne déclares pas une méthode ?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Points : 6
    Points
    6
    Par défaut
    Non, ça compile nickel mais la fonction elle ne prend pas "c" en compte. On dirais qu'elle ne l'utilise (et sans faire d'erreur d'éxecution). C'est très bizarre. J'utilise un delegate car j'avais testé avec une méthode et ça ne marche pas donc je me suis dis que peut être avec son aide je pourrais faire passer une variable (c), mais en vain.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Bizarre... tu as essayé de mettre un breakpoint et d'exécuter en pas à pas pour voir ce qui se passe ?

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Et ou traite tu ce 'c' ?

    Parce que moi je vois toutes les chances de ramasser tot ou tard un overflow
    sur tmp dans ton event paint

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    this.panel1.Paint += delegate(object sender, PaintEventArgs e)
    {
            for (int i = 0; i < 40; i++)
            {
               for (int j = 0; j < 50; j++)
               {
                  e.Graphics.DrawImageUnscaled(tmp[c], 0 + (j * 10), 0 + (i * 10));
                            c++;
               }
            }
    };
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

Discussions similaires

  1. Passer des arguments par les signaux des event-box
    Par black is beautiful dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 30/10/2008, 08h43
  2. Passer un Type en argument dans Event de UC
    Par LeForestier dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/11/2007, 22h38
  3. Comment passer les arguments à un script perl
    Par belgampaul dans le forum Langage
    Réponses: 4
    Dernier message: 06/08/2005, 12h52
  4. Réponses: 8
    Dernier message: 30/05/2005, 13h55
  5. [Struts] Passer un argument dans un property
    Par Malaussene dans le forum Struts 1
    Réponses: 4
    Dernier message: 07/09/2004, 10h11

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