Quand faut y aller, faut y aller, mais là au moins on commence par du facile, je prends la fonction existante:
function frouge(x) {rr=x.value; dechexa(rr,vv,bb); rouge=rr; refresh();}
et je la modifie comme ça:
function frouge(x)
{
if (parseInt(x.value)!=x.value) {return false} // Pas un nombre
if (x.value<0 || x.value>255) // Erreur si hors limites
{
alert('Erreur:\n
Le nombre doit être compris entre 0 (noir) et 255 (rouge maximum)');
return false;
}
rr=x.value; // Pas de changement
dechexa(rr,vv,bb); // Pas de changement
rouge=rr; // Pas de changement
refresh(); // Pas de changement
return true; // OK on l'accepte
}
On modifie fvert et fbleu de la même façon sans oublier de changer les couleurs.
Et on attaque avec fcode qui s'écrivait précédemment:
function fcode(x) {cd=x.value; hexadec(cd); rr=rouge; vv=vert; bb=bleu; refresh();}
et qui devient:
function fcode(x)
{
if (x.value.charAt(0)!="#") // Manque "#" en premier
{
alert('Le premier caractère du code doit être: \"#\"');
return false;
}
if (x.value.length!=7) // Pas sept caractères
{
alert('Erreur:\n
Le format du code est: \"#rrvvbb\" rr=rouge, vv=vert, bb=bleu.\n
La valeur est à donner en hexadécimal (00 à FF).');
return false;
}
z='#'; // Initialise le nouveau code
for (y=1;y<7;y++) // Boucle de 1 à 6
{
if (parseInt(x.value.charAt(y))==x.value.charAt(y)) // Nombre ?
{
z=z+x.value.charAt(y); // Oui, on concatène au code
}else // Pas un nombre
{
if (x.value.charAt(y)>='A' && x.value.charAt(y)<='F') // Lettre A à F ?
{
z=z+x.value.charAt(y); // Oui, on concatène au code
}else // Pas lettre A-F
{
if (x.value.charAt(y)>='a' && x.value.charAt(y)<='f')// Lettre a à f ?
{
z=z+hexa.charAt(10+"abcdef".indexOf(x.value.charAt(y))); // voir note
}else // Alors c'est une erreur
{
break; // Pas la peine de continuer
}
}
}
}
if (y<7) // Boucle pas finie ?
{
alert('Erreur:\n
Le format du code est: \"#rrvvbb\" rr=rouge, vv=vert, bb=bleu.\n
La valeur est à donner en hexadécimal (00 à FF).');
return false;
}
x.value=z; // Nouveau code dans ancien
cd=x.value; // Pas de changement
hexadec(cd); // Pas de changement
rr=rouge; // Pas de changement
vv=vert; // Pas de changement
bb=bleu; // Pas de changement
refresh(); // Pas de changement
return true; // Fin normale de la routine
}
Note: Comme j'ai utilisé quelques finesses de pro dans cette routine, je me sens obligé de vous donner encore quelques explications.
Les valeurs de la boucle for: on part du deuxième caractère du code avec y=1 (le premier est en position 0) et on boucle TANT QUE l'on a pas atteint la 8ième position avec y<7 (0 à 7 ça fait 8), pour les détails retournez voir les boucles.
On teste d'abord si c'est un nombre, puis si c'est une majuscule, et enfin si c'est une minuscule, et là, problème, la méthode .toUpperCase() me fait un caca nerveux, impossible de l'utiliser sur trois navigateurs différents. Crotte alors, je m'en passe et je fabrique moi même ma propre fonction miracle qui marche comme ça:
On cherche la position du caractère dans la chaîne "abcdef", puis on prends le caractère correspondant dans la chaîne "hexa", comme celle-ci comprend en outre les dix premiers chiffres, il suffit d'ajouter 10 à la position trouvée...
Et enfin l'astuce, en cas d'erreur la méthode habituelle consiste à mettre dans une variable une indication d'erreur que l'on teste plus loin, ici on casse la baraque avec un break qui sert deux buts, premièrement et surtout arrêter la boucle (qui aurait pu être très longue), et deuxièmenent à limiter la valeur de la variable de comptage, en effet, si la boucle se termine, la variable y contient 7, dans le cas d'une erreur et même sur le dernier caractère, cette valeur sera plus petite que 7 et on utilise cette propriété dans la suite du programme.
Il ne faut pas oublier non plus de remettre le nouveau code en place dans la bonne variable et c'est fini.
|