Probleme avec la fonction length

Résolu
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 - 21 mai 2005 à 13:19
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 24 mai 2005 à 19:57
J'ai réalisé une fonction EstNumerique en m'inspirant d'une solution
que delphiprog avait donné dans un post, donc ne vous étonnez pas de ce
nom.



Je réalise sur une fiche un formulaire d'ajout d'un fournisseur et je
contrôle dans les edit si c'est du numérique ou du texte et dès fois
comme par exemple pour le code postal la longueur de la chaîne pour que
ce ne soit pas différent de 5, etc.



Et j'ai justement un problème avec la fonction length, voilà le code qui me pose problème :



=========================================================

...

if not EstNumerique(txtCodePostal.Text)=True or Length(txtCodePostal.text)<>5 then
...

=========================================================



Quand je veux compiler, le deboger de delphi s'arrête sur cette ligne
en me place le curseur entre le ">" et le "5" en me disant :
"Opérateur non applicable à ce type d'opérande".



Pour m'en sortir j'ai essayé de faire un "not Length(txtCodePostal.Text)=5" mais ça m'affiche le même message d'erreur.



Quelqu'un a t-il une idée pour me sortir de ce problème ? Merci d'avance.

14 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
21 mai 2005 à 13:43
if (not EstNumerique(txtCodePostal.Text)) or (Length(txtCodePostal.text)<>5) then

En Pascal, pour utiliser les opérateurs booléens encore faut-il que les opérandes soient eux-mêmes des booléens.

<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
<
3
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 1
21 mai 2005 à 13:55
merci delphiprog,



Le coup des paranthèses est magique c'était juste ça. Par contre pour
ma fonction EstNumerique et après réflexion je n'ai pas besoin du "not"
puisqu'elle me renvoie true ou false. J'ai un peu différé de votre
exemple dans un post en ce sens que j'ai pas tenté la conversion en
integer mais en currency.



Je pense que la fonction en elle-même sera plus parlante :



======================================

function EstNumerique(strTexte:String):boolean;

begin

Result:=True;

try

StrToCurr(strTexte);

except

Result:=False;

end;

end;
======================================


J'ai mis cette fonction dans une nouvelle unité. A mon sens le fait de
tenter la conversion en currency me permet de gérer la virgule.



Quel est votre avis ?



En tous les cas merci de votre aide et d'avoir poster cette fonction dans un autre post.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
21 mai 2005 à 14:03
Savais-tu qu'il existe déjà une fonction TryStrToCurr, déclarée dans SysUtils, renvoyant un booléen ?

<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
<
0
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 1
21 mai 2005 à 14:26
non mais maintenant oui et je vous en remercie
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
21 mai 2005 à 15:54
> informatixo



Quand tu dis :



"après réflexion je n'ai pas besoin du "not" puisqu'elle me renvoie true ou false"



Attention, c'est faux !



Pour que le String soit un code postal valide, il faut écrire :



if (not EstNumerique(txtCodePostal.Text)) or (Length(txtCodePostal.text) <> 5) then

// aucune des 2 conditions ne doit être fausse



ou alors :



if not((EstNumerique(txtCodePostal.Text)) and (Length(txtCodePostal.text) = 5)) then

// il ne faut pas qu'1 des 2 conditions soit vraie



Bonne prog'



japee
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
21 mai 2005 à 15:57
J'aurais dû écrire :



Pour que le String soit supposé être un code postal valide...



japee
0
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 1
22 mai 2005 à 22:45
Merci japee pour ces précisions.



Quand je disais que je n'avais pas besoin du "not" je voulais dire que
comme le résultat est un booléen, je peux me servir de True ou False.



ex : if (EstNumerique(txtCodePostal.Text)=False) or (Length(txtCodePostal.text)<>5) then


Je me suis moi aussi aperçu lors de mes tests que j'avais mal posées mes conditions.



En tout cas merci de cet intérêt et de cette aide



Ce forum est vraiment bien



A plus
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
22 mai 2005 à 23:43
Au risque d'avoir l'air d'insister, informatixo, voilà ce que je
voulais exprimer, avec un bout de code tourné de manière concrète et
amusante (?).



var

SoldeDeMonCompteBancaire: Byte; // (lol !)

DistanceConcessionnaireFerrari: LongWord;



// ce qui suit n'est pas terrible :



if (JeSuisPleinAuxAs(SoldeDeMonCompteBancaire) := True) and (DistanceConcessionnaireFerrari < 500) then

ShowMessage('Tiens, je pense que je vais m'offrir une Ferrari !');



// il vaut mieux coder ainsi :



if JeSuisPleinAuxAs(SoldeDeMonCompteBancaire) and (ConcessionnaireFerrari < 500) then

ShowMessage('je crois que je vais m'offrir une Ferrari');



// et pour tester le contraire, version pas terrible :



if (JeSuisPleinAuxAs(SoldeDeMonCompteBancaire) : = False) and (DistanceConcessionnaireFerrari > 500) then

ShowMessage('Je vais peut-être garder la Peugeot un an ou deux...');



// il vaut mieux faire :



if not (JeSuisPleinAuxAs(SoldeDeMonCompteBancaire)) and (DistanceConcessionnaireFerrari > 500) then

ShowMessage('Je vais peut-être garder la Peugeot un an ou deux...');



De même que, dans la vie, on ne dit pas "si ma tante en avait était vrai, je l'appellerais Tonton", mais "si ma tante en avait, je l'appellerais Tonton".



Ca permet de mieux coder, et d'envisager d'autres usages utiles des booléen, comme les basculeurs logiques.



Tiens, médite celle-là : "porte ouverte = pas porte ouverte", soit en code :



DoorIsOpen := not DoorIsOpen;



Ca n'ouvre pas quelques perspectives ?



Bonne prog'



japee
0
roud59 Messages postés 99 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 26 juillet 2007 2
23 mai 2005 à 11:04
Pour Jappee : je me permets un petit commentaire :


Le contraire de (A et B) est (non A) OU (non B). Tu aurais dû écrire

if (JeSuisPleinAuxAs(SoldeDeMonCompteBancaire) := False) ou (DistanceConcessionnaireFerrari > 500) then
ShowMessage('Je vais peut-être garder la Peugeot un an ou deux...');

Ce doit être une erreur de frappe de ta part.

Roud59
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
23 mai 2005 à 14:29
Oui, roud59, complètement d'accord !



Merci de nous l'avoir fait remarquer.



Il s'agit hélas d'une erreur d'inattention, car je me suis plus
intéressé au premier terme de la condition qui appuyait la
démonstration, en négligeant quelque peu la logique globale.



Heureusement que je programmais pas pour l'Agence Spatiale Européenne à
cette-heure là, je sais pas vers quoi on le dirigeait, le lanceur.

Sûr que sur Jupiter ils captaient Canal Satellite, mdr



Désolé si j'ai embrouillé les choses en pensant les clarifier...



Bonne prog'



japee
0
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 1
23 mai 2005 à 15:15
Merci à tous,



Je comprends mieux ce que tu voulais dire par l'utilisation du not.



Petite précision, mais je sais pas si elle est importante.



Tu utilise dans ton exemple le ":=" comme si tu affectais la valeur
booléenne à ta fonction alors que moi je comparais avec juste le "=".



Mais à l'avenir je vais obter pour la solution du not.



Merci
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
23 mai 2005 à 18:58
Exact, bien vu informatixo...



Décidément, j'ai fait pas mal d'erreurs d'inattention sur ce code,
j'étais pas loin d'aller dormir, c'est ce que j'aurais dû faire de
suite.

Quand même, je suis étonné d'avoir laissé passer tant d'erreurs, surtout que ma démarche se voulait "pédagogique".



Il faut bien sûr écrire :



if (JeSuisPleinAuxAs(SoldeDeMonCompteBancaire) = False)



et non pas :



<strike>if (JeSuisPleinAuxAs(SoldeDeMonCompteBancaire) := False)</strike>



Vraiment, j'étais pas en forme...



En fait, roud59, en regardant mieux mon code, je n'ai pas commis
l'erreur dont tu me fais le reproche, car dans les 2 dernières
propositions, j'ai inversé le sens de l'opérateur, et mis > 500 à la place de < 500 !



Mais j'admets que la 2ème condition est de toute manière ridicule et de nature à embrouiller,
car si tu as les moyens de te payer une Ferrari et que tu aimes ça, tu
vas sans doute parcourir les 1000 km qui te séparent du plus proche
concessionnaire. Quand à l'entretien, je suppose que le mécano vient
réparer sur site, au besoin ????

Sinon tu achètes la "Revue Technique", mdr, et tu mets le mains dans le cambouis.



Bonne prog', faut pas mollir pour si peu, diantre !



japee
0
roud59 Messages postés 99 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 26 juillet 2007 2
24 mai 2005 à 16:53
Japee : la petite erreur d'inatention ne concerne pas l'opérateur (j'ai remarqué l'inversion de la comparaison qui équivaut à la négation) mais le AND qui doit être transformé en OR. Une telle erreur arrive à tout le monde; mais tout le monde n'est pas capable comme toi d'animer ce forum avec des exemples simples, concrets et amusants, et ça c'est important!

Roud59
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
24 mai 2005 à 19:57
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient
.

Nous avons déjà eu l'occasion de féliciter Japee pour ses talents de pédagogue. Quand il allie l'humour à la programmation, il est impayable. Un vrai plaisir à lire ce Japee

<
0
Rejoignez-nous