cs_saravana
Messages postés91Date d'inscriptionvendredi 25 mars 2005StatutMembreDernière intervention18 octobre 2007
-
2 avril 2006 à 18:13
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 2016
-
22 mars 2008 à 13:11
comment fait on pour utiliser la fonction case of... avec 3 cas, est il possible d'utiliser ces cas a la place d'un notifyevent(ex:button1.onclick:=1 et button2.onclick:=2)
merci bye;
f0xi
Messages postés4204Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202234 3 avril 2006 à 00:25
non non non non non et NON!
Case n'est pas une instruction de condition! c'est un switch! grosse difference!
IF ... THEN, WHILE ... DO, REPEAT ... UNTIL
ça ce sont des instructions conditionnelle attendant donc un retour Booléen (true ou false).
CASE .. OF determine un choix a selectionner (switch) selon un retour ordinal.
une valeur Ordinal est un chiffre allant de 0 a 255 (byte, char).
Case .. Of accepte egalement les ensembles et les types enumérés, car delphi les tris de maniere ordinale egalement.
par exemple :
j'ai une valeure entiere allant de 0 a 12.
selon ces valeurs je veux determiner des cas bien particulier.
plutot que d'ecrire des conditions (a retour booléen) j'ecrirais donc un switch (case) de cette maniere :
Case I of
0: {pour la valeur 0 : code}
1: begin {pour la valeur 1 code} end;
2,4: if {pour les valeurs 2 et 4 condition} then begin {et code} end;
3: {pour la valeur 3 code}
5..12: {pour les valeurs de 5 a 12 : code}
end;
avec les types enumérés et ensemble je peu egalement ecrire :
case Brush.Style of
bsClear : {code};
bsSolid : {code};
end;
et pour les caracteres :
case Ch of
'a'..'z' : {code pour les lettres de 'a' a 'z'};
'A'..'Z' : {code pour les lettres de 'A' a 'Z'};
'0'..'9' : {code pour les lettres de '0' a '9'};
'.',',' : {code pour les caracteres '.' et ','};
end;
a bien retenir, CASE n'est pas une condition, mais une selection.
sous PHP et C,C++ il existe egalement cette selection sous la denomination "switch" et fonctionant de la meme maniere que l'instruction CASE .. OF du pascal.
l'instruction ELSE presente dans l'instruction CASE ne correspond pas vraiment au meme ELSE qu'une instruction IF..THEN.
Dans IF..THEN, ELSE correspond a SINON.
Dans un CASE .. OF, il serait plus approchant du "Pour les autres choix non cités". bien sur, pour en faciliter la lecture et l'ecriture ELSE a ete utilisé.
C'est d'ailleur souvent pour cela qu'on confond le switch CASE..OF avec une condition booléene.
donc bien que l'exemple d'elguevel soit bon en tout point, il a comis une petite erreur en ecrivant "Case (condition) of" ...
il aurait du ecrire "Case (variable ordinale) of"
il serait faux d'ecrire :
case X = 2 of
par contre, comme un booléen peu etre considéré comme une valeur ordinale on peut donc switcher le retour et donc une condition peut etre mise sous cette forme :
case (x = 2) of
true :
false:
end;
mais un tel code n'est pas propre. on eviteras toujours de "switcher" un booléen, mieux vaut passer cette condition dans un if..then :
if (x = 2) then begin
end else begin
end;
bien qu'en assembleur le nombre d'instructions soit identique pour un if sur booléen ou un case sur booléen...
mais par soucis de convention, on passeras les booléens dans les conditions a retour booléen et les ordinaux dans les switchs.
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 3 avril 2006 à 01:57
Salut,
eh, franchement F0xi, tu devrais écrire des bouquins pour débutants.
Je trouve à chaque fois tes explications claires, nettes, précises et complètes
et en plus facile à comprendre.
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 3 avril 2006 à 09:10
salut,
petite rectification pour l'ordinal : c'est toute valeur unaire;
incluant l'int64 donc l'étendu n'est pas 0 à 255 mais
-2^63..2^63-1 il y a une petite différence!!
le case a été introduit pour simplifié l'écriture des suites de tests comme
if condition= valeur1 then
begin
end else
if condition=valeur2 then
begin
end else
.
.
.
if condition=valeurN then
begin
end;
dans sa tructure elle reprend ce qui ce fait en assembleur ou
l'on utilise une table de vecteurs et une liste de selecteurs (encore
que la Pascal ait introduit les ensembles bornés qui sont traités
différement en asssembleur) on cherche le N° du vecteur et on appelle
la routine à l'adresse contenue dans le vecteur. (redirection avec
retour)
Donc si l'on tient compte de cette structure il n'y a aucun intérêt à utiliser une instruction case si
le nombre de branchements est <3 et il vaut mieux dans ces cas
utiliser le IF THEN ELSE qui produira un code plus léger et plus
efficace.
de la même manière il vaut mieux placer en premier les actions les plus fréquemment utilisées (on diminue le nombre de tests)
Le fonctionnement des instructions Case du Pascal et switch du C est légèrement différent
en C si vous écrivez
switch (condition){
case 1 : action1;
break;
case 2 :action2
break;
}
ou
switch (condition){
case 1 : action1;
case 2 :action2
}
vous aurez 2 résultats différents
dans le premier cas si la condition 1 est rempli elle et elle seule
sera éxécutée quelque soit la valeur qu'elle prendra dans action1
(c'est le role du break qui oblige la sortie)
dans le second cas la condition est testée à chaque case ainsi si
condition = 1 au départ action1 sera exécutée si action 1 modifie le
valeur de la condition et qu'elle devient condition=2 alors action2
sera exécutée
d'autre part en C le switch n'admet pas les ensembles bornés
mis à part ces précisions,Foxi tes explications étaient parfaites
@+
jlen
Vous n’avez pas trouvé la réponse que vous recherchez ?
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 22 mars 2008 à 12:05
dans ton exemple Txt.Lines.Strings[9] est un scalaire
(9eme caractère de la chaine) pour utiliser le case of avec une
chaine entiere ce n'est pas possible effectivement l'instruction
case n'autorise que le types scalaires
on peut toutefois contourner le problème en créant une liste de chaine
dans une Tstringlist par exemple et récupérer l'itemIndex par
un IndexOf et l'utiliser comme paramètre du case.