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



 
 
 )  !
)  !