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

C++Builder Discussion :

Erreur de compliation suite a un type


Sujet :

C++Builder

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Points : 91
    Points
    91
    Par défaut Erreur de compliation suite a un type
    Bonsoir,
    j'ai un structure défini comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct {   /*  structure servant a captuer les
                        caractere saisie sur on key press
                         */
       AnsiString NOM;
      ....
      ....
      ....
     
     }_TStructPers;
    J'aissaie de faire un test comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (pStPers->NOM==NULL)? DataModule1->CDSPers->FieldByName("NOM")->AsString:" ";
    même erreur ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (pStPers->NOM=="")? DataModule1->CDSPers->FieldByName("NOM")->AsString:" ";

    CDSPers est un TClientDataSet

    J'ai un erreur de compilation

    [C++ Erreur] FormAnnuaire2.cpp(224): E2354 Deux opérandes doivent évaluer le même type
    Pourquoi?

    pourtant pStPers->NOM est de type AnsiString et ceci aussi

    DataModule1->CDSPers->FieldByName("NOM")->AsString

    ou est l'erreur ?

    merci encore d'avance de votre aide

    ps : je voudrais utiliser cette autre syntaxe du if cela me serait utilise ailleurs
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Evite la comparaison à NULL pour un AnsiString, utilise IsEmpty() ou la comparaison à EmptyStr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (pStPers->NOM.IsEmpty()) ? DataModule1->CDSPers->FieldByName("NOM")->AsString : " ";
    Où est l'affectation ?
    Je ne comprend pas bien ton code qui devrait plutôt être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Edit1->Text = (pStPers->NOM.IsEmpty()) ? DataModule1->CDSPers->FieldByName("NOM")->AsString : " ";
    En fait, j'aurais même plutôt tendance à écrire, à quoi sert TStructPers, est-ce pour de l'affichage séparé de sa couche métier ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pStPers->NOM = DataModule1->CDSPers->FieldByName("NOM")->IsNull ? "" : DataModule1->CDSPers->FieldByName("NOM")->AsString
    CDSPers c'est un TClientDataSet ?
    AsString est normalement String\AnsiString
    Tu as aussi AsWideString (à partir de D7, je crois)

    Tu es en bien en D6 pas en version Unicode (2009..XE3)
    " " serait D6-Ansi et DXE-Ansi
    L" " serait D6-Wide et DXE-Wide
    AsString serait D6-Ansi et DXE-Wide
    Pense aussi a EmptyStr correspondant à "" (effectivement c'est NULL)



    pense que l'on peut déclarer sans typedef en C++, même syntaxe qu'une classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct TStructPers
    { 
     AnsiString NOM;
     ....
     
    };
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Points : 91
    Points
    91
    Par défaut
    Bonjour
    Je capture ce que saisie l’utilisateur sur l’événement de la DBGRID onkeypress
    et l'affecte dans la structure.Cette dbgrid est en lecture/écriture
    lorsque je fais un modif je perd toujours la dernière valeur

    Je voulais en fais écrire ceci mais avec l'autre syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (pStPers->NOM.IsEmpty()){
     pStPers->NOM=   DataModule1->CDSPers->FieldByName("NOM")->AsString;
    }
    je réaffecte un cellule ou cas elle ne serais pas remplie

    J'ai réussi ceci avec votre aide avec CB6 update 4:ceci compile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (pStPers->NOM.IsEmpty()) ? DataModule1->CDSPers->FieldByName("NOM")->AsString.c_str():pStPers->NOM.c_str()
    c'est pour ceci ceci par la suite click sur un bt
    ce bt met la grille en ajout puis valide avec la methode post()

    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
    void __fastcall TFrmAnnu::SPEditPersonClick(TObject *Sender)
    {
        switch (DataModule1->CDSPers->State)
             {
               case dsBrowse:{   //edit
                // penser a changer image bt
                 DataModule1->CDSPers->Edit();
                 break;
               }
               case dsEdit:{
     
                         // penser a changer image bt
                       // ShowMessage( pStPers->NOM);
                     DataModule1->CDSPers->SetFields(
                                 ARRAYOFCONST(
                                              (
                                               (void*)NULL, //ID ne pas écrire déjà affecté
                                               pStPers->NOM=(pStPers->NOM.IsEmpty()) ? DataModule1->CDSPers->FieldByName("NOM")->AsString.c_str():pStPers->NOM.c_str() ,
                                               // suite
                                              )
                                             )
                                 );
     
     
                 DataModule1->CDSPers->Post();
                 DBGMail->SetFocus();
     
               break;
               }
               default:break;
             }
     
    }
    Le seul pb est que normalement après les ":" vu la première syntaxe (avec le if) je n'aurais rien a remettre comment faire ?

    autre chose pourquoi cb6 ne supporte pas cette syntaxe dans je met les accolades j'ai un erreur de compilation ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (<test>) ? { <instructions du si vrai> } : { <instructions du si faux> }
    merci encore pour tout
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    ARRAYOFCONST de D6 si il est comme celui de 2007, il execute deux fois la séquence, une fois pour les valeurs, une seconde fois pour la taille du tableau

    ARRAYOFCONST a été modifié en XE pour optimiser cela !

    SetFields, je ne connais pas du tout cette fonction, vu ton code, je ne suis pas convaincu que cela soit plus performant et en plus d'être franchement difficile à lire !

    J'ai tendance à découper mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void DataSetToStruct(TDataSet *ADataSet, TStructPers* pStPers)
    {
      TField *f = ADataSet->FindField("NOM");
      if (f && ! f.IsNull)
       pStPers->NOM = f->AsString;
      else
       pStPers->NOM = "";
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void StructToDataSet(TStructPers* pStPers, TDataSet *ADataSet)
    {
      TField *f = ADataSet->FindField("NOM");
      if (f)
      {
        if (pStPers->NOM.IsEmpty())
          f->Clear();
        else
          f->AsString = pStPers->NOM;
      }
     
    ...
    }

    A quoi sert le OnKeyPress ?
    Pourquoi ne pas plutôt travailler dans le OnBeforePost du TDataSet ou le OnValidate du TField pour nettoyer les données si nécessaires !
    A quoi ta structure, l'utilises-tu ailleurs ?


    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
    void __fastcall TFrmAnnu::SPEditPersonClick(TObject *Sender)
    {
        switch (DataModule1->CDSPers->State)
             {
               case dsBrowse:{   //edit
                // penser a changer image bt
                 DataModule1->CDSPers->Edit();
                 break;
               }
               case dsEdit:{
     
                 StructToDataSet(pStPers, DataModule1->CDSPers);
                 DataSetToStruct(DataModule1->CDSPers, pStPers);
     
                 DataModule1->CDSPers->Post();
                 DBGMail->SetFocus();
     
               break;
               }
               default:break;
             }
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Points : 91
    Points
    91
    Par défaut
    Bonjour,
    difficile de reprendre le C++ après une longue maladie....

    Je me sert de cette structure car chaque fois que je modifie les données.
    je perd toujours la dernière valeur.

    C'est pour cela que je capture ceci sur l’événement OnKeyPress

    Question bete je n'arrive plus a initialiser ma structure au lieu de faire ceci
    je voudrais faire ceci :
    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
     
     
    //dans le h
     typedef struct {   /*  structure servant a captuer les
                        caractere saisie sur on key press
                         */
       AnsiString NOM;
       AnsiString PRENOM;
       AnsiString ADRESSE;
       AnsiString VILLE;
       int CODE_POSTAL;
       AnsiString ENTREPRISE;
     
      }_TStructPers;
     
     
     
     _TStructPers *pStPers;
     
    //dans le cpp
    pStPers=new _TStructPers;
     *pStPers={"","","","",-1,""};//erreur [C++ Erreur] FormAnnuaire2.cpp(26): //E2188 Syntaxe de l'expression
    Comment faire ?

    encore merci
    je vais vraiment regarder ce que tu as dit
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    N'est-ce pas réservé au constante ?
    Je t'avoue que ce genre de chose sont confus en C++ pour moi, je suis Delphiste, j'utilise plutôt des classes basés sur des TObject avec des constructeurs, si je fais une struct, il m'arrive de faire aussi un constructeur, ou alors ZeroMemory si la struct ne contient pas de classe
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    Concernant ta structure en C++ on préfère travailler avec des class
    la syntaxe sera donc la suivante
    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
     
    class _TStructPers{ //  /*  structure servant a captuer les
    					//caractere saisie sur on key press
       public:			//		 */
       AnsiString NOM;
       AnsiString PRENOM;
       AnsiString ADRESSE;
       AnsiString VILLE;
       int CODE_POSTAL;
       AnsiString ENTREPRISE;
    // constructeur de ta classe avec assignation des valeurs par défaut
       _TStructPers():NOM(""),PRENOM(""),ADRESSE(""),VILLE(""),CODE_POSTAL(-1),ENTREPRISE(""){};
      };
     
     
    // instanciation dans ton Cpp
    _TStructPers*  pStPers=new _TStructPers() ;
    pStPers->Nom="ton Assignation"; // assignation d'une valeur a un menbre de ta classe
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Points : 91
    Points
    91
    Par défaut
    ok ,je vous remercie a tous les deux
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Points : 91
    Points
    91
    Par défaut
    Effectivement il faut que je regroupe mon code sur BeforePost()
    c'est plus gérable encore merci toutes tes remarque
    du coup de code a refondre....

    J'aurais sans doutes d'autres questions...

    encore merci
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Points : 91
    Points
    91
    Par défaut
    l ARRAYOFCONST de D6 si il est comme celui de 2007, il execute deux fois la séquence, une fois pour les valeurs, une seconde fois pour la taille du tableau

    ARRAYOFCONST a été modifié en XE pour optimiser cela !

    SetFields, je ne connais pas du tout cette fonction, vu ton code, je ne suis pas convaincu que cela soit plus performant et en plus d'être franchement difficile à lire !
    Bonjour juste une question ,
    est ce mieux d’écrire ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     TVarRec v[]={(void*)NULL,"tyyy","h","j","f",44444,"r"};
             DataModule1->CDSPers->SetFields(v,ARRAYSIZE(v) - 1);
             DataModule1->CDSPers->post();
    merci
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  11. #11
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    a mon humble avis c'est bonnet Blanc blanc Bonnet
    voir aide
    Remarque : Dans C++, vous pouvez créer un tableau de valeurs TVarRec en utilisant la macro ARRAYOFCONST, définie dans sysopen.h.
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Points : 91
    Points
    91
    Par défaut
    Bonjour,

    ou le OnValidate du TField pour nettoyer les données si nécessaires !
    aurait tu un petit exemple ?

    Si j'ai un objet *pF de type TField
    ou implémenter la methode OnValidate() ?

    J'ai fait quelque recherche , j'ai vu dans le DBGrid
    le pb est qu'il n'y pas d’événement OnValidate

    Merci

    DjmSoftware,
    je te remercie je pensais que le remarque faite par ShaiLeTroll
    ce serait mieux d'utiliser ceci
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

Discussions similaires

  1. Réponses: 6
    Dernier message: 10/02/2006, 13h46
  2. [Oracle] Erreur ORA-00900 suite à certaines requêtes
    Par osmoze dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 13/01/2006, 17h43
  3. [SAX] Erreur de Parse suite à Erreur POI
    Par leminipouce dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 17/10/2005, 11h15
  4. Réponses: 13
    Dernier message: 14/10/2005, 11h01
  5. Réponses: 2
    Dernier message: 04/03/2003, 23h24

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