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 :

Record et type de record


Sujet :

Langage Delphi

  1. #1
    Membre expert

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut Record et type de record
    Bonjour,

    Petite interrogation du jour !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    type
      TRec = record
        Nom: string;
      end;
     
      TRec1 = TRec;
     
      TRec2 = TRec;
     
      procedure Truc(Rec: TRec);
      begin
        // sans utiliser les Rtti, il y a un moyen de savoir si Rec est un Trec1 ou un TRec2 ?????
      end;

  2. #2
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 664
    Points : 3 648
    Points
    3 648
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Comme tu as mis le champ "nom" au TRec, tu peux te baser sur sa valeur (à condition d'affecter la valeur de nom de manière unique):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure Truc(Rec: TRec);
    begin
        // sans utiliser les Rtti, il y a un moyen de savoir si Rec est un Trec1 ou un TRec2 ?????
        if lowercase(Rec.nom) = 'trec1' then
        [...] 
    end;

  3. #3
    Membre expert

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Oui, mais je pensais à quelque chose de plus technique

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 796
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 796
    Points : 13 475
    Points
    13 475
    Par défaut
    Quel est le but puisque le type record ne supporte pas l'héritage ?

  5. #5
    Membre expert

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    J'ai 2 procédures (pour le moment) qui prennent en paramètre soit un TRec1, soit un TRec2.
    Plutôt que d'avoir 2 procédures SendRec1 et SendRec2 , je voulais en faire une seule et dans le code, selon le type de record faire telle ou telle action.
    Avec un TObject j'utiliserais ClassType mais avec le record ça n'est pas possible.

    Je me doutais un peu que ça ne passerait pas.
    La solution de prendre le record juste comme source d'information pour créer un second record adapté ensuite ira très bien.
    Pour la suite du code, j'ai effectivement besoin de 2 types record différents bien que la structure soit commune.
    D'où ma recherche pour avoir un type générique.

  6. #6
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    TRec1 = TRec; créé juste un alias, donc utiliser TRec1 ou TRec revient strictement au même pour le compilo
    TRec2 = type TRec; créé un nouveau type, et le compilateur distingue les 2, tu pourra (et devra) quand même le caster pour le passer a une fonction qui attend un TRec truc(TRec(maVarTRec2));

  7. #7
    Membre expert

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Intéressant .... Je vais voir ça.

    Merci

  8. #8
    Membre confirmé Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 323
    Points : 484
    Points
    484
    Par défaut
    Bonjour à tous,

    Quelle est la différence entre envoyer un tRec1 ou un tRec2 puisque, même déclaré individuellement en Type tRec, ils sont du même type ? Il me semble que, l'avantage de transmettre un paramètre consiste justement à effectuer la même opération sur plusieurs variables ou objet d'un même type.

    Pour les identifier, on peut aussi utiliser l'adresse mémoire...

    Cordialement,

  9. #9
    Membre expert

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Quel avantage ? Effectivement, à première vue, ça n'a pas tellement de sens. Et pourtant ...

    Je prépare un tutoriel dans lequel j'utilise les TMessage de System.Messaging.
    Des éléments du tutoriel utilisent les génériques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      TWarningMessage = TMessage<TWarning>;
      TErrorMessage   = TMessage<TError>;
    Cela crée des éléments différents et pourtant TWarning et Error sont absolument identiques dans leur structure.

    J'ai 2 procédures SendWarning et SendError qui prennent respectivement en paramètre un TWarningMessage ou TErrorMessage
    Le but était de faire une seule procédure Send prenant en paramètre un type commun et dans le code de la procédure faire le distinguo entre les types.

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 166
    Points : 41 348
    Points
    41 348
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    je vois enfin où tu veux en venir, mais j'ai un avantage sur les autres Bon, je ne dévoile rien mais, sur la base de la discussion, qu'est-ce qui t'empêche de rajouter un type à ton TRec ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    TMessageType = (mtWarning,mtError);
     
    type
      TRec = record
        msgType : TMessageType;
        Nom: string;
        // constructor ?
        // destructor ?
      end;
     TRec2 : TRec;
     TRec1 : TRec;
    c'est peut-être moins "glamour" que ce que tu cherches mais c'est simple et tu n'as peut-être même plus besoin des TRec1 et TRec2

  11. #11
    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 : 55
    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 457
    Points
    28 457
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Quel avantage ? Effectivement, à première vue, ça n'a pas tellement de sens. Et pourtant ...

    Je prépare un tutoriel dans lequel j'utilise les TMessage de System.Messaging.
    Des éléments du tutoriel utilisent les génériques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      TWarningMessage = TMessage<TWarning>;
      TErrorMessage   = TMessage<TError>;
    Cela crée des éléments différents et pourtant TWarning et Error sont absolument identiques dans leur structure.

    J'ai 2 procédures SendWarning et SendError qui prennent respectivement en paramètre un TWarningMessage ou TErrorMessage
    Le but était de faire une seule procédure Send prenant en paramètre un type commun et dans le code de la procédure faire le distinguo entre les types.
    le procédure ne pourra pas détecter la différence de type si elle accepte les deux et que le contenu est identique

    je vois deux approches, les génériques, mais je ne suis pas certain que ce soit bien pratique avec des records

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure SendWarning<T>(const Mg: TMessage<T>);
    et dans la mesure ou cela créerai de toute façon deux méthodes, autant passer par un overload

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    procedure SendWarning(const Msg: TMessage<TWarning>); overload;
    procedure SendWarning(const Msg: TMessage<TError>); overload;

  12. #12
    Membre expert

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Je vais voir avec les génériques, c'est peut-être la solution.
    Suite et fin bientôt une fois l'écriture terminée et mise en forme.

    Merci à tous

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/09/2005, 14h29
  2. [PLSQL] TYPE RECORD
    Par romuald9999 dans le forum Oracle
    Réponses: 13
    Dernier message: 19/08/2004, 15h18
  3. [LG]fichier typé; record et pointeurs
    Par rigel dans le forum Langage
    Réponses: 6
    Dernier message: 12/05/2004, 16h12
  4. [LG]Resultat de fonction de type Record ?
    Par Mike888 dans le forum Langage
    Réponses: 10
    Dernier message: 24/01/2004, 22h48
  5. Structure de données de type "RECORD"
    Par chaours dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/09/2002, 17h10

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