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 :

Type Record avec Case


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Type Record avec Case
    Bonsoir à tous,

    je cherche un moyen de regrouper la partie InRecord, je voudrais pouvoir mettre autant de param et de type que je veux.

    comment le déclarer ?
    comment l'exploiter ensuite ?

    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
    Type
      EnumTravaux=(CreateTable, CreateChamp, EditChamp, RecordSupprimer, RecordModifier, RecordInsert);
      EnumPriorite=(Obligatoire, Recommandé, Information);
      EnumOperation=(InTable,InChamp,InRecord);
     
    type
      TTravaux = Record
        Travaux       : EnumTravaux;
        Priorite      : EnumPriorite;
        MessageTravaux: String;
        Case Operation : EnumOperation of
          InTable:(
              NomDeLaTable: String[255];
              RequeteCreatetable: String[255]
                  );
          InChamp:(
              NomDuChamp: String[255];
              RequeteCreateChamp: String[255];
              RequeteEditChamp: String[255]
                  );
          InRecord:(
              RequeteRecord : String[255];
              TypeParam1    : TFieldType;
              Params1       : Variant;
              TypeParam2    : TFieldType;
              Params2       : Variant;
              TypeParam3    : TFieldType;
              Params3       : Variant;
              TypeParam4    : TFieldType;
              Params4       : Variant;
                   );
     
      End;
    @Merci pour vos remarques.

  2. #2
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bon j'en suis là

    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
    Type
      EnumTravaux=(CreateTable, CreateChamp, EditChamp, RecordSupprimer, RecordModifier, RecordInsert);
      EnumPriorite=(Obligatoire, Recommandé, Information);
    //  EnumOperation=(InTable,InChamp,InRecord);
     
    type
      TTravaux = Record
    //    Travaux       : EnumTravaux;
        Priorite      : EnumPriorite;
        MessageTravaux: String;
     
        TypeParamValue1 : TFieldType;
        ParamsValue1    : Variant;
        TypeParamValue2 : TFieldType;
        ParamsValue2    : Variant;
     
        TypeParamWhere3 : TFieldType;
        ParamsWhere3    : Variant;
        TypeParamWhere4 : TFieldType;
        ParamsWhere4    : Variant;
        Case Travaux : EnumTravaux of
          CreateTable:(
              NomDeLaTable: String[255];
              RequeteCreatetable: String[255]
                  );
          CreateChamp,EditChamp:(
              NomTable: String[255];
              NomChamp: String[255];
              RequeteCreateChamp: String[255];
              RequeteEditChamp: String[255];
                  );
          RecordSupprimer, RecordModifier, RecordInsert:(
              RequeteRecord : String[255];
                   );
     
      End;

  3. #3
    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 430
    Points
    28 430
    Par défaut
    je n'ai pas bien compris mais pourquoi pas un Array[0..MaxParam] of TTypeParam;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    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
    la finalisation est obligatoire

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    je n'ai pas bien compris mais pourquoi
    Je suis en train de faire mon utilitaire de maintenance pour mes bases de données.

    Donc en partant de cela

    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
    Type
      EnumTravaux=(CreateTable, CreateChamp, EditChamp, RecordSupprimer, RecordModifier, RecordInsert);
      EnumPriorite=(Obligatoire, Recommandé, Information);
    //  EnumOperation=(InTable,InChamp,InRecord);
     
    type
      TTravaux = Record
    //    Travaux       : EnumTravaux;
        Priorite      : EnumPriorite;
        MessageTravaux: String;
     
        TypeParamValue1 : TFieldType;
        ParamsValue1    : Variant;
        TypeParamValue2 : TFieldType;
        ParamsValue2    : Variant;
     
        TypeParamWhere1 : TFieldType;
        ParamsWhere1    : Variant;
        TypeParamWhere2 : TFieldType;
        ParamsWhere2    : Variant;
        Case Travaux : EnumTravaux of
          CreateTable:(
              NomDeLaTable: String[255];
              RequeteCreatetable: String[255]
                  );
          CreateChamp,EditChamp:(
              NomTable: String[255];
              NomChamp: String[255];
              RequeteCreateChamp: String[255];
              RequeteEditChamp: String[255];
                  );
          RecordSupprimer, RecordModifier, RecordInsert:(
              RequeteRecord : String[255];
                   );
     
      End;
    Et de cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
      FControlBase: TFControlBase;
      aTravaux      : Array of TTravaux;
      CompteurDeTravaux: Integer;
     
    implementation
     
    Uses
    Voici un exemple de travaux à faire après lecture d'un champs spécifique :

    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
                      Inc(CompteurDeTravaux);
                      SetLength(aTravaux,CompteurDeTravaux);
                      LogPlg( ' # Erreur [CodeTiers inexistant] - Table : '+Tbl.TableName+
                              ' - Enregistrement : '+ Tbl.FieldByName('NumeroLigne').AsString+
                              ' - Travaux : ' + GetEnumName(TypeInfo(EnumTravaux),integer(RecordModifier))+
                              ' - Priorité : ' + GetEnumName(TypeInfo(EnumPriorite),integer(Obligatoire)));
                      With aTravaux[CompteurDeTravaux-1] do
                      begin
                        Priorite        := Obligatoire;
                        MessageTravaux  := '';
                        Travaux         := RecordModifier;
                        RequeteRecord   := 'Update DOC Set CodeTiers= :xValue1, TypeTiers= :xValue1 Where (CodeTiers= :xWhere1) And (TypeTiers= :xWhere2) ';
                        TypeParamValue1 := ftString;
                        ParamsValue1    := '';
                        TypeParamValue2 := ftString;
                        ParamsValue2    := '';
     
                        TypeParamWhere1 := ftString;
                        ParamsWhere1    := Tbl.FieldByName('CodeTiers').AsString;
                        TypeParamWhere2 := ftString;
                        ParamsWhere2    := Tbl.FieldByName('TypeTiers').AsString;
    Donc je mémorise les travaux à faire, pour ensuite les réaliser tous ou non.
    Mais cela m'ennuie d'écrire :
    TypeParamValue1 := ftString;
    ParamsValue1 := '';
    TypeParamValue2 := ftString;
    ParamsValue2 := '';


    J'aurai aimé un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TypeParamValue := [fttring,ftString];
    ParamsValue : =['',''];
    Mais même si je fais cela, lorsque je vais lancer réellement les travaux, je dois arriver à lire le nombre de param genre TypeParamValue.Count, pour ensuite les remplacer dans RequeteRecord

    Pour ta proposition, je vois pas l'intérêt dans mon cas, à moins que je me trompe.

    En claire, est-ce que je peux simplifier ?

    Merci

  6. #6
    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
    pourquoi ne pas travailler avec un objet ?
    [ 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!

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    pourquoi ne pas travailler avec un objet ?
    Salut Who, tout simplement car je ne sais pas comment le faire...

    J'ai mis en place ce que j'ai décris si dessus, et je viens de me rendre compte que :

    NomDeLaTable: String[255]; et NomTable: String[255];, prennent exactement la même valeur que RequeteRecord : String[255]; !!! bizzard... alors que je ne valorise que RequeteRecord...


  8. #8
    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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    Salut Who, tout simplement car je ne sais pas comment le faire...

    J'ai mis en place ce que j'ai décris si dessus, et je viens de me rendre compte que :

    NomDeLaTable: String[255]; et NomTable: String[255];, prennent exactement la même valeur que RequeteRecord : String[255]; !!! bizzard... alors que je ne valorise que RequeteRecord...

    ça n'est pas bizarre, c'est le but de Record avec Case les différents cas se superposent en mémoire, comme tu les commences tous par un String[255] la chaîne est en fait la même sous trois nom différents. Tu pourrais tout aussi bien sortir la chaîne du CASE

    dans l'exemple ci-dessous la structure occupe 4 octets car Integer est la structure la plus large et elle fait 4 octets, AsByte occupe le premier octet de AsInteger, AsWord les deux premiers...on peut d'ailleurs aussi utiliser des array (cas 4 et 5)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    type
      TNumber = record
        case Byte of
           1 : AsByte: Byte;
           2 : AsWord: Word;
           3 : AsInteger: Integer; 
           4 : AsBytes: array[0..3] of Byte;
           5 : AsWords: array[0..1] of Word;
           6 : record a, b, c, d : Byte end;
        end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Réponses: 11
    Dernier message: 17/06/2010, 18h25
  2. Problème avec un type record
    Par iznogoud_23 dans le forum Débuter
    Réponses: 25
    Dernier message: 19/05/2008, 13h08
  3. Type pour données de type email avec @
    Par jeff37 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/01/2004, 14h50
  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