TABLEAU PERIDOQUES

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 20 juin 2008 à 15:40
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 4 juil. 2008 à 21:55
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47072-tableau-peridoques

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
4 juil. 2008 à 21:55
Euh... oui, tu as raison, au sujet de la virgule, je raisonnais comme un algorithme de recherche... Il reste qu'au niveau ressource, est-ce qu'un CHOOSE prend autant de ressource qu'un ARRAY ?... mystère, donc...

Amicalement,
Us.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
2 juil. 2008 à 22:40
pas d'asm, je ne saurai te dire avec certitude.

mais de logique :
lors de la compilation, le type PARAMARRAY (qui n'existe pas en réalité) devient un tableau de variant à dimension fixe.

1) çà me paraît "normal" mais je ne peux pas vérifier
2) je ne vois absolument pas comment VB (compilé) pourrait lire entre les virgules, elles n'existent pas en réalité ;)
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
2 juil. 2008 à 22:06
Dans le fond, nous sommes d'accord... Sur la forme, un peu moins...

Je m'explique pour la fonction CHOOSE.

Bien sur, il faut pouvoir boucler dedans... mais il y a-t-il vraiment un stockage des données dans un tableau, où seulement un repérage de l'emplacement de la donnée ?

En d'autres termes, est-ce que CHOOSE fonctionne avec les étapes suivantes :
- Lecture et stockage de l'ensemble des données,
- puis répérage le l'indice correspondant (Index dans le code),
- enfin, Renvoi de la donnée.

OU

- Repérage des données (grâce à la virgule),
- Si pas le bon indice => continu,
- Arrivé au bon indice => renvoi de la donnée.

Dans le 1er cas, c'est un schéma qui fonctionne comme un Array, dans le 2ième, c'est bien différent...

Maintenant, seul l'étude du code compilé en assembleur pourrait le dire... enfin, voilà pourquoi je pense que Choose est plus adaptée, car je penche pour la seconde solution... je me trompe peut-être...

Néanmoins, il reste que dans l'absolu, l'emploi de l'array est gourmand aussi, puisqu'on stoque toutes les données en permamence. L'emploi de Choose, dans le cas où elle fonctionne comme un Array, doit détruire le tableau après utilisation...

Il est certain que pour 107 données, y'a pas de quoi s'affoler non plus... mais n'empêche dans une autre situation avec plus de données est-ce que Choose serait mieux qu'une Array...

Amicalement,
Us.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
2 juil. 2008 à 21:31
un tableau de variant par
dim a1 as variant '<- en partie 'déclaration'
a1=array("Hydrogène", "Helium", "Lithium", "Béryllium", ...

irait oui.

par contre ici tu passes forcément par un tableau, qui est un moment donné "stoqué". il faut bien boucler dedans...

tu pourrais aussi bien faire :
Nom.Caption = split("Hydrogène||Helium||Lithium||Béryllium||...","||)(index)

là on se rend bien plus facilement compte du travail 'inutile' (en ressources), c'est pourtant kifkif ;)
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
2 juil. 2008 à 21:08
Euh... non... je ne suis pas certain d'être d'accord... CHOOSE n'est pas tout à fait comme un ARRAY... non ? Il me semble pas que CHOOSE stock les données dans un tableau... même si les données sont bien en type Variant...

En terme de nb de ligne... ben, ce que je propose est le plus court... c'est une évidence. C'est d'ailleurs une équivalence de ce que tu dis au sujet du tableau indicé de 0 à 107... puisque c'est faire un ARRAY à la place de CHOOSE...

... et donc le mettre dans un LOAD, est justifié si c'est un tableau, mais pas nécessaire avec CHOOSE, selon moi...

Amicalement,
Us.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
2 juil. 2008 à 20:27
ouh que c'est gourmand de créer un tableau de variants à chaque click...

autant le créer une seule fois au load et utiliser juste '= tableau1v(index)'
ce que je proposais au départ donc ;)

"
soit par exemple un TABLEAU, indexé de 0 à 107, qui va contenir ces infos
soit de nouveau dans ton évènement Click, tu vas appeler CCE_u mais en lui passant tes 3 paramètres...

la première solution est la plus rapide à mettre en place, et la moins couteuse en nombre de lignes
"
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
2 juil. 2008 à 19:45
Bonjour,

On pourrait aussi faire encore autrement et plus direct en utilisant la fonction Choose, qui ici est bien adaptée...

Voici le listing que cela donne :

=

Option Explicit
Private Sub Elements_Click(Index As Integer)

Zatomique.Caption = Str(Index)
Symbole.Caption = Elements(Index).Caption
Nom.Caption = Choose(Index, "Hydrogène", "Helium", "Lithium", "Béryllium", _
"Bore", "Carbone", "Azote", "Oxygène", "Fluor", _
"Néon", "Sodium", "Magnésium", "Aluminium", "Silicium", _
"Phosphore", "Soufre", "Chlore", "Argon", "Potassium", _
"Calcium", "Scandium", "Titane", "Vanadium", "Chrome", _
"Manganèse", "Fer", "Cobalt", "Nickel", "Cuivre", "Zinc", _
"Gallium", "Germanium", "Arsenic", "Sélénium", "Brome", _
"Krypton", "Rubidium", "Strontium", "Yttrium", "Zirconium", _
"Niobium", "Molybdène", "Technétium", "Ruthénium", "Rhodium", _
"Palladium", "Argent", "Cadmium", "Indium", "Étain", _
"Antimoine", "Tellure", "Iode", "Xénon", "Césium", "Baryum", _
"Lanthane", "Cérium", "Praséodyme", "Néodyme", "Prométhium", _
"Samarium", "Europium", "Gadolinium", "Terbium", "Dysprosium", _
"Holmium", "Erbium", "Thulium", "Ytterbium", "Lutétium", _
"Hafnium", "Tantale", "Tungstène", "Rhénium", "Osmium", _
"Iridium", "Platine", "Or", "Mercure", "Thallium", "Plomb", _
"Bismuth", "Polonium", "Astate", "Radon", "Francium", "Radium", _
"Actinium", "Thorium", "Protactinium", "Uranium", "Neptunium", _
"Plutonium", "Américium", "Curium", "Berkélium", "Californium", _
"Einsteinium", "Fermium", "Mendélévium", "Nobélium", "Lawrencium", _
"Rutherfordium", "Dubnium", "Seaborgium", "Bohrium", "Hassium", _
"Meintnerium", "Ununnilium", "Unununium", "Ununbium")

Gmolatomique.Caption = Choose(Index, 1#, 4#, 6.9, 9#, 10.8, 12#, 14#, 16#, 19#, 20.2, 23#, 24.3, _
27#, 28.1, 31#, 32.1, 35.5, 39.9, 39.1, 40.1, 45#, 47.9, 50.9, _
52#, 54.9, 55.8, 58.9, 58.7, 63.5, 65.4, 69.7, 72.6, 74.9, 79#, _
79.9, 83.8, 86.5, 87.6, 88.9, 91.2, 92.9, 95.9, 98, 101.1, 102.9, _
106.4, 107.9, 112.4, 114.8, 118.7, 121.8, 127.6, 126.9, 131.3, _
132.9, 137.3, 138.9, 140.1, 140.9, 144.2, 145, 150.4, 152#, 157.3, _
158.9, 162.5, 164.9, 167.3, 168.9, 173#, 175#, 178.5, 180.9, 183.9, _
186.2, 190.2, 192.2, 195.1, 197#, 200.6, 204.4, 207.2, 209#, 209, _
210, 222, 223, 226, 227, 232.2, 231, 238#, 237, 244, 243, 247, 247, _
251, 252, 257, 258, 259, 260, 261, 262, 263, 262, 265, 266, 269, _
"???", 277)

Select Case Index
Case 58 To 71: Familly.Caption = "lanthanides"
Case 90 To 103: Familly.Caption = "actinides"
Case 3, 11, 19, 37, 55, 87: Familly.Caption = "alcalins"
Case 4, 12, 20, 38, 56, 88: Familly.Caption = "alcalino-terreux"
Case 9, 17, 35, 53, 85: Familly.Caption = "halogènes"
Case 2, 10, 18, 36, 54, 86: Familly.Caption = "gaz nobles (ou gaz rares)"
Case Else: Familly.Caption = "(Autres éléments)"
End Select

Select Case Index
Case 1, 2: CCE.Caption = "(K)" & CStr(Index)
Case 3 To 10: CCE.Caption = "(K)2 (L)" & CStr(Index - 2)
Case 11 To 18: CCE.Caption = "(K)2 (L)8 (M)" & CStr(Index - 10)
Case 19 To 36: CCE.Caption = "(K)2 (L)8 (M)8 (N)" & CStr(Index - 18)
Case 37 To 54: CCE.Caption = "(K)2 (L)8 (M)8 (N)18 (O)" & CStr(Index - 36)
Case 55 To 86: CCE.Caption = "(K)2 (L)8 (M)8 (N)18 (O)18 (P)" & CStr(Index - 54)
Case 87 To 112: CCE.Caption = "(K)2 (L)8 (M)8 (N)18 (O)18 (P)32 (Q)" & CStr(Index - 86)
End Select

End Sub
Private Sub Form_Load()
Elements_Click (1)
End Sub

=

Il reste à complèter avec d'autres renseignements... voir ouvrir une fenêtre à chaque click pour avoir une fiche d'identité complète...

La présentation est simple, mais propre... un p'tit 8/10 d'encouragement.

Amicalement,
Us.
HariSeldon69210 Messages postés 44 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 septembre 2008
27 juin 2008 à 20:26
salut je suis en train de progresser doucement mais surement
je sais mettre une fenetre tjr o premier plan par un code trouver sur ce magnifique site mais je ne comprend pas tous
dans la declaration avec le user32.dll
mais sa viendra
sinon a tu un conseil a me donner merci pcpt
HariSeldon69210 Messages postés 44 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 septembre 2008
25 juin 2008 à 16:24
c bon jai lu sur budget merci
HariSeldon69210 Messages postés 44 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 septembre 2008
25 juin 2008 à 14:18
voila derniere modif jespere pour ce prog
au faite jai mis option explicit mais a par a dir si des variable ne sont pa declarer a quoi sa serre. merci
HariSeldon69210 Messages postés 44 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 septembre 2008
25 juin 2008 à 14:10
merci je continue donc de le modifier pour quil soit convenable pour quelqun de ton niv sinon pe tu menvoyer des liens de vbfrance ou je pourai apprendre des truc de mon niv pour progresser. pe etre qun jour je serai o meme niv que toi.
merci pour tous
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
25 juin 2008 à 12:45
tu ne t'y retrouves pas mieux?
passer de 1000 lignes à moins de 150, que demande le peuple :)

quelques bricoles encore...
manque "option explicit"

"Private Sub CCE_u(ByVal Nomination, ByVal Massmolaire)"
Nomination et Massmolaire ne sont pas typées (as string)Zatomique.Caption Index, index interger, caption = string...
Labels non nommés, idem pour d'autres contrôles mais tu as tenu compte de presque toutes mes remarques, bien

bon courage pour la suite
HariSeldon69210 Messages postés 44 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 septembre 2008
25 juin 2008 à 12:06
alors combien /10 ma source maintenant
HariSeldon69210 Messages postés 44 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 septembre 2008
23 juin 2008 à 14:43
merci c exactement sa que je voulai
HariSeldon69210 Messages postés 44 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 septembre 2008
23 juin 2008 à 14:39
merci je vais essayer sa
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
22 juin 2008 à 19:49
désolé je ne comprends pas ce que tu demandes....
CASE tu parles bien du SELECT CASE
si 1 (donc Zatomique.Caption="1"), tu peux éventuellement passer par une 2e procédure

du genre... (je n'ai plus ton code sous les yeux)

Sub SetLabels(ByVal sVal1$, ByVal sVal2$, ByVal sVal3$, ByVal sVal4$)
Label1.Caption = sVal1
Label35.Caption = sVal2
Lbl_Nomme.Caption = sVal3 Me.Caption "Dernière valeur " & sVal4
End Sub

et comme çà tu as tes :
Select Case ZVal
case 1 : SetLabels "hydrogene","h","1","1.0"
case 2 : SetLabels "helium","he","2","4.0"
...
HariSeldon69210 Messages postés 44 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 septembre 2008
22 juin 2008 à 19:32
merci jai du mal a comprendre mais sa va venir.
sinon je voudrai faire un tableau ou
dans la case 1 je met "hydrogene","h","1","1.0"
dans la 2 "helium","he","2","4.0" ...

et que les variabel nom , num par exeple puisse reagir
avec la case 1 (par exemple) et me donne nom = "hydrogene"
en gros merci de maider je ne trouve pa la solution
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 juin 2008 à 17:44
salut,
j'ai été un peu sec sur ton autre source, on va essayer d'être plus constructif sur celle-ci :

*il faut prendre le réflexe de déclarer/nommer/typer correctement ses variables.
pour être certain de ne pas oublier, toujours écrire en toute première ligne "option explicit".
çà te permet d'avoir un message d'erreur en cas d'oubli de déclaration
nb : cette ligne pour aussi s'écrire toute seule : outils > option > Editeur > déclaration des variables obligatoire

*nomme bien tous tes contrôles. Command35 n'est pas clair !

*ton code fait environ 1000 lignes, pour une procédure de 50 lignes, et le reste est plus ou moins le même code pour chacun de tes 109 boutons !
en VB6 tu as la propriété INDEX, qui te permets de créer un groupe de contrôles.
çà te permet ainsi de n'avoir qu'une seule procédure/évènement Command1_Click, avec l'argument INDEX en paramètre
qu'est-ce que çà te ferait gagner ici?

regardons le code des boutons :

Private Sub Command99_Click()
Symbole.Caption = "" + "Cm"
Nom.Caption = "" + "Curium"
Zatomique.Caption = "" + "96"
Gmolatomique.Caption = "" + "247"
CCE_u
End Sub

*Symbole.Caption = "" + "Cm"
tous tes boutons contiennent déjà la bonne chaine (CM ici)
donc tu gagnes déjà une ligne (* 108)

de plus ici niveau syntaxe, pas besoin de commencer par ""
et en VB on concatère 2 chaînes par "&", et non "+"

> on a donc alors "Symbole.Caption Cmd_Periode(Index).Caption"

*CCE_u
tu appeles toujours la même procédure, elle ne sera donc écrite qu'une seule fois ;)

* Nom.Caption = "" + "Curium"
Zatomique.Caption = "" + "96"
Gmolatomique.Caption = "" + "247"

ici c'est un peu différent. tu as des valeurs différentes à chaque bouton.
plusieurs solution s'offrent alors à toi :
soit par exemple un TABLEAU, indexé de 0 à 107, qui va contenir ces infos
soit de nouveau dans ton évènement Click, tu vas appeler CCE_u mais en lui passant tes 3 paramètres...

la première solution est la plus rapide à mettre en place, et la moins couteuse en nombre de lignes

*If Zatomique.Caption = 1
même si VB ne râle pas, 1 est un integer, Caption est un stringtu ne dois pas comparer chaine numérique> "If Zatomique.Caption = 1"

*
End If
If Zatomique.Caption = 2
pas besoin de quitter un IF et de vérifier ensuite si 2 (ou "2")
si c'était TRUE avant (donc = "1"), tous les tests après sont inutiles

dans ce cas tu peux utiliser le SELECT CASE
et pour pouvoir considérer la chaine comme une valeur, on utilisera VAL()

=> procédure CCE_u complète :

Private Sub CCE_u()
Dim ZVal As Long: ZVal = Val(Zatomique.Caption)

Select Case ZVal
Case 1, 2: CCE.Caption = "(K)" & CStr(ZVal)
Case 3 To 10: CCE.Caption = "(K)2 (L)" & CStr(ZVal - 2)
Case 11 To 18: CCE.Caption = "(K)2 (L)8 (M)" & CStr(ZVal - 10)
Case 19 To 36: CCE.Caption = "(K)2 (L)8 (M)8 (N)" & CStr(ZVal - 18)
Case 37 To 54: CCE.Caption = "(K)2 (L)8 (M)8 (N)18 (O)" & CStr(ZVal - 36)
Case 55 To 86: CCE.Caption = "(K)2 (L)8 (M)8 (N)18 (O)18 (P)" & CStr(ZVal - 54)
Case 87 To 112: CCE.Caption = "(K)2 (L)8 (M)8 (N)18 (O)18 (P)32 (Q)" & CStr(ZVal - 86)
End Select

Select Case ZVal
Case 58 To 71: Label15.Caption = "Lanthanides"
Case 90 To 103: Label15.Caption = "Actinides"
Case 3, 11, 19, 37, 55, 87: Label15.Caption = "Alcalins"
Case 4, 12, 20, 38, 56, 88: Label15.Caption = "Alcalino-terreux"
Case 9, 17, 35, 53, 85: Label15.Caption = "Halogènes"
Case 2, 10, 18, 36, 54, 86: Label15.Caption = "Gaz nobles (ou Gaz rares)"
Case Else: Label15.Caption = "Autres éléments"
End Select
End Sub

c'est pas un peu plus lisible? ;)

bon courage
PCPT [AFCK]
HariSeldon69210 Messages postés 44 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 septembre 2008
20 juin 2008 à 17:15
deolser voila le dossier complet
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
20 juin 2008 à 15:40
Form1.frm manquant
Rejoignez-nous