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 :

TCollection d'élements différents


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Tchaill39
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 110
    Par défaut TCollection d'élements différents
    Bonjour à tous.

    Je suis entrain de réfléchir à une structure de TCollection qui pourrait contenir plusieurs dérivés de TCollectionItems.

    Par exemple Videotheque = Class (TCollection) possèdrait une liste d'Items de TFilm00 = Class (TCollectionItem) et de TDessinAnime00 = Class (TCollectionItem).

    Est-ce possible avec ce type de classe? Comment faire avec la propriété Items qui peut avoir alors 2 types de retour ????????

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2003
    Messages : 115
    Par défaut
    Salut

    A première vue, le TCollection n'est pas prévu pour gérer plusieurs classes différentes pour ses items.
    C'est notamment dû au "Add" (statique) qui utilise la classe définie une fois pour toute à la création de la collection.

    Mais sil existe des possibilités pour gérer des propriétés à classe variable, mais il faut manipuler des éditeurs de propriétés ... c'est encore plus compliqué que de se passer du TCollection et refaire un autre éditeur de collection

    JP

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Par défaut
    Une idée pourrait être de s'arranger pour que TFilm00 et TDessinAnime00 soit les descendants d'une classe ancêtre commune TMedia. Ensuite on encapsule cette classe ancêtre commune dans un descendant de TCollectionItem, disons TMediaItem.

    On aurait donc :
    - TMedia = class
    - TFilm = class(TMedia)
    - TDessinAnime = class(TMedia)

    Ensuite pour la collection proprement dite :
    - Videotheque=Class(TCollection)
    - TMediaItem=Class(TCollectionItem)

    Pour l'instanciation de videotheque :
    - Videotheque.Create(TMediaItem).

    Une méthode pour donner à TMediaItem la classe encapsulée :
    - TMediaItem.AffecterMedia(unMedia : TMedia).
    Et une méthode pour récupérer l'objet TMedia :
    - TMediaItem.Media : TMedia.

    Pour pouvoir faire quelque chose de TMedia, une méthode commune appelable par les classes dérivées comme :
    - TMedia.Play ; virtual ;

    A l'arrivée pour ajouter un film à la vidéothèque
    - Videotheque.Add.AffecterMedia(TFilm.Create) !
    et pour un dessin animé
    - Videotheque.Add.AffecterMedia(TDessinAnime.Create) ;

    Pour jouer quelque chose de la bibliothèque ...
    Videotheque[i].Media.Play

    C'est pas forcément optimal (il faut deux objets par élément de la bibliothèque un TMedia et un TMediaItem) mais cà devrait marcher.

    C'est également extensible, par exemple :
    TImageMedia = class(TMedia) et
    TMP3Media = class(TMedia).
    Tout dépend de la méthode Play de chaque class TMedia dérivée.

  4. #4
    Membre confirmé Avatar de Tchaill39
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 110
    Par défaut
    En fait je ne charche pas vraiment à avoir des propriétés, procedures ou fonctions communes entre es types TFilm00 et TDessinAnime00. Ils sont très différents.

    Ma classe Vidéothèque existe et contient déjà une liste de référence TFilm00. Dans mon code, j'ai plein d'appels de partout à ces films.

    Je dois ajouter les dessins animés. Ce qui m'interresse étant la notion d'ordonnancement des différents objets Film et Dessin animés.....

    Comment puis-je faire alors ??????

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Par défaut
    Pour la propriété items, si Film00 et DessinAnime00 sont tous deux des CollectionItem, on devrait pouvoir faire :
    - if videotheque[i] is TFilm00 then
    else
    if videotheque[i] is TDessinAnime00 then ...

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2003
    Messages : 115
    Par défaut
    sjrd a tout à fait raison !

    ton TVideotheque est-il déjà un TCollection ?
    et surtout, a tu besoin de créer ces éléments à la conception, c'est à dire avoir l'éditeur de propriété du TCollection, ou est-ce juste à l'exécution ?
    ça change complètement les données du problème

  7. #7
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Bon. Ce que tu demandes, c'est pas facile

    D'abord : es-tu certain d'avoir besoin de TCollection ?
    Si c'est dans le cas d'une création de composant, avec une propriété de type collection ; alors oui.
    Si tu as juste besoin d'une liste d'objet, ben utilise TObjectList, qui est faite pour.

    Bon maintenant si tu as vraiment besoin de la collection, je ne vois vraiment pas comment tu pourrais faire Au pire tu pourrais faire que ta classe élément de collection contienne elle-même la vraie référence à l'objet réel (dont la classe peut alors changer). Mais à moins de trafiquer les RTTI de ta classe, tu ne pourras pas en profiter en design-time

    Donc à mon avis réfléchis d'abord bien à si tu as besoin du design-time ou pas
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

Discussions similaires

  1. [XSLT 1.0] Liste des différentes valeurs d'un sous élement dans une liste
    Par _rainbow dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 24/04/2014, 08h46
  2. [XSD] différents élements suivant la valeur de l'élément supérieur
    Par frenchlion dans le forum Valider
    Réponses: 4
    Dernier message: 12/03/2014, 18h50
  3. Récupérer 10 nb différents avec un calcul aléatoire
    Par BXDSPORT dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2002, 02h35
  4. Simulation de transmission de paquet entre différent réseaux
    Par MelloW dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 19h51
  5. Réponses: 2
    Dernier message: 17/05/2002, 20h37

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