ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 11 févr. 2006 à 23:50
A noter que la deuxième solution est préférable en quelque sorte (à condition qu'elle soit réalisée juste avant tout traitement de la valeur entrée, si possible dans la même procédure) car avec la première, aussi complète soit-elle, il persiste une faille : celle du "collage" de texte à partir du presse-papiers...
On y pense pas souvent, mais cela peut être la source de nombreuses erreurs !
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 12 févr. 2006 à 23:19
j'avais fait une petite fonction bete et idiote qui permet de filtrer rapidement un entier saisi :
function IsValidInt(const value : string) : boolean;
var x : integer;
begin
result := false;
for x := 1 to length(value) do if not (value[x] in ['0'..'9']) then exit;
result := true;
end;
la meme pour les flottants :
function IsValidFloat(const value : string) : boolean;
var x : integer;
begin
result := false;
for x := 1 to length(value) do if not (value[x] in ['0'..'9','.',',']) then exit;
result := true;
end;
a placer dans le onchange du edit, exemple :
if IsValidInt(Edit1.Text) then
edit1.font.color := clblue
else
edit1.font.color := clred;
si la valeur doit etre un entier/flottant positif il y'a une meilleure alternative :
if StrToIntDef(edit1.text,-1) = -1 then showmessage('vous devez entrer un entier positif');
if StrToFloatDef(edit1.text,-1) = -1 then showmessage('vous devez entrer un flottant positif');
<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 13 févr. 2006 à 00:30
Attention fOxi, il y a une erreur aussi si la chaîne envoyée en paramètre est vide ! Il y aura une erreur aussi si la chaîne traitée par la fonction est telle que '12,35,6' : ton code la reconnaîtra quand même comme un flottant valide, malgré les deux virgules présentes !
Voici un exemple d'amélioration de ta fonction de validification des nombres flottants qui accepte aussi les flottants négatifs :
function IsValidFloat(const value : string) : boolean;
var x : integer;
begin result := false; // On initialise le résultat à false
if length(value) =0 then exit; // Test de chaîne vide...
if (value[1]= '-') and (length(value) =1) then exit; // Si le nombre est '-' il n'est pas considéré comme valide.
if Pos('-', Copy(value, 2, length(value))) <> 0 then exit; // Si il y a un deuxième signe moins quelque-part dans le nombre, on arrête.
for x := 1 to length(value) do begin // On parcours tous les caractères...
if value[x] =DecimalSeparator thenif Pos(DecimalSeparator, Copy(value, x+1, length(value))) <> 0 then exit; // Si on trouve un séparateur décimal, on vérifie qu'il n'y en a pas un deuxième après
if not (value[x] in ['0'..'9',DecimalSeparator]) then exit; // Test des caractères valides...
end; result := true; // Si on en arrive là, c'est que tous les tests ont réussi !
end ;
[A noter que la variable DecimalSeparator, directement utilisable, contient le séparateur décimal par défaut en vigueur sur l'ordinateur]
Il est bien sûr plus facile d'utiliser la fonction StrToFloatDef si l'on sait par avance que le flottant devra être positif !
Ce code illustre une manière de procéder... Ce n'est sans doute pas la seule, donc si il y a des choses à rajouter ou à modifier, n'hésitez pas à faire des suggestions !
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 13 févr. 2006 à 00:35
Sans oublier que la gestion des erreurs de transtypage est beaucoup beaucoup plus efficace...
J'ai simplement réalisé ce code à titre d'information, mais j'encourage l'utilisation de la méthode avancée par jlen100 sur ce point
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 13 févr. 2006 à 21:02
oui c'est ce que j'expliquais dans le post mais il a été scratché à l'envoi.
l'exception étant valable pour tout les types de conververtion on doit
pouvoir l'utiliser de la même façon lors de la convertion.
on peut également l'intégrer dans la fonction (en test final) et
renvoyer false si la conversion echoue en mettant éventuellement l'edit
à 0. ou un message du genre:
"Messieurs vous avez copié un virus qui n'est pas un nombre! Vous
avez 10 secondes pour effacer cette saisie avant destruction du PC...."