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

Delphi Discussion :

[DESIGN PATTERN] / [Patron / Modèle de Conception] [ENUMERATEUR]


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 9
    Points
    9
    Par défaut [DESIGN PATTERN] / [Patron / Modèle de Conception] [ENUMERATEUR]
    [DESIGN PATTERN] / [Patron / Modèle de Conception] [ENUMERATEUR].

    Bonjour à tous.

    Je suis en train d'apprendre à utiliser les modèles de conceptions.
    Jusqu'à présent je pense avoir à peu près cerné diffèrents types de modèles.

    merci à http://castelain.developpez.com/sources/Bouboules/
    c'est un très bon exemple du modèle OBSERVATEUR.

    J'essaye d'implanter un énumerateur dans une liste composée.


    Ma boucle avec énumerateur énumère bien l'ensemble des éléments de la liste composée.
    Mais les objets dessinés (énumérés) sont tous de type glyphe "PUR" (la classe abstraite).
    Je perd donc l'avantage de la liste composée me permettant de stocker différents types d'objets.
    Le code n'utilise pas la procédure en fonction du type de l'objet....

    Un énumerateur ne peut-il énumérer qu'un seul et même type d'objet?
    Ai-je mal compris ou codé? (fort probable ... )
    L'affectation dans la procédure GETCURRENT fige-t-elle le type d'objet ?
    Est-ce une limitation du modèle ENUMERATEUR?
    Pourquoi cette limitation à un type figé d'objet?

    Où trouver un lien vers plus d'informations, ou un exemple, concernant ce modèle?

    Pour info voici une architecture de mes objets glyphes
    c_glyphe
    / \
    c_Glyphe_Feuille c_Glyphe_composite
    | |
    c_glyphe_codebarre c_liste_vecteurs
    c_glyphe_vecteur c_liste_points
    c_glyphe_point



    Code déclaration ENUMERATEUR
    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
     
      c_EnumerateurGlypheComposite  =  class
          private
            _Index            :  Integer;
            _GlypheComposite  :  c_GlypheComposite;
     
            function GetCurrent: c_Glyphe;
     
          Protected
          Public
            constructor Create(UnGlypheComposite  :  c_GlypheComposite);
     
            function PointeSuivant    (inc  :  Integer  =  1)  :  Boolean;
     
            function PointePrecedent  (dec  :  Integer  =  1)  :  Boolean;
     
    //        function PointePremier  :  Boolean;
    //        function PointeDernier  :  Boolean;
     
          Published
     
            property Courant: c_Glyphe read GetCurrent;
     
        end;


    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
     
    { c_EnumerateurGlypheComposite }
     
      constructor c_EnumerateurGlypheComposite.Create(UnGlypheComposite: c_GlypheComposite);
        begin
          _Index  :=  -1;
          _GlypheCOmposite  :=  UnGlyphecomposite;
        end;
     
      function c_EnumerateurGlypheComposite.PointeSuivant(inc: Integer  =  1): Boolean;
        begin
            result := ((_Index + inc )< (_GlypheComposite.Count-1));
     
            If result
              then _Index  :=  _Index  +  inc;
        end;
     
      function c_EnumerateurGlypheComposite.PointePrecedent(dec: Integer  =  1): Boolean;
        begin
            result  :=  ((_Index  -  dec)  > 0);
            If Result then _Index  :=  _Index  -  dec;
        end;
     
      function c_EnumerateurGlypheComposite.GetCurrent  :  c_Glyphe;
        begin
          result := _GlypheComposite.Get(_Index);    // cette affectation fige-t-elle le type de mon objet? (Transtypage??)
        end;
    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
     
      procedure c_GlypheComposite.dessine(p_zone_dessin: c_zone_graphique);
        var
          l_i,l_max    :  Integer;
    //      g  :  c_EnumerateurGlyphecomposite;
        begin
          inherited;
    //      g  :=  enumerateur;  // création de mon enumerateur...
          l_max    :=  COUNT-1;
     
    //      while g.PointeSuivant() do g.Courant.dessine(p_zone_dessin);  // Pourquoi les deux boucles ne réagissent pas de la même manière? 
     
    // Pourquoi l'énumerateur ne me permet-il pas de pointer sur la procédure fonction du type d'objet???
     
          for l_i := 0 to l_max do Items[l_i].dessine(p_zone_dessin);
     
        end;  //c_GlypheComposite.dessine(p_zone_dessin: c_zone_graphique);
    Voilà j'espère ne pas être incompréhensible ou hors-sujet.
    merci par avance pour tous vos renseignements...

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 190
    Points : 218
    Points
    218
    Par défaut
    bonjour

    je ne pense pas que cela vienne de l'énumération

    Verifie plutôt les attributs des méthodes

    la methode de la classe parent doit avoir l'attribut virtual
    la methode de la classe fille doit avoir l'attribut override

    @+

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 9
    Points
    9
    Par défaut [DESIGN PATTERN] / [Patron / Modèle de Conception] [ENUMERATEUR]
    Merci à WolffN d'avoir accepter de me répondre.

    Je n'ai pas lâché l'affaire et j'ai pris une bonne nuit de sommeil , et surtout beaucoup de recul pour relire mon code...

    Le problème était bien mon mauvais codage... honte sur moi ...

    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
     
    //Ancienne version de fonction GetCourant
     
    function c_EnumerateurGlypheComposite.GetCurrent  :  c_Glyphe;
      begin
        result := _GlypheComposite.Get(_Index);    // cette affectation fige-t-elle le type de mon objet? (Transtypage??)
      end;
     
    //Nouvelle version de fonction GetCourant
     
    function c_EnumerateurGlypheComposite.GetCurrent  :  c_Glyphe;
      var
        l_glyphe    :    c_glyphe;
     
      begin
        l_glyphe := _GlypheComposite.Items[CURSEUR];
        result   :=  l_glyphe;                // c'est désormais une adresse.. et non plus une structure figée....
      end;

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/07/2014, 21h32
  2. Réponses: 0
    Dernier message: 15/07/2014, 21h31
  3. Réponses: 0
    Dernier message: 15/07/2014, 21h31
  4. Réponses: 0
    Dernier message: 01/10/2010, 09h55

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