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 :

Collection d'objets polymorphes: Comment faire ?


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Par défaut Collection d'objets polymorphes: Comment faire ?
    Bonjour,
    je veux faire un composant de type collection qui permet de faire des stats.
    Au final, je voudrais que lorsqu'un utilisateur ajoute un item, il puisse choisir entre un objet type Gauss, ou un objet type poisson.

    Avant d'aller plus loin, voici mes classes.
    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
    137
    138
    139
    140
    141
    142
    143
    144
    145
    type
      TStat_Gene = class(TComponent)
      private
        FGauss : TLoiGauss;
        FPoisson :  TLoiPoisson;
     
        //acesseur
        function GetBorneMin: statistique.TGestionBorne;
        procedure SetBorneMin(val: statistique.TGestionBorne);
        function GetBorneMax: statistique.TGestionBorne;
        procedure SetBorneMax(val: statistique.TGestionBorne);
        function GetCapaMin: double;
        procedure SetCapaMin(val: double);
        function GetCapaMax: double;
        procedure SetCapaMax(val: double);
        function GetLotMin: double;
        procedure SetLotMin(val: double);
        function GetLotMax: double;
        procedure SetLotMax(val: double);
        function GetSpecMin: double;
        procedure SetSpecMin(val: double);
        function GetSpecMax: double;
        procedure SetSpecMax(val: double);
        function GetCp: double;
        function GetCpl: double;
        function GetCph: double;
        function GetCpk: double;
        function GetMoyenne: Extended;
        function GetSigma: Extended;
        function GetNbMesure: Extended;
        function GetNbMesureConforme: Extended;
        function GetN: Extended;
        procedure SetN(val : Extended);
        function GetP: Extended;
        procedure SetP(val : Extended);
        function GetQ: Extended;
        procedure SetQ(val : Extended);
        function GetM: Extended;
        procedure SetM(val : Extended);
        function GetEsperance: Extended;
        function GetVariance:Extended;
        function GetProbabilite: Extended;
        function GetProbabilitePoisson: Extended;
        function GetTypedeCalcul: statistique.TTypeCalcul;
        procedure SetTypedeCalcul(val: statistique.TTypeCalcul);
        //fin acesseur
        procedure CalculPoissonVarEsp;
     
     
      published
        ///<alias>Borne Minimal</alias>
        property BorneMin: statistique.TGestionBorne Read GetBorneMin Write SetBorneMin default Inclus;
        ///<alias>Borne Maximal</alias>
        property BorneMax: statistique.TGestionBorne Read GetBorneMax Write SetBorneMax default Inclus;
        ///<alias>Capabilité Minimal</alias>
        property CapaMin: double Read GetCapaMin Write SetCapaMin;
        ///<alias>Capabilité Maximal</alias>
        property CapaMax: double Read GetCapaMax Write SetCapaMax;
        ///<alias>Lot Minimal</alias>
        property LotMin: double Read GetLotMin Write SetLotMin;
        ///<alias>Lot Maximal</alias>
        property LotMax: double Read GetLotMax Write SetLotMax;
        ///<alias>Spec Minimal</alias>
        property SpecMin: double Read GetSpecMin Write SetSpecMin;
        ///<alias>Spec Maximal</alias>
        property SpecMax: double Read GetSpecMax Write SetSpecMax;
        ///<alias>Cp</alias>
        property Cp : Double Read GetCp;
        ///<alias>Cpl</alias>
        property Cpl : Double Read GetCpl;
        ///<alias>Cph</alias>
        property Cph : Double Read GetCph;
        ///<alias>Cpk</alias>
        property Cpk : Double Read GetCpk;
        ///<alias>Moyenne</alias>
        property Moyenne : Extended Read GetMoyenne;
        ///<alias>Sigma</alias>
        property Sigma : Extended Read GetSigma;
        ///<alias>NbMesure</alias>
        property NombreMessure : Extended Read GetNbMesure;
        ///<alias>NbMesureConforme</alias>
        property NombreMessureConforme : Extended Read GetNbMesureConforme;
        ///<alias>N</alias>
        property N : Extended Read GetN Write SetN;
        ///<alias>P</alias>
        property P : Extended Read GetP Write SetP;
        ///<alias>Q</alias>
        property Q : Extended Read GetQ Write SetQ;
        ///<alias>M</alias>
        property M : Extended Read GetM Write SetM;
        ///<alias>Esperance</alias>
        property Esperance : Extended Read GetEsperance;
        ///<alias>Variance</alias>
        property Variance : Extended Read GetVariance;
        ///<alias>Probabilité</alias>
        property Probabilite : Extended Read GetProbabilite;
        ///<alias>Probabilité Poisson</alias>
        property ProbabilitePoisson : Extended Read GetProbabilitePoisson;
        ///<alias>Type de Calcul</alias>
        property TypedeCalcul: statistique.TTypeCalcul
          Read GetTypedeCalcul Write SetTypedeCalcul default Spec;    
      public
        constructor Create(Aowner : TComponent);override;
        procedure InsertionMesure(mesure : double);
        procedure Proba(val : extended);
        procedure RemiseAZéroComposant;
        procedure RemiseAZéroResultat;
      end;
     
      TCmpStatItem = class(TCollectionItem)
      private
        FName : String;
        FStat : TStat_Gene;
        procedure SetName(const Value:String);
     
      protected
        Function GetDisplayName: String; Override;
      published
        property Name : string read FName write SetName;
        property Stat : TStat_Gene read FStat;
      end;
     
      TCmpStats = class;
     
      TspStat = Class(TComponent)
        private
          FItems: TCmpStats;
          procedure SetItems(value : TCmpStats);
        public
          constructor Create(AOwner : TComponent); override;
          destructor Destroy; override;
        published
          property Item: TCmpStats read FItems write SetItems;
      End;
     
      TCmpStats = class( TOwnedCollection)
        private
          FComponent : TspStat;
          function GetItem(Index: Integer): TCmpStatItem;
          procedure SetItem(index: Integer; Value : TCmpStatItem);
        public
          constructor Create(Stat : TspStat);
          function Add : TCmpStatItem;
          property Items[Index : Integer]: TCmpStatItem read GetItem write SetItem; default;
      end;
    Voici les problèmes que je rencontre :
    * Je voudrais faire apparaitre les property de FStat dans l'inspecteur d'objet.
    Je me retrouve avec simplement Stat et un champs vide en face.
    Comment faire ?

    * Comment faire un Write de la Stat ?

    J'espere avoir été clair.
    Merci

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    La propriété Stat est "vide" (en fait à NIL) car l'EDI s'attend à ce que tu rattache ce champ à un objet TStat_Gene qui serait théoriquement déposé sur la fiche.

    Si tu veux avoir un objet déjà présent dès la conception alors il faut créé un objet TStat_Gene et renseigner la propriété FStat avec, tout ceci au niveau du constructeur de TCmpStatItem.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Par défaut
    Bonjour,
    merci de ta réponse.

    Voici le constructeur que je viens de rajouter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    constructor TCmpStatItem.create;
    begin
      FStat := TStat_Gene.Create(nil);
      FStat.RemiseAZéroComposant;
    end;
    Malheureusement, ça ne change rien.
    J'ai poser des points d'arrêts dans la fonction. Mais quand je compile, ils deviennent verts, comme si je les avais mis devant un commentaire.

    Du coup j'arrive pas a débugé et a voir ce qui ce passe.

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Si je ne m'abuse là tu viens de créer un autre constructeur au lieu de le surcharger. Essayes comme ça, ça ira mieux

    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
    implementation
     
    TCmpStatItem = class(TCollectionItem)
    [...]
    public
      Constructor Create( Collection:TCollection ); override;
    end;
     
    interface
     
    Constructor TCmpStatItem.Create( Collection:TCollection );
    begin
      inherited;
      FStat := TStat_Gene.Create(nil);
      FStat.RemiseAZéroComposant;
    end;
    Première remarque plutôt que de passer NIl tu ferais mieux de passer le Owner de l'objet collection qui possède l'item (avec un peu de cast) afin que l'objet ne soit pas "perdu".

    Seconde remarque les caractères accentués pour les identificateurs (noms de classes, variables, fonctions, méthodes, etc...) il vaut mieux éviter

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Par défaut
    Oui, j'ai volontairement créer un constructeur... j'avais mal penser la chose.
    Mea culpa.

    Au rayon des bonnes nouvelles, mes points d'arrêts fonctionne.
    Mauvaise nouvelle, l'inspecteur d'objet n'as pas changer.
    Est ce qu'il faut que je fasse un screenshoot de mon inspecteur d'objet ou je suis suffisament clair ??

    Je regarde comment fonctionne les cast sous delphi.
    Et je change les "é" dans mes fonctions.
    Merci, je te tiens au courants des avancers.

    Par contre, j'ai regarder comment était fait un TChart, et j'ai été très surpris de voir que le composant n'est composé que de property, avec des sortes de if et else entre certaine.
    Est ce que quelqu'un sais comment ça marche ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Par défaut
    Je vient de faire le cast et ça marche
    Je comprend mieux pourquoi tu disait que mon objet était perdu.
    Merci

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sapin Voir le message
    Par contre, j'ai regarder comment était fait un TChart, et j'ai été très surpris de voir que le composant n'est composé que de property, avec des sortes de if et else entre certaine.
    Est ce que quelqu'un sais comment ça marche ?
    Je te rassures un truc aussi compliqué que le TChart ne fonctionne pas qu'en déclarant quelques propriétés et en cliquant des doigts

    En outre les IF que tu vois sont ce qu'on appelle des conditions de compilations, je te conseilles de faire un F1 là dessus pour mieux comprendre.

    Si tu regardes l'implémentation d'un TChart tu verras qu'il hérite d'une autre classe (certainement un TCustomChart avec D7 j'ai pas les sources de ce composant), je te le donne en mille c'est lui qui fait tout

    En général les composants fonctionnent tous sur le principe d'avoir un TCustomXXX qui fournit la vraie implémentation ainsi que les diverses propriétés mais déclarées protected et le composant final TXXX qui hérite de TCustomXXX et qui ne fait que publier les propriétés protégées du composant.
    Pourquoi faire ça et bien pour permettre aux développeur de pouvoir créer de nouveaux composants plus facilement dans le sens où c'est le composant final qui décide quelles sont les propriétés publiques ou publiées d'un composant plutôt d'avoir des propriétés visibles de l'extérieur mais qui ne servent à rien voire peuvent être dangereuses si l'utilisateur tente de modifier ses valeurs.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 16/08/2013, 21h03
  2. [Objet immuable] Comment faire ?
    Par smori dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 18/03/2013, 17h32
  3. Comment faire de la defensive copie avec un objet de type Collection
    Par l_informaticien dans le forum Collection et Stream
    Réponses: 12
    Dernier message: 20/01/2013, 21h56
  4. Réponses: 3
    Dernier message: 19/07/2007, 10h39
  5. comment faire pour imprimer à l'écran un objet
    Par GConstant dans le forum Général Python
    Réponses: 10
    Dernier message: 11/08/2004, 11h31

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