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 valeur par défaut


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 115
    Points : 62
    Points
    62
    Par défaut Record avec valeur par défaut
    Bonjour à tous !

    Je vous demande encore de l'aide pour une question qui a surement déjà été posée maintes et maintes fois...

    Je voudrais écrire un truc un peu comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TMonRecord = record
       Numero : Byte ;
       Valeur : Integer = 10;
    end;
    En gros, je voudrais déclarer un type qui serait un record dans lequel un des champs aurait une valeur par défaut.
    Mais, ça ne marche pas...

    Quelqu'un pourrait me dire pourquoi ou mieux, aurait une solution à me proposer ?

    Merci à vous tous en tous cas !

  2. #2
    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 448
    Points
    28 448
    Par défaut
    Citation Envoyé par Sancha Voir le message
    Bonjour à tous !

    Je vous demande encore de l'aide pour une question qui a surement déjà été posée maintes et maintes fois...

    Je voudrais écrire un truc un peu comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TMonRecord = record
       Numero : Byte ;
       Valeur : Integer = 10;
    end;
    En gros, je voudrais déclarer un type qui serait un record dans lequel un des champs aurait une valeur par défaut.
    Mais, ça ne marche pas...

    Quelqu'un pourrait me dire pourquoi ou mieux, aurait une solution à me proposer ?

    Merci à vous tous en tous cas !
    ça n'existe pas.

    un record défini une organisation mémoire, pas des valeurs.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    pour une constente ou var c'est possible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var TMonRecord :record
       Numero : Byte ;
       Valeur : Integer ;
    end  =(Numero:0;Valeur:10;);

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 115
    Points : 62
    Points
    62
    Par défaut
    Ah d'accord.
    Bon ben merci à tous les deux pour vos réponses !
    Je vais essayer de bidouiller alors !

    Encore merci !

  5. #5
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Mais alors, quelle est la différence (en terme d'utilisation) entre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TMonRecord = record
       Numero : Byte ;
       Valeur : Integer = 10;
    end;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var TMonRecord :record
       Numero : Byte ;
       Valeur : Integer ;
    end;
    ?

    Car si la deuxième ne présente pas d'inconvénients par rapport à la première, et en plus permet une initialisation des éléments comme montré par Montor, alors autant la privilégier.

  6. #6
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    En fait, avec la première, tu définis un type, que tu pourras réutiliser plus tard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type
      TMonRecord = record
         Numero : Byte ;
         Valeur : Integer;
      end;
    Ce type se nomme TMonRecord. On peut ensuite l'utiliser dans une procedure ou ailleurs ... On peut aussi déclarer une variable de ce type qu'on peut initialiser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaVar : TMonRecord =(Numero:0;Valeur:10;);
    Ce code est différent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var MaVar :record
       Numero : Byte ;
       Valeur : Integer ;
    end;
    Il permet de déclarer une variable de type record et de l'initialiser en meme temps. Mais le record n'est pas déclaré comme type, donc on ne peut pas l'utiliser ailleurs ...

  7. #7
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par mick605 Voir le message
    En fait, avec la première, tu définis un type, que tu pourras réutiliser plus tard. Ce type se nomme TMonRecord. On peut ensuite l'utiliser dans une procedure ou ailleurs ... On peut aussi déclarer une variable de ce type qu'on peut initialiser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaVar : TMonRecord =(Numero:0;Valeur:10;);
    Ce code est différent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var MaVar :record
       Numero : Byte ;
       Valeur : Integer ;
    end;
    Il permet de déclarer une variable de type record et de l'initialiser en meme temps. Mais le record n'est pas déclaré comme type, donc on ne peut pas l'utiliser ailleurs ...
    Ha bon ok ! Donc la solution du var proposée par Montor n'est pas une solution au problème initial, je suppose que c'était plutôt un aparté.

  8. #8
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    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
     
    type
      TMonRecord = record
         Numero : Byte;
         Valeur : Integer;
      end;
     
    const
      MonRecordDefault : TMonRecord = (Numero: 0; Valeur: 10);
     
     
    var
      MR : TMonRecord = MonRecordDefault;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  9. #9
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Si je comprends bien, finalement un record "TRecordTotox" c'est comme "Integer", ou "Boolean", c'est un type de variable, c'est ça ? Sauf qu'il est défini par l'utilisateur ? (Je n'utilise pas les records).

    Dans ce cas, pour apporter une solution au sujet initial, n'est il pas possible, par ex. dans une procédure qui serait appelée au démarrage de son appli, de parcourir la liste des variables et ou propriétés privées/publiques, et de leur affecter une valeur par défaut dans le cas où s'agit du type record en question ?

  10. #10
    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 448
    Points
    28 448
    Par défaut
    Citation Envoyé par peter27x Voir le message
    Si je comprends bien, finalement un record "TRecordTotox" c'est comme "Integer", ou "Boolean", c'est un type de variable, c'est ça ? Sauf qu'il est défini par l'utilisateur ? (Je n'utilise pas les records).

    Dans ce cas, pour apporter une solution au sujet initial, n'est il pas possible, par ex. dans une procédure qui serait appelée au démarrage de son appli, de parcourir la liste des variables et ou propriétés privées/publiques, et de leur affecter une valeur par défaut dans le cas où s'agit du type record en question ?
    non ce n'est pas possible.

    les RTTI ne serait disponibles que sur des propriétés publiée d'objet référencés quelque part (ça a changé sous Delphi 2009 ou 10 qui publie tout je crois)...or il appartiendrait alors à ces objets d'initialiser leurs propriétés correctement.

    sinon un Record c'est un peu comme un objet statique sans méthode (encore que Delphi v??? permet de déclarer des méthodes dans un record). C'est la structure (struc) du C et le type (ou typedef je sais plus) du basic.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    un record est effectivement un type.

    un enregistrement pour être exact.

    record equivaut au type Struc du C.

    il fait partis des types dit "complexes".
    car il peut avoir des syntaxes trés différentes.

    plutot qu'un réel espace mémoire, les record sont plutot une façon de structurer la lecture/ecriture d'un bloc de donnée.
    bloc de donnée qui n'est, en simplifiant, qu'une suite d'octets qui pourrait être lus via un tableau de byte.

    mais un tableau de byte ce n'est pas pratique pour le developpeur, pour lire des bloc de données.
    on utilisera plutot un record (une structure donc), qui n'est pas réellement différente du tableau de byte, mais permet d'organiser les données dans le bloc lut/ecrit.

    si l'on prend le type TPoint, qui est un record, ce n'est jamais que deux integer allignés l'un aprés l'autre.

    un TPoint pour donc être lut dans :
    array[0..1] of integer;
    array[0..7] of byte;

    mais comment différencier X de Y ?
    pas pratique.

    on utilise donc TPoint pour avoir X et Y ce qui rend le code plus parlant.
    idem pour TRect, TRGBRec, Int64Rec etc.

    si on jette un coups d'oeuil dans l'unité SysUtils ou Graphics ou Windows, on trouvera pleins de structures différente.
    permettant ainsi une meilleure organisation, structuration des données.
    cela donne plus de cohérence au code et en facilite la compréhension.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  12. #12
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Finalement la proposition de Dr Who (qui ?) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    const
      MonRecordDefault : TMonRecord = (Numero: 0; Valeur: 10);
     
    var
      MR : TMonRecord = MonRecordDefault;
    semble être la meilleure, non ?

  13. #13
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Sinon dans l'absolu le top du top serait de pouvoir un jour écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TMonRecord.onCreate := procCreate();
     
    procedure T???.procCreate();
    begin
      valeur := 10;
      délire := true;
      ...
    end;

  14. #14
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    tout dépend ce que l'on cherche à faire.

    c'est néanmoins la bonne façon de faire.


    toujours bien structurer son code.

    il n'y a même pas à tergiverser des heures,
    je veux créer un record ?
    oui ?

    voici le template :

    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
     
    type  
      P%1 = ^T%1;
      T%1 = record
        %2
      end;
      P%1DynArray = ^T%1DynArray;
      T%1DynArray = array of T%1;
      P%1s = ^T%1s;
      T%1s = array[0..0] of T%1;
     
      function %1Create(%2) : T%1;
     
      const
        %1Null : T%1 = (%2);
        %1Default : T%1 = (%2);
     
    var
      v%1 : T%1 = %1Default;
    %1 = identifiant
    %2 = [champs: ;[champs: ;]];

    on copie colle le tpl, CTRL+R
    remplace %1 par identifiant
    remplace %2 par champs: ; champ:

    exemple avec TPoint :

    remplace %1 avec "Point"
    remplace %2 avec "X: ; Y: "

    génére :

    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
    type 
      PPoint = ^TPoint;
      TPoint = record
        X: {ajouter type}; 
        Y: {ajouter type et ajouter ";"}
      end;
      PPointDynArray = ^TPointDynArray;
      TPointDynArray = array of TPoint;
      PPoints = ^TPoints;
      TPoints = array[0..0] of TPoint;
     
      function PointCreate(X: {ajouter type}; Y: {ajouter type}): TPoint;
     
      const
        PointNull : TPoint = (X: {valeur}; Y: {valeur});
        PointDefault : TPoint = (X: {valeur}; Y: {valeur});
     
    var
      vPoint : TPoint = PointDefault;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  15. #15
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    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
    type 
      PPoint = ^TPoint;
      TPoint = record
        X: {ajouter type}; 
        Y: {ajouter type et ajouter ";"}
      end;
      PPointDynArray = ^TPointDynArray;
      TPointDynArray = array of TPoint;
      PPoints = ^TPoints;
      TPoints = array[0..0] of TPoint;
     
      function PointCreate(X: {ajouter type}; Y: {ajouter type}): TPoint;
     
      const
        PointNull : TPoint = (X: {valeur}; Y: {valeur});
        PointDefault : TPoint = (X: {valeur}; Y: {valeur});
     
    var
      vPoint : TPoint = PointDefault;
    A quel moment utilises tu PointCreate() ?

  16. #16
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par peter27x Voir le message
    Sinon dans l'absolu le top du top serait de pouvoir un jour écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TMonRecord.onCreate := procCreate();
     
    procedure T???.procCreate();
    begin
      valeur := 10;
      délire := true;
      ...
    end;
    C'est pas un objet ca ??

  17. #17
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par mick605 Voir le message
    C'est pas un objet ca ??
    Ben avec un objet y'a plus de questions à se poser, là le problème justement c'est de pouvoir le faire avec un record !

  18. #18
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par peter27x Voir le message
    Ben avec un objet y'a plus de questions à se poser, là le problème justement c'est de pouvoir le faire avec un record !
    Ah, je n'avais pas compris ... Je croyais que tu demandais si il existait une structure qui permettait l'ajout d'une procedure Create

    Pour ma part, je ne trouve pas l'utilisation du record contraignante. On peut les initialiser, et faire des trucs un peu poussés avec ...

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Les records acceptent un constructeur (méthodes, propriétés, etc.) depuis D2007 (je crois). C'est cependant dommage qu'il faille l'appeler implicitement .

    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
      TRec = record
        X :integer;
        Y :integer;
        constructor Create(aDummy :integer);
      end;
     
    constructor TRec.Create(aDummy :integer);
    begin
      X := 10;
      Y := 4;
    end;
     
    procedure TForm6.FormCreate(Sender: TObject);
    begin
      R := TRec.Create(0);
      ShowMessage(IntToStr(R.X));
    end;

  20. #20
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Les records acceptent un constructeur (méthodes, propriétés, etc.) depuis D2007 (je crois). C'est cependant dommage qu'il faille l'appeler implicitement .

    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
      TRec = record
        X :integer;
        Y :integer;
        constructor Create(aDummy :integer);
      end;
     
    constructor TRec.Create(aDummy :integer);
    begin
      X := 10;
      Y := 4;
    end;
     
    procedure TForm6.FormCreate(Sender: TObject);
    begin
      R := TRec.Create(0);
      ShowMessage(IntToStr(R.X));
    end;
    Ben mince alors ! Mon délire n'était finalement pas si délirant que ça ! On peut le faire !

    Mais avec ce type de record, la frontière avec un objet se rétrécit fortement ! Non ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Formulaire, Champ Grisé avec valeur "par défaut"
    Par Lutine dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 12/06/2011, 18h38
  2. [AC-2010] Ouvrir un sous formulaire via formulaire avec valeur par défaut
    Par Sami Xite dans le forum Access
    Réponses: 2
    Dernier message: 30/07/2010, 18h13
  3. Réponses: 1
    Dernier message: 11/07/2010, 13h34
  4. Réponses: 4
    Dernier message: 01/11/2008, 09h41
  5. Supprimer une colonne avec valeurs par défaut
    Par SlashOwnsU dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 18/09/2006, 10h10

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