Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Langage
Langage Tout ce qui concerne le langage (POO, syntaxe, message d'erreur...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 05/12/2012, 22h09   #1
BuzzLeclaire
Membre Expert
 
Avatar de BuzzLeclaire
 
Homme
Dev/For/Vte/Ass
Inscription : août 2008
Messages : 1 499
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 499
Points : 1 059
Points : 1 059
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 :
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.
BuzzLeclaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2012, 22h41   #2
BuzzLeclaire
Membre Expert
 
Avatar de BuzzLeclaire
 
Homme
Dev/For/Vte/Ass
Inscription : août 2008
Messages : 1 499
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 499
Points : 1 059
Points : 1 059
Bon j'en suis là

Code :
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;
BuzzLeclaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 04h58   #3
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 423
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 423
Points : 10 815
Points : 10 815
je n'ai pas bien compris mais pourquoi pas un Array[0..MaxParam] of TTypeParam;
__________________
Developpez.com: Mes articles, forum FlashPascal
Entreprise: Execute SARL
Produits : UPnP, RemoteOffice, FlashPascal
Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 20h33   #4
Montor
Membre émérite
 
Avatar de Montor
 
Homme
Inscription : avril 2008
Messages : 863
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations forums :
Inscription : avril 2008
Messages : 863
Points : 844
Points : 844
la finalisation est obligatoire
Montor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 23h53   #5
BuzzLeclaire
Membre Expert
 
Avatar de BuzzLeclaire
 
Homme
Dev/For/Vte/Ass
Inscription : août 2008
Messages : 1 499
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 499
Points : 1 059
Points : 1 059
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 :
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 :
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 :
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 :
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
BuzzLeclaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 00h09   #6
Dr.Who
Membre Expert
 
Avatar de Dr.Who
 
Inscription : septembre 2009
Messages : 980
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : septembre 2009
Messages : 980
Points : 1 175
Points : 1 175
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!
Dr.Who est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/12/2012, 22h14   #7
BuzzLeclaire
Membre Expert
 
Avatar de BuzzLeclaire
 
Homme
Dev/For/Vte/Ass
Inscription : août 2008
Messages : 1 499
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 499
Points : 1 059
Points : 1 059
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...

BuzzLeclaire est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 13/12/2012, 05h11   #8
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 423
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 423
Points : 10 815
Points : 10 815
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 :
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
Produits : UPnP, RemoteOffice, FlashPascal
Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h11.


 
 
 
 
Partenaires

Hébergement Web