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 :

XE7: Rtti et énumération


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut XE7: Rtti et énumération
    Bonjour

    Je me demande s'il n'y a pas un petit bug dans tout ça.

    Code OK

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TMonEnum = (enum01);
     
    ....
     
    MonEnum := TMonEnum.enum01;
    ShowMessage(System.Rtti.TRttiEnumerationType<TMonEnum>.GetName(MonEnum));

    Code qui """bugue""" (les " sont volontaires à cause du doute)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TMonEnum = (enum01 = 1);
    
    ....
    
    MonEnum := TMonEnum.enum01;
    ShowMessage(System.Rtti.TRttiEnumerationType<TMonEnum>.GetName(MonEnum));
    Boum ... Violation d'accès

    Il y a sans doute une raison à ça mais je ne vois pas laquelle
    J-L aka Papy pour les amis

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    il y a un bug dans ton code (le <TMonEnum> doit être après GetName, ou même ignoré, mais pas avant le point)...et dans Delphi car le second type n'a pas de RTTI, d'où la violation d'accès (

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     WriteLn(Integer(TypeInfo(TMonEnum)));  // [dcc32 Erreur] Project1.dpr(27): E2134 Le type 'TMonEnum' n'a pas d'information de type
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    en fait c'est un vieux bug http://stackoverflow.com/questions/1...420649#1420649

    voici 2 façons de faire

    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
     
    program Project1;
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    uses
      System.SysUtils,
      System.Rtti;
     
    type
      TEnum1 = (value1);
     
      TEnum2 = (value2 = 1, value3 = 3);
     
    var
      e1: TEnum1;
      e2: TEnum2;
     
    const
      Enum1Names:array[TEnum1] of string = ('value1');
      Enum2Names:array[TEnum2] of string = ('value2', '', 'value3');
     
    type
      TEnum2Name = record
        Value: TEnum2;
        Name : string;
      end;
     
    const
      Enum2NameLookup : array[0..1] of TEnum2Name = (
        (Value: value2; name: 'value2'),
        (Value: value3; name: 'value3')
      );
     
    function GetEnum2Name(Value: TEnum2): string;
    var
      Index: Integer;
    begin
      for Index := Low(Enum2NameLookup) to High(Enum2NameLookUp) do
      begin
        if Enum2NameLookup[Index].Value = Value then
          Exit(Enum2NameLookup[Index].Name);
      end;
      Result := 'TEnum2(' + IntToStr(Ord(Value)) + ')';
    end;
     
    begin
      try
        e1 := value1;
        WriteLn(System.Rtti.TRttiEnumerationType.GetName(e1));
     
        e2 := value2;
        WriteLn(Enum2Names[e2]);
        WriteLn(GetEnum2Name(e2));
     
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
      ReadLn;
    end.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut
    Donc, ça sentait bien un peu le bug.

    C'est une façon de faire intéressante mais un peu peu plus longue qu'en utilisant directement les rtti.
    Je commencerai mes énumérations à 0, ça sera plus simple

    Merci à toi grand chef
    J-L aka Papy pour les amis

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

Discussions similaires

  1. RTTI
    Par J-Marc dans le forum C++
    Réponses: 10
    Dernier message: 06/08/2005, 10h39
  2. Réponses: 11
    Dernier message: 22/06/2005, 11h04
  3. [Java 5] Réflexion sur les énumérations type-safe
    Par rozwel dans le forum Langage
    Réponses: 5
    Dernier message: 04/12/2004, 20h34
  4. [RTTI] TObject.FieldAdress(Name : String) : Pointer
    Par Clorish dans le forum Langage
    Réponses: 3
    Dernier message: 30/09/2004, 14h41
  5. numération en base k en turbo pascal
    Par cocobongo dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 13/12/2003, 20h01

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