TABLEAU PERIDOQUES

Signaler
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
-
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
-
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

Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
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é ;)
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
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 ;)
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
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
"
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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.
Messages postés
44
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 septembre 2008

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
Messages postés
44
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 septembre 2008

c bon jai lu sur budget merci
Messages postés
44
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 septembre 2008

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
Messages postés
44
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 septembre 2008

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
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
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
Messages postés
44
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 septembre 2008

alors combien /10 ma source maintenant
Messages postés
44
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 septembre 2008

merci c exactement sa que je voulai
Messages postés
44
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 septembre 2008

merci je vais essayer sa
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
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"
...
Messages postés
44
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 septembre 2008

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
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
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]
Messages postés
44
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 septembre 2008

deolser voila le dossier complet
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
Form1.frm manquant