Probleme avec la fonction length [Résolu]

informatixo 133 Messages postés mercredi 4 février 2004Date d'inscription 25 juillet 2012 Dernière intervention - 21 mai 2005 à 13:19 - Dernière réponse : cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

14 réponses

cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 21 mai 2005 à 13:43
+3
Utile
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.
<
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Delphiprog
informatixo 133 Messages postés mercredi 4 février 2004Date d'inscription 25 juillet 2012 Dernière intervention - 21 mai 2005 à 13:55
0
Utile
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.
Commenter la réponse de informatixo
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 21 mai 2005 à 14:03
0
Utile
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.
<
Commenter la réponse de cs_Delphiprog
informatixo 133 Messages postés mercredi 4 février 2004Date d'inscription 25 juillet 2012 Dernière intervention - 21 mai 2005 à 14:26
0
Utile
non mais maintenant oui et je vous en remercie
Commenter la réponse de informatixo
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 21 mai 2005 à 15:54
0
Utile
> 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
Commenter la réponse de japee
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 21 mai 2005 à 15:57
0
Utile
J'aurais dû écrire :



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



japee
Commenter la réponse de japee
informatixo 133 Messages postés mercredi 4 février 2004Date d'inscription 25 juillet 2012 Dernière intervention - 22 mai 2005 à 22:45
0
Utile
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
Commenter la réponse de informatixo
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 22 mai 2005 à 23:43
0
Utile
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
Commenter la réponse de japee
roud59 103 Messages postés jeudi 16 septembre 2004Date d'inscription 26 juillet 2007 Dernière intervention - 23 mai 2005 à 11:04
0
Utile
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
Commenter la réponse de roud59
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 23 mai 2005 à 14:29
0
Utile
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
Commenter la réponse de japee
informatixo 133 Messages postés mercredi 4 février 2004Date d'inscription 25 juillet 2012 Dernière intervention - 23 mai 2005 à 15:15
0
Utile
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
Commenter la réponse de informatixo
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 23 mai 2005 à 18:58
0
Utile
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
Commenter la réponse de japee
roud59 103 Messages postés jeudi 16 septembre 2004Date d'inscription 26 juillet 2007 Dernière intervention - 24 mai 2005 à 16:53
0
Utile
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
Commenter la réponse de roud59
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 24 mai 2005 à 19:57
0
Utile
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

<
Commenter la réponse de cs_Delphiprog

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.