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 :

TypeInfo dans un record


Sujet :

Langage Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 383
    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 383
    Points : 2 996
    Points
    2 996
    Par défaut TypeInfo dans un record
    Bonjour à tou(te)s

    Dans un record j'ai ajouté une fonction qui utilise les rtti pour en lister les valeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ARecord := AContext.GetType(TypeInfo(TMonRecord)).AsRecord;
    Le type du record utilisé dans TypeInfo est la seule chose "personnalisée" dans le code de la fonction.
    J'aimerais bien réutiliser le même code ailleurs sans être obligé de le réécrire mais je bute sur la récupération du type véritable du record.
    Il faudrait que je puisse faire un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ARecord := AContext.GetType(TypeInfo(Self.ClassType)).AsRecord;
    mais ça ne passe pas.

    Il y a forcément une façon de faire ça mais pour le moment ça m'échappe.

    ça vous parle ??

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Bonjour

    pourquoi ne pas essayer avec l'opérateur de transtypage as, quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ARecord := AContext.GetType(TypeInfo(Self.ClassType as AsRecord);
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 383
    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 383
    Points : 2 996
    Points
    2 996
    Par défaut
    sur le record, ClassType n'existe pas :-(

  4. #4
    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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    sur le record, ClassType n'existe pas :-(
    normal

    cela me fait penser à mon unité JSON

    au départ je faisais s := toSJON(@r, TypeInfo(TMonRecord))ensuite avec les generic j'ai pu écrire s := JSON<TMonRecord>(r)mais en fait, Delphi est capable de renseigner le type tout seul, je peux donc tout simplement écrire s := JSON(r).

    au lieu de ton ARecord := AContext.GetType(TypeInfo(TMonRecord)).AsRecord; devrait pouvoir s'écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TContext.GetType<T>(var V: T);
    var
      Info: PTypeInfo;
    begin
      Info := TypeInfo(T);
      ...
    end;
     
    begin
      AContext.GetType(ARecord);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 383
    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 383
    Points : 2 996
    Points
    2 996
    Par défaut
    Comme le TContext n'existe pas dans Delphi, je comprends que je dois me baser sur ton code json.
    J'étudierai ça ce w-e, merci.

  6. #6
    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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Comme le TContext n'existe pas dans Delphi, je comprends que je dois me baser sur ton code json.
    J'étudierai ça ce w-e, merci.
    euh... en fait je ne sais pas ce qu'est le AContext de ton code
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 383
    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 383
    Points : 2 996
    Points
    2 996
    Par défaut
    arf .... Désolé.

    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
    
    type
      TValues = record
        ..
      end;
    
    const
      FlotFmt = '%.3f';
    var
      S: TStringBuilder;
      AContext  : TRttiContext;
      AField    : TRttiField;
      ARecord   : TRttiRecordType;
      AFldName  : String;
      AValue    : TValue;
      vs: Single;
      vi: Integer;
      vb: Boolean;
    begin
      S := TStringBuilder.Create;
    
      AContext := TRttiContext.Create;
      try
        ARecord := AContext.GetType(TypeInfo(TValues)).AsRecord;
        for AField in ARecord.GetFields do
          begin
            AFldName := AField.Name;
            AValue   := AField.GetValue(@Self);
    
            if AValue.IsType(TypeInfo(Integer)) then
            begin
              vi := AValue.AsInteger;
              S.AppendLine(AFldName + ' = ' + vi.ToString + ';');
            end
    
            else if AValue.IsType(TypeInfo(Single)) then
            begin
              vs := AValue.AsExtended;
              if DisplayNaN or not vs.IsNan then
                S.AppendLine(AFldName + ' = ' + Format(FlotFmt, [vs]) + ';');
            end
    
            else if AValue.IsType(TypeInfo(Boolean)) then
            begin
              vb := AValue.AsBoolean;
              S.AppendLine(AFldName + ' = ' + vb.ToString(TUseBoolStrs.True) + ';');
            end;
    
          end;
      finally
        AContext.Free;
      end;

  8. #8
    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 430
    Points
    28 430
    Par défaut
    ce qui devrait donner (pas testé)

    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
     
    type
      TValues = record
        ..
      end;
     
    procedure RecordTypeToString(R: Pointer; T: PTypeInfo; S: TStringBuilder);
    const
      FlotFmt = '%.3f';
    var
      AContext  : TRttiContext;
      AField    : TRttiField;
      ARecord   : TRttiRecordType;
      AFldName  : String;
      AValue    : TValue;
      vs: Single;
      vi: Integer;
      vb: Boolean;
    begin
      AContext := TRttiContext.Create;
      try
        ARecord := AContext.GetType(TypeInfo(T)).AsRecord;
        for AField in ARecord.GetFields do
          begin
            AFldName := AField.Name;
            AValue   := AField.GetValue(R);
     
            if AValue.IsType(TypeInfo(Integer)) then
            begin
              vi := AValue.AsInteger;
              S.AppendLine(AFldName + ' = ' + vi.ToString + ';');
            end
     
            else if AValue.IsType(TypeInfo(Single)) then
            begin
              vs := AValue.AsExtended;
              if DisplayNaN or not vs.IsNan then
                S.AppendLine(AFldName + ' = ' + Format(FlotFmt, [vs]) + ';');
            end
     
            else if AValue.IsType(TypeInfo(Boolean)) then
            begin
              vb := AValue.AsBoolean;
              S.AppendLine(AFldName + ' = ' + vb.ToString(TUseBoolStrs.True) + ';');
            end;
     
          end;
      finally
        AContext.Free;
      end;
    end;
     
    procedure RecordTypeToString<T>(const R: T; S: TStringBuilder); inline;
    begin
      RecordToString(@R, TypeInfo(T), S);
    end;
     
    var
      S: TStringBuilder;
      V: TValue;
    begin
      S := TStringBuilder.Create;
      RecordToString(V, S);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 383
    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 383
    Points : 2 996
    Points
    2 996
    Par défaut
    Whaouh ! Je n'aurais pas pensé à cette façon de faire.

    Chapeau et un grand merci !

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

Discussions similaires

  1. Tableaux dynamiques dans un record
    Par Eric Beaumard dans le forum Delphi
    Réponses: 8
    Dernier message: 10/12/2006, 20h51
  2. Réponses: 7
    Dernier message: 24/11/2006, 09h56
  3. Réponses: 9
    Dernier message: 27/03/2006, 11h40
  4. Type TFont dans un record
    Par dacid dans le forum Langage
    Réponses: 4
    Dernier message: 12/12/2005, 12h24
  5. [D7] Tableaux dynamiques dans un record
    Par bobby-b dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2004, 23h23

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