Utiliser les cas en delphi [Résolu]

Signaler
Messages postés
91
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
18 octobre 2007
-
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
-
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;

9 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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.

voila.

Messages postés
718
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
3
C'est expliqué dans la doc. et çà se trouve de partout, mais petit exemple quand même :

Case ( condition ) of
0 : Action pour choix Zero;
1 : Action pour choix Un;
else Autre choix pas cité dans les cas precedent;
end; // Fin du Choix

++

ElGuevel.
Messages postés
3825
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 février 2021
38
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.

Bravo je donne 10/10
euh non c'est pas ici domage

@+
Cirec
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
11
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
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
oui jlen! merci pour cette correction! j'ai confondus avec les ensembles ... ça arrive.

vus qu'on peu faire un case :

case I of
1..1000 : ...
1001..2000 : ...
end;

Messages postés
718
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
3
:-| hé bé ...

je repondais juste à "comment fait on pour utiliser la fonction case of... avec 3 cas" c'est tout .. lol

mais c'est vrai que là ta tout détaillé ...

++
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Bonjour,
il est donc impossible d'utiliser case ... of pour des chaînes de caractères ? :(

genre : 

case Txt.Lines.Strings[9] of
'Propos1': (Code)
'Propos2': (Code)
...

?
Dommage si ca ne l'est pas :s

Cordialement, Bacterius !
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
11
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.

jlen
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Bonjour,
Ok merci :p

Cordialement, Bacterius !