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 avec partie variable


Sujet :

Langage Delphi

  1. #1
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut Record avec partie variable
    Bonjour,

    J'aimerais que quelqu'un de savant m'explique comment fonctionnent les record avec partie variable. Quel est le champs variable pris en compte pour le case ... of ?

    Autrement dit, dans l'exemple fournit par l'aide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    type recordTypeName = record
          fieldList1: type1;
          .....
          fieldTypeN: typeN;
          case tag: ordinalType of
             constantList1: (variant1);
             ....
             constantListN: (variantN); 
          end;
    Est-ce que l'on doit fournir une valeur à recordTypeName.tag ? et si oui, l'aide précise que tag est optionnel : comment fait-on alors ?

    Merci à vous.
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Attention : c'est une astuce de programmation pour définir plusieurs champs du record au même endroit mémoire. Il n'y a aucun controle ni à la compilation ni à l'exécution de la valeur de choix par rapport aux champ utiliés.

    Par exemple si on utilise la définition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    type recordTypeName = record
          Truc :integer;
          case Choix:Integer of
             1: (Valeur : Integer);
             2: (Diff1 :Integer); 
          end;
     
    Var rec:recordTypeName;
    Alors le code suivant compile et s'éxecute sans problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Rec.Choix := 1;
    Rec.Diff1 :=12345; // bien que choix=1, diff 1 est acessible !
    // de plus on recupère la valeur dans valeur :
    ShowMesasge(IntToStr(Rec.Valeur)); // Affiche 12345
    Il faut considérer les record à choix multiple comme une façon différente de déterminer les adresses mémoire du record :

    Dans l'exemple ci-dessus :
    Truc sera à l'offset 0
    Choix sera à l'offset 4
    Valeur sera à l'offset 8
    Diff1 sera à l'offset 8

    Avec cette logique on comprend que "Choix" n'est pas vraiment utile.

    C'est devenu limité comme utilisation, normelement si on a besoin de ce genre de record c'est qu'il faut utiliser des objets à la place.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 321
    Points
    11 321
    Billets dans le blog
    6
    Par défaut
    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
    type 
      THalfCard=record
        Hi,Lo: Word;
      end;
      TMyCard=record
        case Boolean of
          True:  (Card: Cardinal);
          False: (HalfCard: THalfCard);
      end;
     
    var
      MyCard: TMyCard;
     
    begin
      MyCard.HalfCard.Hi:=$1234;
      MyCard.HalfCard.Lo:=$5678;
      if MyCard.Card<>$12345678 then ShowMessage('boulette !');
    end;
    plutôt que d'appeler les fonctions Hi et Lo !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Citation Envoyé par Nono40 Voir le message
    Avec cette logique on comprend que "Choix" n'est pas vraiment utile.

    C'est devenu limité comme utilisation, normalement si on a besoin de ce genre de record c'est qu'il faut utiliser des objets à la place.

    Comment écrivez-vous un objet avec partie variable ?

    Merci !!
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

  5. #5
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Tu n'écris pas UN objet, mais plusieurs :
    Le premier comptient les champs communs,
    Les autres sont des descendants du premiers et correspondent chacun à l'un des choix et contiennent chacun les champ optionnels qui leur sont propres.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  6. #6
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Evidemment sur une nouvelle application, choisir d'utiliser des records avec une structure variable c'est un peu douteux.

    Cependant ça présente quand même une utilité : La plupart des API Win32 utilisent ce type de structure (les union). Donc on en a généralement besoin lorsqu'on veut appeler ce type d'API (même si on peut bidouiller pour faire sans).

  7. #7
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Merci pour vos réponses !

    Citation Envoyé par Nono40 Voir le message
    Tu n'écris pas UN objet, mais plusieurs :
    Le premier comptient les champs communs,
    Les autres sont des descendants du premiers et correspondent chacun à l'un des choix et contiennent chacun les champ optionnels qui leur sont propres.
    (évidemment, j'aurais dû y penser ! )

    Citation Envoyé par Franck SORIANO Voir le message
    La plupart des API Win32 utilisent ce type de structure (les union). Donc on en a généralement besoin lorsqu'on veut appeler ce type d'API (même si on peut bidouiller pour faire sans).
    Effectivement, c'est bien en parcourant le script d'une ddl pour excel (adaptée du C vers Delphi) que j'ai rencontré ce type de structure, sans comprendre comment était fait le choix des variables. Maintenant c'est plus clair, pas forcement plus utile au quotidien.

    Encore merci.
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

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

Discussions similaires

  1. Record avec champ "variable"
    Par GoustiFruit dans le forum Langage
    Réponses: 15
    Dernier message: 27/03/2012, 11h53
  2. paramétrer ADOConnection avec des variables
    Par ouckileou dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/04/2004, 08h11
  3. UPDATE avec des variables Delphi ...
    Par Kokito dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/03/2004, 22h35
  4. Comparaison d'un registre 8 bits avec une variable 32 bits
    Par tupperware dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 15/10/2002, 10h25
  5. Désigner une variable avec une variable?
    Par littleman dans le forum Paradox
    Réponses: 4
    Dernier message: 12/08/2002, 11h21

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