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

Composants VCL Delphi Discussion :

Manipuler les types énumérés d'un projet dans un composant à la conception


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 15
    Par défaut Manipuler les types énumérés d'un projet dans un composant à la conception
    Bonjour, je souhaiterais savoir s'il est possible de manipuler les types énumérés d'un projet à la conception (design time) sous delphi 6.
    Mon problème en détail :
    J'ai développé un composant TListeDeChoix qui s'apparente à une combobox :
    il contient entre autres propriétés une liste de chaînes (la liste des choix proposés), et un entier "value" qui indique le choix sélectionné.
    Quand j'utilise ce composant dans un projet, je définis un type énuméré associé au TListeDeChoix, afin d'écrire du code dans cet esprit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    type TChoix = (Choix1, Choix2, Choix3);
    [...]
    case TChoix(maListeDeChoix.value) of
       Choix1: [...];
       Choix2: [...];
       Choix3: [...];
    end;
    Cela fonctionne très bien, mais pour des raisons un peu longues à exposer ici, j'aimerais beaucoup pourvoir "indiquer" au composant TListeDeChoix quel est le type énuméré auquel il est associé (pour qu'il récupère les chaînes 'Choix1', 'Choix2' et 'Choix3'.
    Evidemment, ce type énuméré n'est pas un composant, donc je ne peux pas mettre une propriété qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property TypeEnumAssocie : PTypeInfo read FTypeEnumAssocie write FTypeEnumAsscie;
    J'ai pensé à mettre une propriété de type string, ou je "taperais manuellement" le nom du type énuméré, et à récupérer les infos du type avec TypeInfo, mais je ne trouve pas de fonction qui accepterait en paramètre la chaîne 'TChoix' au lieu de l'identifiant TChoix (comme avec getClass...).
    Et de toute façon, si cette fonction existe, je ne suis pas sûr que les infos de type à récupérer avec TypeInfo soient disponibles à la conception...
    Cependant, si j'y arrivait à l'exécution ce serait déjà pas mal !

    Si quelqu'un connait une solution, ou un moyen détourné, je suis preneur !

    Merci.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Par défaut
    J'ai un objet qui utilise à peu près le même principe.
    J'ai défini une propriété sous forme de TStringList.
    Ensuite je fais le test

    Case TStringList.IndexOf(Choix)

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 15
    Par défaut
    Merci pour cette réponse, mais je recherche une solution plutôt du côté des RTTI, car je souhaite manipuler les identificateurs de mes types énumérés, afin de garantir la cohérence entre les identificateurs utilisés dans le code et les chaînes manipulées par le composant (les identificateurs sont utilisés partout dans le code, je ne souhaite pas les remplacer par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stringList.indexOf('Choix1')
    , qui supprimerait toute vérification de type à la compilation).
    Merci encore !

  4. #4
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut

    Je ne suis pas sûr de bien répondre à ta question, mais j'ai cette approche du problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function TListeDeChoix.GetTypeEnumAssocie(AValue: string): TChoix;
    begin
      Result := TChoix(GetEnumValue(TypeInfo(TChoix), AValue));
      case Result of
        Choix1: ShowMessage('Choix1');
        Choix2: ShowMessage('Choix2');
        Choix3: ShowMessage('Choix3');
        else ShowMessage('Type non reconnu !');
      end;
    end;
    @+ Claudius

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 15
    Par défaut
    Bonjour Claudius40,

    Ta réponse est en effet la solution à une partie du problème...
    Merci beaucoup pour ta contribution !

    La plus grosse difficulté est que TListeDeChoix est un composant destiné à être utilisé plusieurs fois. Donc même si c'est bien moi qui l'écris, je ne peux pas mettre le type TChoix "en dur" dans son code.
    Par exemple, je vais avoir une instance de TListeChoix nommée ListeChoixJour et associée au type énuméré TJour = (Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche), et une autre instance nommée ListeChoixMois associée au type TMois...

    Les types TJour et TMois étant définis dans le projet final qui utilise le composant (pas dans le package du composant), je cherche un moyen "d'indiquer" à chaque instance du composant quel est son type associé à la conception du projet final si possible.
    Pour le faire à l'exécution du projet final, je pense à une méthode du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure setTypeEnum(t:PTypeInfo);
    ;
    Cela me permettra au moins de récupérer (pour des besoins internes au composant) les identificateurs du type énuméré, même si ça ne permet pas de retourner une valeur énumérée comme le fait GetTypeEnumAssocie(car pour ça il faudrait en fait, dans le composant, de la généricité appliquée aux types énumérés, on est à ma connaissance au-delà des possiblités du pascal objet).

    Pour conclure, il me manque encore le moyen "d'appeler" setTypeEnum à la conception du projet final, car je ne peux pas créer une propriété publiée de type PTypeInfo et l'affecter simplement avec l'inspecteur d'objets.

    @+

Discussions similaires

  1. les types énuméré
    Par dot-_-net dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 20/01/2008, 14h59
  2. Les types énumérés
    Par Invité dans le forum Langage
    Réponses: 9
    Dernier message: 05/09/2007, 19h35
  3. Questions sur les types énumérés
    Par Premium dans le forum Langage
    Réponses: 5
    Dernier message: 12/11/2006, 18h00
  4. Réponses: 3
    Dernier message: 13/10/2004, 10h43
  5. Réponses: 7
    Dernier message: 02/06/2003, 08h38

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