Précédent   Forum du club des développeurs et IT Pro > C et C++ > Outils pour C & C++ > C++Builder
C++Builder Environnement de développement RAD C++Builder. Avant de poster -> F.A.Q C++Builder, Sources C++Builder
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 26/10/2012, 02h42   #1
o_live
Membre du Club
 
Inscription : juin 2002
Messages : 206
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 206
Points : 40
Points : 40
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

Citation:
[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
o_live est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 10h01   #2
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 261
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

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

Informations forums :
Inscription : juillet 2006
Messages : 9 261
Points : 13 373
Points : 13 373
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

Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 11h03   #3
o_live
Membre du Club
 
Inscription : juin 2002
Messages : 206
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 206
Points : 40
Points : 40
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
o_live est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 14h43   #4
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 261
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

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

Informations forums :
Inscription : juillet 2006
Messages : 9 261
Points : 13 373
Points : 13 373
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

Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 15h20   #5
o_live
Membre du Club
 
Inscription : juin 2002
Messages : 206
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 206
Points : 40
Points : 40
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
o_live est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 17h42   #6
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 261
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

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

Informations forums :
Inscription : juillet 2006
Messages : 9 261
Points : 13 373
Points : 13 373
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

Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 17h49   #7
DjmSoftware
Rédacteur/Modérateur
 
Avatar de DjmSoftware
 
Homme
Responsable de projet fonctionnel
Inscription : mars 2002
Messages : 633
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

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

Informations forums :
Inscription : mars 2002
Messages : 633
Points : 1 522
Points : 1 522
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
DjmSoftware est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 20h08   #8
o_live
Membre du Club
 
Inscription : juin 2002
Messages : 206
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 206
Points : 40
Points : 40
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
o_live est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2012, 03h06   #9
o_live
Membre du Club
 
Inscription : juin 2002
Messages : 206
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 206
Points : 40
Points : 40
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
o_live est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2012, 14h59   #10
o_live
Membre du Club
 
Inscription : juin 2002
Messages : 206
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 206
Points : 40
Points : 40
Citation:
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
o_live est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2012, 08h51   #11
DjmSoftware
Rédacteur/Modérateur
 
Avatar de DjmSoftware
 
Homme
Responsable de projet fonctionnel
Inscription : mars 2002
Messages : 633
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

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

Informations forums :
Inscription : mars 2002
Messages : 633
Points : 1 522
Points : 1 522
Salut
a mon humble avis c'est bonnet Blanc blanc Bonnet
voir aide
Citation:
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
DjmSoftware est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2012, 19h23   #12
o_live
Membre du Club
 
Inscription : juin 2002
Messages : 206
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 206
Points : 40
Points : 40
Bonjour,

Citation:
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
o_live est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h27.


 
 
 
 
Partenaires

Hébergement Web