Voici un petit prg qui gere vos recettes de MAP (Machine A Pain).
J'avais souvent 1000 et un papier de recette de pain qui trainaient à droite à gauche.
J'ai donc pensé à ce prog pour "centraliser" mes recettes de pain.
J'y ai inclus un calcul du taux d'hygrometrie. (Algorithme de folie, digne d'A.Einstein)
Je souhaitais un petit retour sur l'utilisation et les bugs restant à corriger.
Reste à faire :
- Decorer le background avec des themes boulangerie. Si vous avez des idées...
- Le menu aide et a propos.
A ce sujet, je souhaiterais avoir une gui qui s'ouvre lorsque l'on appelle le menu "a propos". Mais quand je l'appelle et que je la ferme (avec la croix) la GUI principale se ferme aussi. Si vous avez une idée...
► Afficher le texte
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ComboConstants.au3>
#Include <Array.au3>
Opt('MustDeclareVars', 1)
;~ Opt("GUICloseOnESC", 0)
;=========================VAR
Global $msg, $LeftLabel = 25, $TopLabel = 30, $LeftG = 125, $TopG = 30;gérer le deplacement des objets
Global $Form1_1,$Farine,$Sucre,$Sel,$Levure,$Oeufs,$Beurre,$Liquides,$Calculer, $Titre; Input
Global $LabelBeurre, $LabelFarine, $LabelLevure, $LabelLiquides, $LabelOeufs, $LabelSel, $LabelSucre,$LabelCommentaires; Label
Global $LabelGbeurre, $LabelGfarine, $LabelGlevure, $LabelGliquides, $LabelGsucre, $LabelGsel,$LabelGSolides; Label Grammes
Global $LabelCLiquides, $LabelCSolides,$LabelTitreRecette,$LabelThActuel; Label zone calcul
Global $MenuHelp, $MenuRecettes, $MenuTH,$debut = "#%#"
Global $ItemAbout, $ItemAide, $ItemDefinir, $ItemNouvelle, $ItemOuvrir, $ItemSauvegarder,$itemTrait,$ItemQuitter;Item Menu
Global $Commentaires, $GroupCalcul, $GroupRecette, $solides,$ButtonCalculer,$ButtonOuvrir, $ButtonSupprimer
Global $TitreMSGBOX = "MAP Recettes", $string,$ListeRecette
Global $fichierConfig = @ScriptDir & "\config.map", $Choix = " ",$fichierBak = @ScriptDir & "\recettes.map.bak", $fichierRecette = @ScriptDir & "\recettes.map"
Global $ComboRecette, $GroupChoixRecette
;=========================VAR
;=========================GUI
$Form1_1 = GUICreate ("MAP Recettes", 436, 400)
;=========================GUI
;=========================Menu
$MenuRecettes = GUICtrlCreateMenu("&Recettes")
$ItemNouvelle = GUICtrlCreateMenuItem("&Nouvelle", $MenuRecettes)
$ItemSauvegarder = GUICtrlCreateMenuItem("&Sauvegarder", $MenuRecettes)
$itemTrait = GUICtrlCreateMenuItem ("",$MenuRecettes)
$ItemQuitter = GUICtrlCreateMenuItem("&Quitter", $MenuRecettes)
$MenuTH = GUICtrlCreateMenu("&Th")
$ItemDefinir = GUICtrlCreateMenuItem("&Definir", $MenuTH)
$MenuHelp = GUICtrlCreateMenu("?")
$ItemAide = GUICtrlCreateMenuItem("Aide ", $MenuHelp)
$ItemAbout = GUICtrlCreateMenuItem("A propos", $MenuHelp)
;=========================Menu
;=========================Input
$Farine = GUICtrlCreateInput("", 79, 46, 40, 21)
$Sucre = GUICtrlCreateInput("", 79, 77, 40, 21)
$Sel = GUICtrlCreateInput("", 79, 108, 40, 21)
$Levure = GUICtrlCreateInput("", 79, 139, 40, 21)
$Oeufs = GUICtrlCreateInput("", 79, 169, 40, 21)
$Beurre = GUICtrlCreateInput("", 79, 200, 40, 21)
$Liquides = GUICtrlCreateInput("", 79, 231, 40, 21)
$solides = GUICtrlCreateInput("", 161, 300, 40, 21)
$Titre = GUICtrlCreateInput("", 244, 44, 161, 21)
;=========================Input
;=========================Label
$LabelFarine = GUICtrlCreateLabel("Farine :" , $LeftLabel,$TopLabel+16, 45, 17)
$LabelSucre = GUICtrlCreateLabel("Sucre :" , $LeftLabel,$TopLabel+47, 45, 17)
$LabelSel = GUICtrlCreateLabel("Sel :" , $LeftLabel,$TopLabel+79, 45, 17)
$LabelLevure = GUICtrlCreateLabel("Levure :" , $LeftLabel,$TopLabel+110, 45, 17)
$LabelOeufs = GUICtrlCreateLabel("Oeufs :" , $LeftLabel,$TopLabel+142, 45, 17)
$LabelBeurre = GUICtrlCreateLabel("Beurre :" , $LeftLabel,$TopLabel+173, 45, 17)
$LabelLiquides = GUICtrlCreateLabel("Liquides :", $LeftLabel,$TopLabel+205, 45, 17)
$LabelTitreRecette = GUICtrlCreateLabel("Nom de la recette :", 150, 49, 90, 17)
$LabelThActuel = GUICtrlCreateLabel("Th Actuel : 0", $LeftLabel, 305, 90, 25)
$LabelGsucre = GUICtrlCreateLabel("g", $LeftG, 78, 10, 17)
$LabelGsel = GUICtrlCreateLabel("g", $LeftG, 109, 10, 17)
$LabelGlevure = GUICtrlCreateLabel("g", $LeftG, 140, 10, 17)
$LabelGbeurre = GUICtrlCreateLabel("g", $LeftG, 201, 10, 17)
$LabelGliquides = GUICtrlCreateLabel("g", $LeftG, 232, 10, 17)
$LabelGfarine = GUICtrlCreateLabel("g", $LeftG, 47, 10, 17)
$LabelGSolides = GUICtrlCreateLabel("g", 205, 303, 10, 17)
$LabelCSolides = GUICtrlCreateLabel("Solides :", 115, 305, 45, 17)
$LabelCLiquides = GUICtrlCreateLabel("Liquides : ", 115, 335, 100, 17)
$LabelCommentaires = GUICtrlCreateLabel("Commentaires :",150,77,73,17)
;=========================Label
;=========================Edit
$Commentaires = GUICtrlCreateEdit("", 150, 97, 257, 155)
;=========================Edit
;=========================Group
$GroupRecette = GUICtrlCreateGroup("Recette", 14, 17, 407, 249)
$GroupCalcul = GUICtrlCreateGroup("Calcul de quantités", 14, 275, 210, 90)
$GroupChoixRecette = GUICtrlCreateGroup("Choix de recette", 240, 275, 180, 90)
;=========================Group
;=========================Button
$ButtonCalculer = GUICtrlCreateButton("Calculer", $LeftLabel, 332, 55, 22, $WS_GROUP)
$ButtonOuvrir = GUICtrlCreateButton("Ouvrir", 256, 332, 70, 22, $WS_GROUP)
$ButtonSupprimer = GUICtrlCreateButton("Supprimer", 340, 332, 70, 22, $WS_GROUP)
;=========================Button
;=========================Combo
$ComboRecette = GUICtrlCreateCombo($Choix, 256, 300, 153, 25)
;=========================Combo
;=========================1er lancement
If Not FileExists ($fichierRecette) Then FileClose (FileOpen ($fichierRecette,1))
;=========================1er lancement
GUISetState(@SW_SHOW)
_lectureTH(); lit le TH s'il existe
_RafraichirListeRecette (); lit dans le fichier recette, la liste des recettes
; Run the GUI until the dialog is closed
While 1
Sleep (10)
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
If $msg = $ItemQuitter Then ExitLoop
If $msg = $ButtonCalculer Then _Calculer ()
If $msg = $ItemDefinir Then _Definir()
If $msg = $ItemNouvelle Then _Nouvelle()
If $msg = $ItemSauvegarder Then _sauvegarde()
If $msg = $ButtonOuvrir Then _Ouvrir()
If $msg = $ButtonSupprimer Then _Supprimer()
WEnd
GUIDelete()
Exit
;=========================Function
Func _Calculer(); Calcul la quantité de liquide
Local $fo, $th, $PoidSolides
$fo = FileOpen ($fichierConfig,0)
$th = FileReadLine ($fo)
FileClose ($fo)
If $th = "" Then;Si le th est vide
MsgBox (64, $TitreMSGBOX, "Vous devez choisir un Taux d'Hygrometrie." & @CRLF & "Menu ""Th/Definir"".")
Else; si le th est pas vide, alors on lit le th et on fait le calcul.
$PoidSolides = GUICtrlRead ($solides)
GUICtrlSetData ($LabelCLiquides,"Liquides : " & Round($PoidSolides * $th) & " g")
EndIf
EndFunc
;=========================Function
Func _Definir(); definit le th
Local $thInput, $fo, $check,$thactuel = "Th Actuel : "
$thInput = InputBox ("MAP Recettes", "Entrer le Th de votre machine à pain :" & @CRLF & "Ex : 0.60" )
If $thInput = "" Then; si le th saisi est vide, on supp le fichier et reinitialise le label
FileDelete ($fichierConfig)
GUICtrlSetData ($LabelThActuel, $thactuel)
EndIf
If $thInput <> "" Then;si le th saisi est renseigné, on verifie les valeurs entrées
$check = _CheckStringIsTh($thInput)
If $check = 1 Then; si le th est bien saisi (x.xx) alors on ecrit le th dans le fichier de config
If FileExists ($fichierConfig) Then FileDelete ($fichierConfig)
$fo = FileOpen ($fichierConfig,1)
FileWrite($fo, $thInput)
FileClose ($fo)
_lectureTH(); on mets a jour l'affichage du th
EndIf
EndIf
EndFunc
;=========================Function
Func _CheckStringIsTh($string); Verifie que la saisie du th respecte "x.xx" (chiffre + point decimal + chiffre + chiffre)
Local $len, $err = 0; si $err = 1 alors c'est une erreur de saisie
$len = StringLen ($string); verifie la longueur saisie
If $len = 4 Then; si la longueur ets bonne alors
If StringTrimRight ($string,2) <> "0." Then; si les 2 1er chars sont different de "0." alors
MsgBox (48,$TitreMSGBOX, "Le TH semble incorrect. Il doit commencer par zéro et un point (decimal)." & @CRLF & "Ex : 0.60")
ElseIf Not StringIsDigit (StringTrimLeft ($string,2)) Then; ou si la saisie comporte autre chose que des chiffres, alors
MsgBox (48,$TitreMSGBOX, "Le TH semble incorrect. Il doit être composé de 3 chiffres et un point (decimal)." & @CRLF & "Ex : 0.60")
Else
$err = 1; flag à erreur
EndIf
Else
MsgBox (48,$TitreMSGBOX, "Le TH semble incorrect. Il doit être composé de 4 caracteres." & @CRLF & "Ex : 0.60")
EndIf
Return $err
EndFunc
;=========================Function
Func _lectureTH(); Lit le taux d'hygro dans le fichier
Local $fo, $thactuel = "Th Actuel : ", $th
If FileExists ($fichierConfig) Then
$fo = FileOpen ($fichierConfig,0)
$th = FileReadLine ($fo)
FileClose ($fo)
GUICtrlSetData ($LabelThActuel, $thactuel & $th)
EndIf
EndFunc
;=========================Function
Func _ControleChampVide(); Verifie si les champs sont vides avant action
Local $true = "", $sav
While $true = ""
Sleep (10)
If GUICtrlRead ($Farine) Then
$true = 1
Else
If GUICtrlRead ($Sucre) Then
$true = 1
Else
If GUICtrlRead ($Sel) Then
$true = 1
Else
If GUICtrlRead ($Levure) Then
$true = 1
Else
If GUICtrlRead ($Oeufs) Then
$true = 1
Else
If GUICtrlRead ($Beurre) Then
$true = 1
Else
If GUICtrlRead ($Liquides) Then
$true = 1
Else
If GUICtrlRead ($Titre) Then
$true = 1
Else
If GUICtrlRead ($Commentaires) Then
$true = 1
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
ExitLoop
WEnd
Return $true
EndFunc
;=========================Function
Func _Nouvelle()
Local $true, $sav
$true = _ControleChampVide()
If $true <> "" Then ; Si un champ est rempli, alors...
$sav = MsgBox (36,$TitreMSGBOX,"Etes-vous sur de vouloir effacer la recette en cours ?")
If $sav = 6 Then
_VideChamp ()
EndIf
EndIf
EndFunc
;=========================Function
Func _VideChamp(); Vide tous les Input à blanc
GUICtrlSetData ($Farine,"")
GUICtrlSetData ($Sucre,"")
GUICtrlSetData ($Sel,"")
GUICtrlSetData ($Levure,"")
GUICtrlSetData ($Oeufs,"")
GUICtrlSetData ($Beurre,"")
GUICtrlSetData ($Liquides,"")
GUICtrlSetData ($Titre,"")
GUICtrlSetData ($Commentaires,"")
EndFunc
;=========================Function
Func _sauvegarde()
Local $exist, $size
If Not GUICtrlRead ($Titre) Then
MsgBox (48,$TitreMSGBOX, "Veuillez saisir un nom de recette.")
Else
$size = FileGetSize ($fichierRecette)
If $size = 0 Then ; Si le fichier est vide...
_LitEcritDansLeFichier ()
Else ; si le fichier n'est pas vide alors
$exist = _VerifieRecetteExist(); on verifie qu'une recette ne porte pas le meme nom
If $exist = 0 Then ; Si une occurence est trouvée alors
MsgBox (48,$TitreMSGBOX, "Une recette porte déjà ce nom ! " & @CRLF & @CRLF & "Veuillez saisir un autre nom de recette.")
Else
_LitEcritDansLeFichier ()
EndIf
EndIf
EndIf
EndFunc
;=========================Function
Func _VerifieRecetteExist();parcours le fichier de recette pour y trouver(ou pas) la recette selectionnée.
Local $fo2, $ligne = "", $location, $count, $split, $NomDeRecette, $titreSaisie, $return = ""
$fo2 = FileOpen ($fichierRecette,0)
$count = 0
While 1
Sleep (10)
$ligne = FileReadLine ($fo2)
If @error = -1 Then ExitLoop
$location = StringInStr($ligne,"#%#")
If $location <> 0 Then $count = $count + 1
WEnd
FileClose ($fo2)
Local $array[$count], $n
$fo2 = FileOpen ($fichierRecette,0)
$n = 0
While 1
Sleep (10)
$ligne = FileReadLine ($fo2)
If @error = -1 Then ExitLoop
$location = StringInStr($ligne,"#%#")
If $location <> 0 Then
$split = StringSplit ($ligne,"%%",1)
$NomDeRecette = StringTrimLeft ($split[1],3)
$array[$n] = $NomDeRecette
$n = $n + 1
EndIf
WEnd
$titreSaisie = GUICtrlRead ($Titre)
$return = _ArraySearch ($array,$titreSaisie)
If $return = -1 Then
Return -1
Else
Return 0
EndIf
EndFunc
;=========================Function
Func _LitEcritDansLeFichier ();Lit les zones d'input pour sauvegarder les champs dans le fichier recette au format #%#Nom de la recette%%ingredients%%
Local $sFarine, $sSel, $sSucre, $sLevure, $sOeufs, $sBeurre, $sLiquides, $sCom, $sTitre
Local $ligneRecette, $sep = "%%", $fo3
$sFarine = GUICtrlRead ($Farine)
If $sFarine = "" Then $sFarine = 0
$sSucre = GUICtrlRead ($Sucre)
If $sSucre = "" Then $sSucre = 0
$sSel = GUICtrlRead ($Sel)
If $sSel = "" Then $sSel = 0
$sLevure = GUICtrlRead ($Levure)
If $sLevure = "" Then $sLevure = 0
$sOeufs = GUICtrlRead ($Oeufs)
If $sOeufs = "" Then $sOeufs = 0
$sBeurre = GUICtrlRead ($Beurre)
If $sBeurre = "" Then $sBeurre = 0
$sLiquides = GUICtrlRead ($Liquides)
If $sLiquides = "" Then $sLiquides = 0
$sCom = GUICtrlRead ($Commentaires)
If $sCom = "" Then $sCom = ""
$sTitre = GUICtrlRead ($Titre)
$ligneRecette = $debut & $sTitre & $sep & $sFarine & $sep & $sSucre & $sep & _
$sSel & $sep & $sLevure & $sep & $sOeufs & $sep & $sBeurre & $sep & $sLiquides & $sep & @CRLF & $sCom
$fo3 = FileOpen ($fichierRecette,1)
FileWriteLine ($fichierRecette, $ligneRecette)
FileClose ($fo3)
_RafraichirListeRecette ()
MsgBox (0,$TitreMSGBOX,"Sauvegarde effectuée.", 2)
EndFunc
;=========================Function
Func _RafraichirListeRecette (); parcours le fichier de recettes et releve tous les titres des recettes.
Local $fo4, $ligne1, $split1, $location1, $NomDeRecette1
$ListeRecette = ""
$fo4 = FileOpen ($fichierRecette,0)
While 1
Sleep (10)
$ligne1 = FileReadLine ($fo4)
If @error = -1 Then ExitLoop
$location1 = StringInStr($ligne1,"#%#")
If $location1 <> 0 Then
$split1 = StringSplit ($ligne1,"%%",1)
$NomDeRecette1 = StringTrimLeft ($split1[1],3)
$ListeRecette = $ListeRecette & "|" & $NomDeRecette1
EndIf
WEnd
FileClose ($fo4)
GUICtrlSetData ($ComboRecette,$ListeRecette)
EndFunc
;=========================Function
Func _Ouvrir ()
Local $true, $sav
$true = _ControleChampVide()
If $true = "" Then ; Si tous les champ sont vides, alors...
If GUICtrlRead ($ComboRecette) Then; si une recette est choisie
_chargeRecette()
GUICtrlSetData ($ComboRecette,$ListeRecette)
Else; si aucune recette choisie
MsgBox (48,$TitreMSGBOX, "Veuillez choisir une recette !", 3)
EndIf
Else; si les champs ne sont pas vides
$sav = MsgBox (36,$TitreMSGBOX,"Ouvrir la recette " & GUICtrlRead ($ComboRecette) & " ?" & @CRLF & @CRLF & "Ceci ecrasera la recette en cours.")
If $sav = 6 Then; si le user confirme qu'il ne veut pas sauvegarder
_chargeRecette()
GUICtrlSetData ($ComboRecette,$ListeRecette)
EndIf
EndIf
EndFunc
;=========================Function
Func _chargeRecette()
Local $fo5,$ligne2,$location2,$NomDeRecette2, $recette,$split1, $Ligne22,$com
_VideChamp()
$recette = GUICtrlRead ($ComboRecette)
$fo5 = FileOpen ($fichierRecette,0)
While 1
Sleep (10)
$ligne2 = FileReadLine ($fo5);lit la ligne d'une recette
If @error = -1 Then ExitLoop
$location2 = StringInStr($ligne2,"#%#"); cherche le sep de debut
If $location2 <> 0 Then; si le sep de debut est trouvé alors
$split1 = StringSplit ($ligne2,"%%",1);on stocke dans le tableau les elements de la recette
$NomDeRecette2 = StringTrimLeft ($split1[1],3);on recupere le nom de la recette
If $NomDeRecette2 = $Recette Then; si le nom de la recette est egal au titre choisi
GUICtrlSetData ($Titre, $NomDeRecette2)
GUICtrlSetData ($Farine, $split1[2])
GUICtrlSetData ($Sucre, $split1[3])
GUICtrlSetData ($Sel, $split1[4])
GUICtrlSetData ($Levure, $split1[5])
GUICtrlSetData ($Oeufs, $split1[6])
GUICtrlSetData ($Beurre, $split1[7])
GUICtrlSetData ($Liquides, $split1[8])
While 1
$Ligne22 = FileReadLine ($fo5);Lit la ligne qui suit
If @error = -1 Then ExitLoop
If StringMid ($Ligne22,1,3) = $debut Then; Si la ligne commence par un sep de debut on sort de la boucle
ExitLoop
ElseIf StringMid ($Ligne22,1,1) = "" Then; Ou si la ligne commence par un @CRLF alors on recupere le CRLF dans la variable
$com = $com & @CRLF
Else
$com = $com & $Ligne22 & @CRLF;si Pas de CRLF ni de sep de debut, on copie la ligne en variable
EndIf
WEnd
GUICtrlSetData ($Commentaires, $com); on definit le champ commentaire avec la variable $com
EndIf
EndIf
WEnd
FileClose($fo5)
EndFunc
;=========================Function
Func _Supprimer()
Local $recette,$fic,$ficWrite,$Ligne3,$champ,$fo6,$NomDeRecette3,$StringFichierNew, $fichierRecetteTemp = @ScriptDir & "\recettes.map.new"
Local $reponse
If Not GUICtrlRead ($ComboRecette) Then; Si aucune recette selectionnée alors
MsgBox (48,$TitreMSGBOX,"Veuillez selectionner une recette à supprimer.",3)
Else;Si une recette est selctionnée
$reponse = MsgBox (292,$TitreMSGBOX,"Etes-vous sur de vouloir supprimer la recette : " & @CRLF & '"' & GUICtrlRead ($ComboRecette) & '"')
EndIf
If $reponse = 6 Then; si le user reponds Oui, alors...
If FileExists ($fichierRecetteTemp) Then FileDelete ($fichierRecetteTemp); on efface l'ancien fichier
$recette = GUICtrlRead ($ComboRecette); on lit le combo
$fo6 = FileOpen ($fichierRecette,0); on ouvre le fic en lecture
While 1
$Ligne3 = FileReadLine ($fo6);lit la ligne
If @error = -1 Then ExitLoop
$champ = StringSplit ($Ligne3,"%%",1);on separe avec les sep
$NomDeRecette3 = StringTrimLeft ($champ[1],3); on trim le debut
If $NomDeRecette3 = $recette Then; si le titre de ligne = le titre de combo alors
While 1; on cherche à eviter la suite jusque la prochaine recette
$Ligne3 = FileReadLine ($fo6);Lit la ligne qui suit
If @error = -1 Then ExitLoop
If StringMid ($Ligne3,1,3) = "#%#" Then; si la ligne suivante est une nouvelle recette
$StringFichierNew = $StringFichierNew & $Ligne3 & @CRLF; on rempli la variable
ExitLoop; et on sort
EndIf
WEnd
Else
$StringFichierNew = $StringFichierNew & $Ligne3 & @CRLF;on rempli la variable avec les lignes a sauvegarder
EndIf
WEnd
$ficWrite = FileOpen ($fichierRecetteTemp,1);on ouvre un fichier temp
FileWrite ($ficWrite,$StringFichierNew);on y ecrit la variable
FileClose ($ficWrite);on ferme
FileMove ($fichierRecette, $fichierBak,1); et on renomme
FileMove ($fichierRecetteTemp, $fichierRecette,1)
_RafraichirListeRecette()
EndIf
EndFunc