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 :

Pointer tous les champs d'un Record


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2005
    Messages : 60
    Points : 47
    Points
    47
    Par défaut Pointer tous les champs d'un Record
    Bonjour
    imaginons que j'ai un 'record'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Type
      TpListeDeValeur = Record
        A1   : Integer;
        A2   : Single; 
        A3   : byte;
      end;
     
      TpMinMax = Record
        Min : TpListeDeValeur;
        Max: TpListeDeValeur;
      end;
    puis un tableau regroupant des valeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var 
      TbValeur : array[1..100] of TpListeDeValeur;
      MinMax   : TpMinMax;
    le but est de calculer le minimum et le maximum des valeurs de A1, A2 et A3.
    et si je rajoute un jour A4, que la routine tourne sans modification du code.

    y a t'il un moyen de pointer tous les champs d'un 'record' automatiquement, comme les champs d'un tableau ?

    Merci pour le temps que vous passez à nous lire et à nous corriger.
    c'est très apprécié.
    bonne journée

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

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

    Informations forums :
    Inscription : mars 2005
    Messages : 3 368
    Points : 9 831
    Points
    9 831
    Billets dans le blog
    6
    Par défaut
    Non...

    Pour rester au niveau de l'enregistrement, on peut passer par un record helper qui fournirait une méthode CompareAuxExtremes qui serait redéfinie à chaque modification des champs.
    Delphi 5 Pro - Delphi 10.3.2 Rio 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 !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2005
    Messages : 60
    Points : 47
    Points
    47
    Par défaut Changement de Structure ?
    Bonjour,
    merci pour la réponse.
    y aurait t'il alors une autre structure qui me permettrait de résoudre le problème ?

    bonne journée

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

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

    Informations forums :
    Inscription : mars 2005
    Messages : 3 368
    Points : 9 831
    Points
    9 831
    Billets dans le blog
    6
    Par défaut
    Un tableau de tableau de variants ? La longueur du tableau de variants et le type de ses éléments dépendrait du record à reproduire.
    Mais la procédure devrait sûrement tester beaucoup de cas pour être générique, et surtout, au lieu d'être connue comme un type, la structure des données devrait l'être de la procédure d'affectation des données.
    Voici une belle usine à gaz en perspective.
    D'où vient le besoin ? N'y a-t-il pas moyen de faire autrement ?
    Delphi 5 Pro - Delphi 10.3.2 Rio 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 !

  5. #5
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 163
    Points : 3 034
    Points
    3 034
    Billets dans le blog
    2
    Par défaut
    Salut pour réaliser ce que tu souhaites ta structure est trop rigide et comme le suggères tourlourou, il te faudra implémenter de nouvelles méthodes à chaque fois que tu ajoutes une valeur.

    Comme ça à chaud je passerai par plusieurs enregistrements et des tableaux dynamique (ou flux mémoire) :

    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
    Type
      TVarType = (vtByte, vtWord, vtInteger, vtDWord, vtInt64, vtSingle, vtDouble);
      TValeur = record
        Valeur : Variant;
        ValeurType : TVarType;
      end;
     
      TTableauValeur = Array of TValeur;
     
      TValeurMinMax = record
        mini : TValeur;
        maxi : TValeur;
      end;
     
      TListeValeurMinMax = Array of TValeurMinMax
     
      TListeDeValeur = Record
        nbValeur : Word;
        TableauValeur : TTableauValeur;
      end;
     
    var 
      TbValeur :  Array of TListeDeValeur;
      TbMinMax :  Array of TListeValeurMinMax; // grandeur en fonction de TbValeur.nbValeur
    Il te suffira de coder une méthode en fonction du nombre de valeur présent dans TListeValeur et de transtyper "Valeur" dans TValeur en fonction du type

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2005
    Messages : 60
    Points : 47
    Points
    47
    Par défaut paramètres d'un radar
    Mon tableau, c'est en fait les paramètres d'un radar.
    chaque élément de ce tableau représente une impulsion de ce radar.
    chaque impulsion est représenté par ses paramètres:
    - sa fréquence, (que j'avais noté A1)
    - sa durée d'impulsion, (A2)
    - le niveau de cette impulsion, (A3)
    - etc ...

    mon tableau peut représenter des millions d'impulsions, d’où ma réticence à passer les champs en variant qui occuperait beaucoup plus de place en mémoire.

    et comme des paramètres peuvent s'ajouter, le tableau (ses champs) peut évoluer.

  7. #7
    Membre expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 163
    Points : 3 034
    Points
    3 034
    Billets dans le blog
    2
    Par défaut
    Nos messages et pensées se sont croisé Tourlourou

    Connais tu exactement le nombre de paramètres à prendre en compte suivant le "type" de radar ?

    Pour ma part, dans ce cas, à la place de passer par des enregistrement je passerai pas des "classes"et des listes de classes (dans le genre TList ou TCollection) ce qui permettrai de les étendre plus facilement grâce à l'héritage et le polymorphisme. cf les articles de Gilles Vasseur dans les tutoriels avancés : POO à gogo 1ere partie

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2005
    Messages : 60
    Points : 47
    Points
    47
    Par défaut Connaissance des paramètres
    Bonjour.
    J'ai des paramètres principaux qui sont toujours présents,
    mais d'autres peuvent se rajouter.
    Je vais essayer effectivement d'implémenter des classes.
    merci pour vos réponses.
    bonne journée

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    7 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 7 469
    Points : 24 628
    Points
    24 628
    Par défaut
    Bonjour,

    la seule façon de la faire en automatique c'est par les RTTI

    sous Delphi j'utilise mon unité Execute.RTTI
    https://github.com/tothpaul/DelphiAC...ecute.RTTI.pas

    il manque une fonction pour parcourir les membres vu que je n'ai jamais eu ce besoin mais c'est facile à faire en regardant RecordFieldByName() tu peux facilement retrouver le nième champ, après avec un "case TypeData.OrdType of" tu peux savoir si c'est un ordinal (cf GetOrd) ou un Float, tu peux voir dans SetValue() comment écrire la valeur...la lecture se faire de la même façon mais dans l'autre sens

    je ne sais pas sous Lazarus, mais sous Delphi il y a un aussi l'unité System.RTTI qui permet de faire la même, mais je ne la trouve pas pratique
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Récupérer tous les champs de même nom
    Par hlr dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/02/2005, 14h26
  2. afficher tous les champs d'une table
    Par julio84 dans le forum ASP
    Réponses: 8
    Dernier message: 19/01/2005, 11h31
  3. selectionner tous les champs sauf un ?
    Par HULK dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/01/2005, 16h51
  4. Retrouver tous les champs d'une table
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/07/2004, 21h40
  5. Afficher tous les champs d'une table avec dbexpress et MySQL
    Par LHT dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/06/2004, 18h11

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