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 :

Problème liè à l'ordre alphabétique des proriétés d'une classe


Sujet :

Windows Forms

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Problème liè à l'ordre alphabétique des proriétés d'une classe
    Bonjour,

    J'ai créé une classe "Voiture" avec 2 propriétés "Demarree" et "Essence".
    Je souhaite empêcher de démarrer la voiture s'il n'y a pas d'essence, et afficher un message d'avertissement.

    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
    public class Voiture : UserControl
    {
     
      /// <summary>
      /// Litres d'essence dans le réservoir
      /// </summary>
      public int Essence
      {
        get { return _Essence; }
        set { _Essence = value; }
      }
      private int _Essence = 0;
     
      /// <summary>
      /// True si la voiture est démarrée
      /// </summary>
      public bool Demarree
      {
        get { return _Demarree; }
        set 
        {
          if (value && _Essence <= 0)
            MessageBox.Show("Mettre d'abord de l'essence.");
          else
            _Demarree = value; 
        }
      }
      private bool _Demarree = false;
     
    }
    Après avoir posé mon nouveau contrôle sur une fiche, je rentre 10 dans la propriété "Essence" et bascule à true la propriété "Demarree". Tout va bien.
    Mais lorsque j'exécute ce programme, le message d'avertissement s'affiche.
    Tout ça parce que VisualStudio enregistre les propriétés des contrôles dans l'ordre alphabètique.
    Si l'on observe le code généré automatiquement dans "Form1.Designer.cs" on se rend compte que la valeur de la propriété "Demarree" est affectée avant celle de "Essence" qui vaut à ce moment là 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // 
    // voiture1
    // 
    this.voiture1.Demarree = true;
    this.voiture1.Essence = 50;
    this.voiture1.Location = new System.Drawing.Point(37, 405);
    this.voiture1.Name = "voiture1";
    this.voiture1.Size = new System.Drawing.Size(150, 150);
    this.voiture1.TabIndex = 6;
    Le problème ne se poserait plus si je renommais ma propriété en "ZDemarree" par exemple, ou si je pré-initialisais "Essence" avec une valeur positive.
    Mais sur en exemple complexe avec des références d'objets à la place d'entiers et beaucoup de propriété cela devient un vrai casse-tête.

    Quelqu'un aurait-il une technique pour modifier l'ordre d'affectation des propriétés par VisualStudio ?

    D'avance merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Salut,

    le mieux est de ne pas se baser sur le designer de visual studio. Il faut mieux faire une initialisation propre des tes contrôles et tes objets dans le load de ta forme. C'est plus propre.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réponse.

    En fait il s'agit d'un contrôle autonome (plus complexe évidemment ) que je fourni à des équipes de développeurs qui vont l'utiliser dans le cadre de leurs développements.
    Je n'ai donc pas la possibilité d'initialiser ni de tester quoi que ce soit en dehors de ce contrôle.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    pourquoi ne pas le faire dans le constructeur de ton contrôle ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Parce que dans le constructeur je ne peux pas savoir à l'avance ce que l'utilisateur choisira comme valeur des différentes propriétés.
    Ou alors je n'ai pas compris ce que tu propose.
    En fait ce problème se pose uniquement dans le cas d'interférence entre plusieurs propriétés d'un même contrôle.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Autant pour moi, j'ai peut être fait fausse route.
    Je ne comprends pas ta propriété Demarree. Pour moi, elle n'a aucun sens d'un point de vue objet. Les propriétés servent à représenter l'état d'un objet. Dans ton exemple, tu utilises cette propriété comme un comportement. Il vaudrait mieux disposer d'une méthode "Démarre" sur ta voiture.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    C'est le cahier des charges qui l'impose: du zéro code pour ce contrôle.
    (Pour faire simple, il s'agit d'un visualisateur sécurisé de caméra IP pour contrôle d'accès.
    Une fois définies dans VisualStudio, les propriétés ne doivent en aucun cas être modifiables à l'exécution, ni par les développeurs, ni robot, ni virus, etc...)


    Merci pour ta collaboration.

  8. #8
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Salut,

    en fait, le composant Combobox a un problème similaire. Les propriétés AutoCompleteMode et AutoCompleteSource fonctionnent ensemble, et il existe des combinaisons de valeur invalides.

    Ce que tu peux faier, c'est utiliser la propriété DesignMode de la form, qui est à true uniquement en mode design. Si DesignMode == true, alors tu interdis de mettre "Démarrée" à true s'il n'y a pas d'essence.
    ca veut dire que ton objet sera dans un état invalide pendant un temps très court : entre les lignes bidule.Demarree = true et bidule.Essence = 10.

    Et si tu veux faire d'autres vérification au runtime, place les dans un bloc if (!DesignMode).
    ಠ_ಠ

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci pour ton aide.

    Dans le cas simple que j'ai pris comme exemple cela fonctionne effectivement.
    Car je peux très bien accepter "Demarrer" = true même si "Essence" = 0.

    Mais comme je le dis dans mon post précédent, il s'agit en fait de démarrer une caméra et l'essence est en réalité le choix d'une source d'acquisition et donc je ne peux pas démarrer la caméra sans connaitre sa source.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    ragardes aussi tu coté de ISupportInitialize...

Discussions similaires

  1. Trier par ordre alphabétique des onglets d'une certaine couleur
    Par shimuno dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/10/2011, 17h54
  2. Classer une bibliographie par ordre alphabétique des noms
    Par GDMINFO dans le forum Bibliographies - Index - Glossaires
    Réponses: 3
    Dernier message: 16/11/2010, 16h59
  3. problème tri par ordre alphabétique
    Par bibi 8002 dans le forum Word
    Réponses: 17
    Dernier message: 18/06/2008, 15h21
  4. Ordre alphabétique des tables ?
    Par Marco24 dans le forum Toad
    Réponses: 5
    Dernier message: 08/04/2008, 21h29
  5. Inhiber l'ordre alphabétique des attributs sous Xerces
    Par philippe rousseau dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 04/12/2003, 17h19

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