Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  1. #1
    Membre du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 47
    Points
    47

    Par défaut Erreur de compliation suite a un type

    Bonsoir,
    j'ai un structure défini comme ceci

    Code :
    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 :
    (pStPers->NOM==NULL)? DataModule1->CDSPers->FieldByName("NOM")->AsString:" ";
    même erreur ici

    Code :
    (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 Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 043
    Points : 14 245
    Points
    14 245

    Par défaut

    Evite la comparaison à NULL pour un AnsiString, utilise IsEmpty() ou la comparaison à EmptyStr

    Code :
    (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 :
    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 :
    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 :
    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 du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 47
    Points
    47

    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 :
    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 :
    (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 :
    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 :
    (<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 Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 043
    Points : 14 245
    Points
    14 245

    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 :
    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 :
    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 :
    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 du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 47
    Points
    47

    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 :
    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 Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 043
    Points : 14 245
    Points
    14 245

    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
    Rédacteur/Modérateur
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    mars 2002
    Messages
    666
    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 : 666
    Points : 1 543
    Points
    1 543

    Par défaut

    Salut
    Concernant ta structure en C++ on préfère travailler avec des class
    la syntaxe sera donc la suivante
    Code :
    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
    A lire : Les règles du forum

  8. #8
    Membre du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 47
    Points
    47

    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 du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 47
    Points
    47

    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 du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 47
    Points
    47

    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 :
    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
    Rédacteur/Modérateur
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    mars 2002
    Messages
    666
    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 : 666
    Points : 1 543
    Points
    1 543

    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
    A lire : Les règles du forum

  12. #12
    Membre du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 47
    Points
    47

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •