Je suis débutant, mais comme je m'inspire de codes trouvés ici et là, je rend ici, un peu de mes cogitations...
Ce programme etait initialement prévu pour m'entrainer a utiliser les combos/listes et l'utilisation d'un fichier de stockage pour mes données.
Il peut etre utilisé pour les jeux de role Space-Op afin de calculer les distances entre deux systemes stellaires...
Le code n'est pas finalisé, mais si vous avez de bonnes idées d'amélioration je suis toujours preneur
► Afficher le texte
Code : Tout sélectionner
#cs programme de calcul de distance entre deux etoiles
ecriture des données dans un fichier tiers
langage informatique : AutoIt3
version 0.2
Auteur : Khrys
#ce
#include <GUIConstants.au3>
#include <File.au3>
#include <Array.au3>
; déclaration et init des variables
$fichier = "data_etoiles.ini"
$ligne = 0
$col = 1
$i = 0 ; compteur
$n = 50; dimension du tableau TabNom qui pourra varier si on ajoute des systemes?
$Nom_Systeme1 = ""
$Nom_Systeme2 = ""
$Resultat_calcul = 0
$Reponse = 0
; utilisation d'un tableau nom , x, y, z, NT
Dim $X1=0, $X2=0, $Y1=0, $Y2=0, $Z1=0, $Z2=0, $NT1=0, $NT2=0
Dim $Tableau[6][5] ; déclaration du tableau généré à deux entrées contenant des exemples de systemes
Dim $Etoile[4][2] ; déclaration du tableau identifiant l'etoile
Dim $N_Etoile[4][2] ; déclaration du tableau identifiant l'etoile
Dim $TabNom[$n] ; déclaration du tableau des noms (pour liste des systèmes)
; teste si le fichier existe sinon crée un fichier exemple
If FileExists($fichier) Then
Lit_Fichier_Nom ($fichier) ; utilise la fonction de lecture et affiche seulement les noms des systemes, initialise le tableau TabNom
Else
GenTableau () ; génére un tableau pour l'exemple
_ArrayDisplay ( $Tableau , "affiche le tableau généré pour l'exemple") ; montre le contenu du tableau
Ecrit_Fichier ($fichier) ; utilise la fonction d'ecriture pour creer le fichier .INI
Lit_Fichier_Nom ($fichier) ; utilise la fonction de lecture et affiche seulement les noms des systemes, initialise le tableau TabNom
EndIf
; Création de l'interface graphique utilisateur : attention à toute modification, cette partie peut etre importée par Koda !
#Region ### START Koda GUI section ### Form=C:\Users\KHRYS\Documents\prog autoit\Systeme.kxf
$Distance = GUICreate("Distance", 615, 274, 195, 117)
$Case_Nom1 = GUICtrlCreateInput("Nom du systeme n°1", 40, 56, 153, 21)
$Case_Nom2 = GUICtrlCreateInput("Nom du systeme n°2", 40, 192, 161, 21)
$Case_X1 = GUICtrlCreateInput("0", 40, 104, 49, 21)
$Case_Y1 = GUICtrlCreateInput("0", 96, 104, 49, 21)
$Case_Z1 = GUICtrlCreateInput("0", 152, 104, 49, 21)
$Case_NT1 = GUICtrlCreateInput("0", 224, 104, 25, 21)
$Case_X2 = GUICtrlCreateInput("0", 40, 240, 49, 21)
$Case_Y2 = GUICtrlCreateInput("0", 96, 240, 49, 21)
$Case_Z2 = GUICtrlCreateInput("0", 152, 240, 49, 21)
$Case_NT2 = GUICtrlCreateInput("0", 224, 240, 25, 21)
$Bouton_AjSys = GUICtrlCreateButton("Ajouter un systeme", 480, 32, 121, 25, 0)
$Bouton_ModSys = GUICtrlCreateButton("Modifier un systeme", 480, 64, 121, 25, 0)
$Bouton_EffSys = GUICtrlCreateButton("Effacer un systeme", 480, 96, 121, 25, 0)
$Bouton_Calcul = GUICtrlCreateButton("Calcul", 336, 88, 105, 25, 0)
$Case_Distance = GUICtrlCreateInput("0", 336, 144, 105, 21)
$Label1 = GUICtrlCreateLabel("Distance Calculée", 336, 120, 90, 17)
$Bouton_Quitter = GUICtrlCreateButton("Quitter", 472, 224, 129, 33, 0)
$Label2 = GUICtrlCreateLabel("X", 56, 88, 11, 17)
$Label3 = GUICtrlCreateLabel("Y", 112, 88, 11, 17)
$Label4 = GUICtrlCreateLabel("Z", 168, 88, 11, 17)
$Label5 = GUICtrlCreateLabel("NT", 224, 88, 19, 17)
$Label6 = GUICtrlCreateLabel("X", 56, 224, 11, 17)
$Label7 = GUICtrlCreateLabel("Y", 112, 224, 11, 17)
$Label8 = GUICtrlCreateLabel("Z", 168, 224, 11, 17)
$Label9 = GUICtrlCreateLabel("NT", 224, 224, 19, 17)
$Combo1 = GUICtrlCreateCombo("Liste n°1", 40, 24, 169, 25)
$Combo2 = GUICtrlCreateCombo("Liste n°2", 40, 160, 169, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
ComboMAJ () ; mise a jour des listes "combo"
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Bouton_Quitter
Exit
Case $Bouton_Calcul
$Resultat_calcul = Calcul () ; appelle la fonction qui va calculer la distance entre les deux systemes
GUICtrlSetData ($Case_Distance, $Resultat_calcul) ; met a jour le champs case_distance
Case $Case_Nom1
$Nom_Systeme1 = GUICtrlRead ($Case_Nom1)
Lit_Section ($Nom_Systeme1)
If Lit_Section ($Nom_Systeme1) Then ; lit les données du fichier et le stock si le systeme correspond
MAJ_Sys1 ($Etoile) ; met a jour l'affichage du systeme 1 (x,y,z,NT) sur le GUI si le systeme est correct
Else
MsgBox(4096, "", "Une erreur s'est produite = " &@error &": le systeme n'est pas connu") ; affiche erreur
EndIf
Case $Case_Nom2
$Nom_Systeme2 = GUICtrlRead ($Case_Nom2)
Lit_Section ($Nom_Systeme2)
If Lit_Section ($Nom_Systeme2) Then ; lit les données du fichier et le stock si le systeme correspond
MAJ_Sys2 ($Etoile) ; met a jour l'affichage du systeme 1 (x,y,z,NT) sur le GUI si le systeme est correct
Else
MsgBox(4096, "", "Une erreur s'est produite = " &@error &": le systeme n'est pas connu") ; affiche erreur
EndIf
Case $Bouton_AjSys
If Lit_Section ($Nom_Systeme1) Then ; lit les données du fichier et le stock si le systeme correspond
MsgBox (48, "Information", "Ce systeme existe deja !")
Else
AjSys () ; utilise la fonction pour ecrire dans le fichier un nouveau systeme lu dans les cases de systeme n°1
ComboMAJ () ; mise a jour des listes "combo"
EndIf
Case $Bouton_ModSys
If Lit_Section ($Nom_Systeme1) Then ; lit les données du fichier et le stock si le systeme correspond
$Reponse = MsgBox (1, "Information", "Ce systeme existe deja, confirmez-vous la modification ?")
If $Reponse = 1 Then ; le bouton "ok" de MsgBox a ete appuyé, le systeme va etre mis a jour
AjSys () ; utilise la fonction pour ecrire dans le fichier un nouveau systeme lu dans les cases de systeme n°1
ComboMAJ () ; mise a jour des listes "combo"
EndIf
Else
MsgBox (48, "Information", "Ce systeme n'est pas repertorié, cliquez sur le bouton d'ajout pour l'enregistrer")
EndIf
Case $Bouton_EffSys
If Lit_Section ($Nom_Systeme1) Then ; lit les données du fichier et le stock si le systeme correspond
EffSys () ; utilise la fonction pour effacer un systeme dans le fichier lu dans la case du systeme n°1
ComboMAJ () ; mise a jour des listes "combo"
Else
MsgBox (48, "Information", "Ce système n'est pas enregistré et ne peut donc être effacé !")
EndIf
Case $Combo1
$Nom_Systeme1 = GUICtrlRead ($Combo1) ; lit le choix
GUICtrlSetData ($Case_Nom1, $Nom_Systeme1) ; suite au choix de la liste, met a jour le champs de la case nom n° 1
If Lit_Section ($Nom_Systeme1) Then ; lit les données du fichier et le stock si le systeme correspond
MAJ_Sys1 ($Etoile) ; met a jour l'affichage du systeme 1 (x,y,z,NT) sur le GUI si le systeme est correct
Else
MsgBox(4096, "", "Une erreur s'est produite = " &@error &": le systeme n'est pas connu") ; affiche erreur
EndIf
Case $Combo2
$Nom_Systeme2 = GUICtrlRead ($Combo2) ; lit le choix
GUICtrlSetData ($Case_Nom2, $Nom_Systeme2) ; suite au choix de la liste, met a jour le champs de la case nom n° 1
If Lit_Section ($Nom_Systeme2) Then ; lit les données du fichier et le stock si le systeme correspond
MAJ_Sys2 ($Etoile) ; met a jour l'affichage du systeme 1 (x,y,z,NT) sur le GUI si le systeme est correct
Else
MsgBox(4096, "", "Une erreur s'est produite = " &@error &": le systeme n'est pas connu") ; affiche erreur
EndIf
EndSwitch
WEnd
Func GenTableau () ; génére un tableau [6][5] pour l'exemple
; remplissage ligne zéro = ligne du nom des clés
$Tableau[0][0] = "Nom"
$Tableau[0][1] = "x"
$Tableau[0][2] = "y"
$Tableau[0][3] = "z"
$Tableau[0][4] = "NT"
; boucle de remplissage des valeurs de clés
for $i=0 to 5
$Tableau[$i][0] = "etoile " & ($i+1)
$Tableau[$i][1] = 100*($i+1)
$Tableau[$i][2] = 100*($i+1)
$Tableau[$i][3] = 100*($i+1)
$Tableau[$i][4] = ($i+1)
Next ; fin de la boucle de remplissage arbitraire
EndFunc ; fin fonction de génération du tableau
Func Ecrit_Fichier ($fichier) ; fonction ecriture du tableau dans un fichier .INI
; methode d'ecriture du tableau etoile par etoile
FileOpen ( $fichier , 2 ) ; ouverture du fichier
; etoile 1 est contenu dans $Tableau [1][] (ligne 1)
; conversion en section pour le fichier .ini
; etoile [x,y,z,NT] où la section sera le nom de l'etoile
;remplissage des clés dans le tableau $Etoile
$Etoile[0][0] = "x"
$Etoile[1][0] = "y"
$Etoile[2][0] = "z"
$Etoile[3][0] = "NT"
for $i=0 to 5
for $col=0 to 3
$Etoile[$col][1] = $Tableau[$i][$col+1]
Next
IniWriteSection ( $fichier, $Tableau[$i][0] , $Etoile , 0 ) ; ecrit le tableau nommé etoile dans le fichier .ini
Next
FileClose($fichier); ferme le fichier
EndFunc
Func Lit_Fichier_Nom ($fichier) ; fonction pour lire le noms des dans le fichier .INI
$TabNom = IniReadSectionNames ($fichier)
If @error Then
MsgBox(4096, "", "Une erreur s'est produite: pas de fichier INI") ; affiche erreur
Else
; (aide à la programmation) _ArrayDisplay ( $TabNom , "affiche tableau") ; montre le contenu du tableau des noms
EndIf
EndFunc
Func Lit_Section ($NSys)
FileOpen ( $fichier , 4 ) ; ouvre le fichier
$Etoile = IniReadSection ($fichier, $NSys) ; transmet dans le tableau etoile les valeurs des clés correspondantes
If @error Then
Return False
Else
Return True
EndIf
FileClose ( $fichier) ; ferme le fichier
EndFunc
Func MAJ_Sys1 ($Etoile) ; mise a jour des champs X1, Y1, Z1 et NT1 en fonction des données du tableau $Etoile
GUICtrlSetData ($Case_X1, $Etoile[1][1])
GUICtrlSetData ($Case_Y1, $Etoile[2][1])
GUICtrlSetData ($Case_Z1, $Etoile[3][1])
GUICtrlSetData ($Case_NT1, $Etoile[4][1])
EndFunc
Func MAJ_Sys2 ($Etoile) ; mise a jour des champs X2, Y2, Z2 et NT2 en fonction des données du tableau $Etoile
GUICtrlSetData ($Case_X2, $Etoile[1][1])
GUICtrlSetData ($Case_Y2, $Etoile[2][1])
GUICtrlSetData ($Case_Z2, $Etoile[3][1])
GUICtrlSetData ($Case_NT2, $Etoile[4][1])
EndFunc
Func Calcul ()
$X1 = GUICtrlRead ($Case_X1)
$X2 = GUICtrlRead ($Case_X2)
$Y1 = GUICtrlRead ($Case_Y1)
$Y2 = GUICtrlRead ($Case_Y2)
$Z1 = GUICtrlRead ($Case_Z1)
$Z2 = GUICtrlRead ($Case_Z2)
Return Round(Sqrt(($X1-$X2)^2 + ($Y1-$Y2)^2 + ($Z1-$Z2)^2),2) ; formule de distance en 3 dimension
EndFunc
Func AjSys ()
$Reponse = MsgBox (33, "Question", "Verifiez bien que les coordonnées correspondent bien dans le systeme n°1!")
If $Reponse = 1 Then ; le bouton "ok" de MsgBox a ete appuyé
$Nom_Systeme1 = GUICtrlRead ($Case_Nom1)
$X1 = GUICtrlRead ($Case_X1)
$Y1 = GUICtrlRead ($Case_Y1)
$Z1 = GUICtrlRead ($Case_Z1)
$NT1 = GUICtrlRead ($Case_NT1)
$N_Etoile[0][0] = "x"
$N_Etoile[1][0] = "y"
$N_Etoile[2][0] = "z"
$N_Etoile[3][0] = "NT"
$N_Etoile[0][1] = $X1
$N_Etoile[1][1] = $Y1
$N_Etoile[2][1] = $Z1
$N_Etoile[3][1] = $NT1
IniWriteSection ( $fichier, $Nom_Systeme1, $N_Etoile , 0 ) ; ecrit dans le fichier le nouveau systeme
If @error Then
MsgBox(4096, "", "Une erreur s'est produite:" &@error &" avec le fichier INI") ; affiche erreur
Else
MsgBox (48, "Information", "Systeme enregistré !") ; confirme l'enregistrement
;$n+=1 ; ajoute 1 à la dimension de TabNom
;ReDim $TabNom[$n] ; redimensionne le tableau avec la nouvelle dimension
Lit_Fichier_Nom ($fichier) ; utilise la fonction de lecture et affiche seulement les noms des systemes, initialise le tableau TabNom
EndIf
EndIf
EndFunc
Func EffSys ()
$Reponse = MsgBox (33, "Question", "Confirmez-vous l'effacement du systeme désigné dans le systeme n°1 ?")
If $Reponse = 1 Then ; le bouton "ok" de MsgBox a ete appuyé
$Nom_Systeme1 = GUICtrlRead ($Case_Nom1)
IniDelete ( $fichier, $Nom_Systeme1) ; efface dans le fichier le systeme désigné
If @error Then
MsgBox(4096, "", "Une erreur s'est produite:" &@error &" avec le fichier INI") ; affiche erreur
Else
MsgBox (48, "Information", "Systeme effacé !") ; confirme l'enregistrement
;$n-=1 ; ajoute 1 à la dimension de TabNom
;ReDim $TabNom[$n] ; redimensionne le tableau avec la nouvelle dimension
Lit_Fichier_Nom ($fichier) ; utilise la fonction de lecture et affiche seulement les noms des systemes, initialise le tableau TabNom
GUICtrlSetData ($Combo1 ,"") ; efface la liste 1
GUICtrlSetData ($Combo1 ,"Liste n°1","Liste n°1") ; reinitialise la liste pour avoir une "entete"
GUICtrlSetData ($Combo2 ,"") ; efface la liste 2
GUICtrlSetData ($Combo2 ,"Liste n°2","Liste n°2") ; reinitialise la liste pour avoir une "entete"
EndIf
EndIf
EndFunc
Func ComboMAJ ()
For $i=1 To $TabNom[0]
GUICtrlSetData($Combo1,$TabNom[$i])
GUICtrlSetData($Combo2,$TabNom[$i])
Next
EndFunc