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

C# Discussion :

Etat d'une progressBar depuis une classe heritée


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2013
    Messages : 33
    Points : 28
    Points
    28
    Par défaut Etat d'une progressBar depuis une classe heritée
    Bonjour,
    Je cherche à faire évoluer l'état de ma progressbar depuis une classe qui n'est pas la Main mais depuis une classe héritée de Main
    J'ai renseigné using System.Windows.Forms; depuis cette classe héritée

    Voici mon source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void getProgress(int pgr)
            {
                progressBar.Value = pgr;
            }
    pgr correspond a une valeur comprise entre 0 et 100
    Au débogage du programme, la progressbar ne change pas d'état, elle reste vide

    Comment remedier a ce problème ?

    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Salut, juste pour la forme un "get" retourne une valeur. Ici si tu assigne une valeur nomme plutôt ta fonction "set".
    La fonction est dans la classe de ton formulaire principal qui contient la progressbar ?
    La fonction est-elle appelée depuis un autre Thread ? Si ce n'est pas le cas ton interface ne se mettra pas à jour durant le traitement de la fonction mais qu'à la fin quand tu as tes 100%. Est-ce le cas ? As tu la progrssbar à 100% à la fin du traitement ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2013
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par lead8209 Voir le message
    Salut, juste pour la forme un "get" retourne une valeur. Ici si tu assigne une valeur nomme plutôt ta fonction "set".
    La fonction est dans la classe de ton formulaire principal qui contient la progressbar ?
    La fonction est-elle appelée depuis un autre Thread ? Si ce n'est pas le cas ton interface ne se mettra pas à jour durant le traitement de la fonction mais qu'à la fin quand tu as tes 100%. Est-ce le cas ? As tu la progrssbar à 100% à la fin du traitement ?
    La fonction est dans la classe de ton formulaire principal qui contient la progressbar ? -> Non, elle est dans une classe séparée

    La fonction est-elle appelée depuis un autre Thread ? Si ce n'est pas le cas ton interface ne se mettra pas à jour durant le traitement de la fonction mais qu'à la fin quand tu as tes 100%. Est-ce le cas ? As tu la progrssbar à 100% à la fin du traitement ? -> J'utilise un thread, le problème vient peut être de là
    Oui, la progressbar est définie à 100% à la fin du traitement

    Depuis la classe du formulaire principal, je n'ai pas de problème à assigner un etat à la progressbar mais en essayant depuis une autre classe, cela pose problème

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Poste ta classe formulaire qui contient la progressbar et l'autre classe qui l'utilise.
    Si tu utilises un thread secondaire il faut passer par un délégué; ça m'étonne que ton programme ne plante pas si tu ne le fais pas. Un Thread secondaire ne pas pas toucher un élément graphique sans cela. Tu auras un truc du genre InvalidOperationException opération inter-thread blablabla

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2013
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    J'enlève beaucoup de fonctions inutiles dans la classe interface pour comprendre le problème
    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
    public partial class Main : Form
        {
            public Main()
            {
                InitializeComponent();
                txtBoxCle.MaxLength = 8;
            }
     
            private void generer_Click(object sender, EventArgs e)
            {
                try
                {
                    Key key = new Key(8);
                    txtBoxCle.Text = key.generer();
                }
                catch (Exception error)
                {
                    MessageBox.Show(error.ToString());
                }
            }
     
            private void crypter_Click(object sender, EventArgs e)
            {
                try
                {
                    if (txtBoxCle.Text != "")
                    {
                        Key key = new Key(txtBoxCle.Text, 8);
                        if (key.getStringCode() == null || txtBoxCle.TextLength < txtBoxCle.MaxLength)
                        {
                            MessageBox.Show("Clé incorrecte");
                        }
                        else if(key.getCode(key.getStringCode()) == 0)
                        {
                            txtBoxCle.Text = key.generer();
                        }
                        else
                        {
    //C'est dans cette condition que l'actualisation de la progressBar devrait se faire
                            Crypt crypt = new Crypt(key.getCode(key.getStringCode()), rTClair.Text);
                            rTCrypt.Text = crypt.encrypt();
                        }
                    }
                    else
                        MessageBox.Show("Veuillez insérer une clé de cryptage ou cliquez sur Générer");
                }
                catch(Exception error)
                {
                    MessageBox.Show(error.ToString());
                }
            }    
        }

    Classe où je souhaite affecter une valeur à ma progressBar
    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
    class Crypt : Main
        {
            private long key;
            private string clair;
     
            public Crypt()
            {
                this.key = 0;
                this.clair = null;
            }
     
            public Crypt(long Key, string Clair)
            {
                this.key = Key;
                this.clair = Clair;
            }
     
            public string getKey()
            {
                return key.ToString();
            }
     
            public string encrypt()
            {
                string crypt = null;
     
                UTF8Encoding utf8 = new UTF8Encoding();
                string unicodeString = clair.ToString();
                byte[] encodedBytes = utf8.GetBytes(unicodeString);
     
                for (int i = 0; i <= encodedBytes.Length - 1; i++)
                {
                    long division = Convert.ToInt64(key) / (encodedBytes[i] + i);
                    long reste = Convert.ToInt64(key) % (encodedBytes[i] + i);
                    crypt += division.ToString("X") + "_" + reste.ToString("X") + "/";
     
                    getProgress((100 / encodedBytes.Length) * (i + 1));
                }
                getProgress(100);
                return crypt;
            }
     
            private void getProgress(int pgr)
            {
                progressBar.Value = pgr;
            }
        }

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Hmm... ça sert à quoi pour toi l'héritage ?
    Parce que là tu nous fait une classe mère (main) et une classe fille (crypt). Sauf que lors d'un clic sur un bouton de la classe mère tu créés une nouvelle classe fille. Na n'a aucun sens. Si le but était de récupérer la progressbar dans la classe mère dans la classe fille ce n'est pas comme ça qu'il faut s'y prendre. Ta classe fille hérite certes de ta classe mère mais ce sont deux entités distinctes (le new). La progressbar de ta classe fille n'est donc pas celle qui est affichée (classe mère). C'est pourquoi j'ai un sérieux doute quand tu me réponds : Oui, la progressbar est définie à 100% à la fin du traitement ----- elle est définie mais ce n'est pas ce que tu vois sur le formulaire.

    D'une manière générale on ne met pas d'interface dans les classes doivent se suffire à elle même. Pose toi la question : est-ce que je pourrais réutiliser ma classe crypt sans mon interface ? Si oui exit le bout de code qui interfère avec du graphique.

    Je te propose de passer par des événements :
    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
     
    public class Main : Form
    	{ 
    		private void button1_Click_1(object sender, EventArgs e)
    		{
    			Crypt crypt = new Crypt(47895678, "mon mot de passe");
    			crypt.OnCrytInit += crypt_OnCrytInit;
    			crypt.OnCryptProgress += crypt_OnCryptProgress;
    			crypt.OnCrytFin += crypt_OnCrytFin;
     
    			rTCrypt.Text = crypt.encrypt();
    		}
     
    		void crypt_OnCrytFin()
    		{
    			this.progressBar1.Value = progressBar1.Maximum;
    		}
     
    		void crypt_OnCryptProgress(int pValeur)
    		{
    			this.progressBar1.Value = pValeur;
    		}
     
    		void crypt_OnCrytInit(int pMax)
    		{
    			this.progressBar1.Minimum = 0;
    			this.progressBar1.Value = progressBar1.Minimum;
    			this.progressBar1.Maximum = pMax;
    		}
     
    	}
    	public class Crypt //pas d'héritage !!
    	{
    		private long key;
    		private string clair;
     
    		public Crypt()
    		{
    			this.key = 0;
    			this.clair = null;
    		}
     
    		public Crypt(long Key, string Clair)
    		{
    			this.key = Key;
    			this.clair = Clair;
    		}
     
    		public string getKey()
    		{
    			return key.ToString();
    		}
     
    		public string encrypt()
    		{
    			string crypt = null;
     
    			UTF8Encoding utf8 = new UTF8Encoding();
    			string unicodeString = clair.ToString();
    			byte[] encodedBytes = utf8.GetBytes(unicodeString);
     
    			this.vOnCryptInit(encodedBytes.Length - 1);//appel de la fonction qui déclanche l'événement d'initialisation du cryptage
     
    			for (int i = 0; i <= encodedBytes.Length - 1; i++)
    			{
    				long division = Convert.ToInt64(key) / (encodedBytes[i] + i);
    				long reste = Convert.ToInt64(key) % (encodedBytes[i] + i);
    				crypt += division.ToString("X") + "_" + reste.ToString("X") + "/";
     
    				this.vOnCryptProgress(i);//appel de la fonction qui déclanche l'événement de progression du cryptage
    			}
    			this.vOnCryptFin();//appel de la fonction qui déclanche l'événement de progression du cryptage
    			return crypt;
    		}
     
    		/// <summary>
    		/// Initialisation du processus de cryptage
    		/// </summary>
    		public event CryptInit OnCrytInit;
    		public delegate void CryptInit(int pMax);
    		private void vOnCryptInit(int pMax)
    		{
    			if (this.OnCrytInit != null)//test qu'une instance est abonnée à cet événement (sinon il est null et on obtient une exception)
    			{
    				this.OnCrytInit(pMax);
    			}
    		}
     
    		/// <summary>
    		/// Avancement du processus de cryptage
    		/// </summary>
    		public event CryptProgress OnCryptProgress;
    		public delegate void CryptProgress(int pValeur);
    		private void vOnCryptProgress(int pValeur)
    		{
    			if(this.OnCryptProgress != null)//idem
    			{
    				this.OnCryptProgress(pValeur);
    			}
    		}
     
    		/// <summary>
    		/// Finalisation du processus de cryptage
    		/// </summary>
    		public event CryptFin OnCrytFin;
    		public delegate void CryptFin();
    		private void vOnCryptFin()
    		{
    			if (this.OnCrytFin != null)//idem
    			{
    				this.OnCrytFin();
    			}
    		}
    	}
    Après saches que pour un traitement si court il n'est pas optimal d'afficher la progression. Le rafraichissement de la progressbar chaque fois que tu calcules un nouvel octet courte énormément. Il serait plus judicieux de faire une classe statique de cryptage avec une méthode de cryptage / décryptage
    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 static string encrypt(long key, string clair)
    		{
    			StringBuilder crypt = new StringBuilder();
    			byte[] encodedBytes = UTF8Encoding.UTF8.GetBytes(clair);
     
    			for (int i = 0; i <= encodedBytes.Length - 1; i++)
    			{
    				long division = Convert.ToInt64(key) / (encodedBytes[i] + i);
    				long reste = Convert.ToInt64(key) % (encodedBytes[i] + i);
    				crypt.Append(string.Format("{0}_{1}/", division.ToString("X"), reste.ToString("X")));
    			}
    			return crypt.ToString();
    		}
    Voilà, après pour ton amélioration perso il faudrait que tu lises quelques tuto sur l'héritage afin de comprendre ce qu'on y gagne. Les événements ou bien le passage de paramètre (tu aurais pu passer ta progressbar en paramètre dans le constructeur de ta classe Crypt afin qu'elle la connaisse et qu'elle puisse la manipuler; cela dit c'est "sale" c'est pourquoi je n'ai pas posté cette méthode).

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/10/2015, 17h16
  2. Réponses: 13
    Dernier message: 16/01/2015, 10h50
  3. Accès à une méthode d'une form depuis une autre autre form
    Par arngrimur dans le forum Windows Forms
    Réponses: 16
    Dernier message: 13/01/2012, 15h45
  4. [AC-2007] Copier une table depuis une base vers une autre
    Par Triton972 dans le forum VBA Access
    Réponses: 3
    Dernier message: 01/11/2009, 19h27
  5. Réponses: 3
    Dernier message: 16/01/2006, 16h02

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