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

Langage Delphi Discussion :

Comment implémenter une classe gérant une liste de sous classe ayant une classe de base commune


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Comment implémenter une classe gérant une liste de sous classe ayant une classe de base commune
    Bonjour,

    Excusez moi si je pose une question qui a déjà été résolue ou si je m'exprime mal : j ai beaucoup chercher mais comme j apprend de manière autodidacte : je n arrive pas a trouver de solution au problème suivant :

    je souhaite faire une classe qui gère des items dérivés d'une classe de base commune, mais ayant chacune des propriétés et méthodes, biensur communes, mais d'autre spécifique à la classe enfant.

    en gros : j'ai un synthé de musique que je désire piloter par PC via MIDI (= réception/envoi de message sous forme de byte)
    pour communiquer avec ce synthé il faut gérer les messages de type différent, soit : Message de Note, Message SYX, Message Sequencer, etc...

    Mais bon, le synthés possède beaucoup de paramètres (que j'appelle controleur midi), donc je voudrai avoir une classe de type collection, qui me permette d'avoir une liste de contrôleurs midi que je souhaite gérer (donc Add, remove, msgmid, nom, valeur, etc..).
    la ou je bloque, c'est que je voudrai que la collection gère des items de type différent mais ayant une classe de base commune !

    Soit du genre:
    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
    Tparam = class(TObject)
      // paramètre et méthode et propriétés communs pour tous les enfants
      Nom : string;
     
      function MsgMidi : string; virtual; abstract;
     
    end;
     
    Tparam_Note = class(TParam)
      //  paramètre et méthode et propriétés spécifique à l'enfant
      NoNote : byte;
      VelociteNote : byte;
      Channel : byte;
     
      function MsgMidi : string; override;
     
    end;
     
    Tparam_Cc = class(TParam)
      //  paramètre et méthode et propriétés spécifique à l'enfant
      NoCc : byte;
      Channel : byte;
     
      function MsgMidi : string; override;
     
    end;
    je me suis penchés sur les pistes suivantes :
    - polymorphisme
    - classes abstraites
    - collection
    - ObjectList

    je dois être nul c'est sur ! mais je n'arrive pas à trouver d'exemples ou de tuto qui explique mon cas !! (j'ai essayer plusieurs sauces mais ça ne fonctionne pas : du genre quand l'item est un param note je veux n avoir accès qu a NoNote, veloNote, etc... mais pas à NoCc qui fait parti des param Cc ! et inversement !)

    si c'est faisable, au pire si quelqu'un peut m'aiguiller pour trouver la solution, au mieux que l'on m explique concrètement !

    vous remerciant à l'avance de toute aide !

    (j'utilise : DELPHI 7 / Win7 64 Bits)

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    la je regarde du cote des interfaces !

  3. #3
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour.

    Voici un code simplifié avec une classe de base et deux classes dérivées.
    La classe de base ne doit contenir que ce qui est commun aux classes dérivées.

    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
    TBasic = class(TObject)
      private
        FNom: string;
      protected
         procedure Execute; virtual; abstract;
      public
         property Nom: string read FNom write FNom;
      end;
     
      TNote = class(TBasic)
      private
        FVelocity: integer;
      public
         property Velocity: integer read FVelocity write FVelocity;
         procedure Execute; override;
      end;
     
      TEvent = class(TBasic)
      private
        FNoCc: byte;
      public
         property NoCc: byte read FNoCc write FNoCc;
         procedure Execute; override;
      end;
    Implementation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TEvent.Execute;
    begin
      ShowMessage('TEvent');
    end;
     
    procedure TNote.Execute;
    begin
      showmessage('TNote');
    end;
    Utilisation d'un composant TList pour stocker tous les objets créés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Note:= TNote.Create;
      Note.Nom:= 'note';
      Note.Velocity:= 127;
      List.Add(note);
      Event:= TEvent.Create;
      Event.Nom:= 'event' ;
      Event.NoCc:= 20;
      List.Add(Event);
    Pour lancer la procédure Execute, il suffit de transtyper l'objet de TList en utilisant la classe de base

    TBasic(List[0]).Execute; --> message "TNote"
    TBasic(List[1]).Execute; --> message "TEvent"

    Pour modifier un objet de la liste, par exemple à l'index 1 :

    if TBasic(List[1]) is TEvent then
    with TEvent(List[1]) do NoCc:=40;

    Thierry

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci Beaucoup !

    je croyais que c'était plus lourd que ça à implémenter !

    Vraiment merci ! pourtant j'ai cherché longtemps !

    en général je trouve toutes mes réponses sur cette bible qu'est ce site ! mais là j'ai du mal cherché !

    Yes trop content !!!

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 09/04/2015, 15h55
  2. [DOM] Récupérer la liste des sous arbres d'une balise
    Par domiq44 dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 03/02/2010, 16h46
  3. Réponses: 2
    Dernier message: 23/09/2009, 21h24
  4. Réponses: 6
    Dernier message: 23/06/2009, 17h00
  5. Réponses: 8
    Dernier message: 24/04/2008, 01h00

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