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

Lazarus Pascal Discussion :

RTTI sur record [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2009
    Messages : 34
    Points : 59
    Points
    59
    Par défaut RTTI sur record
    Bonjour,
    Je souhaite savoir s'il est possible de connaitre les propriétés d'un record à l'exécution de l'application. Les commandes fonctionnent bien pour une classe mais je n'ai pas trouvé comment faire pour un enregistrement. Voici mon code :

    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
    procedure TMainForm.btRecordTHashListClick(Sender: TObject);
    var
      pTData	: PTypeData;
      pTInfo	: PTypeInfo;
      TablePtr	: PatableRecord;
      Loop		: Integer;
    begin
      // Combinaison  Pointeur d'enregistrmenet(Record) + Liste de pointeurs (TFPHashList)
     
      // Creation de liste
      if  not Assigned(FTableRecList) then FTableRecList := TFPHashList.Create;
     
      // Insertion de données
      new(TablePtr);
      TablePtr^.description := 'Dictionnaire des tables.';
      FTableRecList.add('atable', TablePtr );
     
      new(TablePtr);
      TablePtr^.description := 'Dictionnaire des fonctions.';
      FTableRecList.add('afunction', TablePtr );
     
      new(TablePtr);
      TablePtr^.description := 'Dictionnaire des listes d''option.';
      FTableRecList.add('alist', TablePtr );
     
      // Lecture des données
      for Loop:=0 to FTableRecList.Count-1 do
      begin
        TablePtr := FTableRecList[Loop];
        ShowMessage('Parcours Index : ' + TablePtr^.description);
      end;
     
      // Recherchde des données
      try
        TablePtr := FTableRecList.Find('ddafunction');
        ShowMessage('Recherche réussie : ' + TablePtr^.description);
      except
        ShowMessage('Clé introuvable.');
      end;
      try
        TablePtr := FTableRecList.Find('afunction');
        ShowMessage('Recherche réussie : ' + TablePtr^.description);
      except
        ShowMessage('Clé introuvable.');
      end;
     
      // Liberation des données : A integrer dans wrapper TFPHashList
      for Loop:=0 to FTableRecList.Count-1 do Dispose(PatableRecord(FTableRecList[Loop]));
     
      // RTTI
      pTInfo := TypeInfo(TatableRecord);
      pTData := GetTypeData(pTInfo);
     
      ShowMessage('Nombre de propriétés = '+IntToStr(pTData^.PropCount));
     
    end;
    Voici la déclaration du type
    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
      PatableRecord  = ^TatableRecord;
      {$M+}
      TatableRecord = object
      private
        Fatbnum      : ShortString;         // Code de la table
        Ftabledb     : ShortString;          // Dénomination de la table
        Fatbnam      : ShortString;          // Libéllé
        Fdescription : String;              // Description de la table
        Fversion     : Integer;             // Version lock
        Fflgsystem   : Boolean;             // Flag table systeme
        Fcredate     : TDate;               // Date création
        Fcreuser     : ShortString;           // Opérateur création
        Fupddate     : TDate;               // Date modification
        Fupduser     : ShortString;           // Opérateur modification
        Frowid       : Integer;             // ID Ligne
      published
        property atbnum      : ShortString		read Fatbnum       write Fatbnum;
        property tabledb     : ShortString		read Ftabledb      write Ftabledb;
        property atbnam      : ShortString		read Fatbnam       write Fatbnam;
        property description : String			read Fdescription  write Fdescription;
        property version     : Integer			read Fversion      write Fversion;
        property flgsystem   : Boolean			read Fflgsystem    write Fflgsystem;
        property credate     : TDate			read Fcredate      write Fcredate;
        property creuser     : ShortString		read Fcreuser      write Fcreuser;
        property upddate     : TDate			read Fupddate      write Fupddate;
        property upduser     : ShortString		read Fupduser      write Fupduser;
        property rowid       : Integer			read Frowid        write Frowid;
      end;
      {$M-}
    Le même code avec un type TTable = class(TInterfacedObject) puis TypeInfo(TTable.classInfo) fonctionne a merveille.

    Merci de votre aide.
    Salutations.

  2. #2
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2009
    Messages : 34
    Points : 59
    Points
    59
    Par défaut Pas de solution intégrée.
    Bonjour,
    Je réponds à mon propre post. En fait, la version actuelle fpc 2.6 n’intègre pas le instructions pour connaitre les propriétés d'une structure à l'exécution.
    Cependant, à partir de fpc 2.7.1 ou supérieur, il est possible de connaitre le nombre de propriétés (via PTYpeData^.ManagedFldCount) et leur type (via PManagedField^.TypeRef^.Name) mais toujours pas les infos de propriétés telle que proposées pour le propriétés publiées des classe via TPropInfo.

    Ces fonctions RTTI sur record ont été intégrées pour la première fois sous D2010.

    La seule solution restante est de mettre en place un gestionnaire de propriétés via des instructions (RegisterProp) ou des fichiers de description de structure au format XML ou autre.

    Merci.

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

Discussions similaires

  1. Problème RTTI et Record
    Par Phrozen dans le forum Delphi
    Réponses: 2
    Dernier message: 27/05/2015, 14h42
  2. de l'usage des RTTI sur les composants a structure complexe
    Par SergioMaster dans le forum Langage
    Réponses: 6
    Dernier message: 11/08/2011, 09h56
  3. Réponses: 10
    Dernier message: 05/05/2007, 17h05
  4. [Forms6i] positionner sur le Dernier Record
    Par bargou dans le forum Forms
    Réponses: 3
    Dernier message: 06/12/2004, 10h44
  5. Réponses: 6
    Dernier message: 15/06/2004, 10h26

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