Imports System.IO
Public Class frmConfig

    Private Sub frmConfig_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

    End Sub

    Private Sub frmConfig_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim Verif As Boolean = True
        Dim filename As String

        Try
            'Contrôle de la présence du logiciel Word sur le PC
            Dim KEY As Microsoft.Win32.RegistryKey = My.Computer.Registry.ClassesRoot.OpenSubKey("Word.Application")
            If KEY Is Nothing Then RbtnWord.Visible = False

            'Contrôle de la présence du logiciel WordPad sur le PC
            If IsWordPadInstalled() Then
                RbtnWordPad.Visible = True 'MessageBox.Show("WordPad est installé sur ce PC.")
            Else
                RbtnWordPad.Visible = False ' MessageBox.Show("WordPad n'est pas trouvé sur ce PC.")
            End If

            If Aff.FileName = String.Empty Then
                filename = Directory.GetCurrentDirectory.ToString() & "\cfg_LaboBeton.ini" '--> le formulaire Menu assure la création du fichier ini si n'existe pas
                Me.Text = "Configuration du logiciel : [ Aucun projet en cours ]"
                'Affichage des valeurs en cours
                Call Lecture_fichier_Ini(filename, Verif) ' 
                If Verif = False Then
                    Call Initialisation() 'lecture variables par defaut 'appel aux variables générales inscrites en dur dans le logiciel
                    MessageBox.Show("Affichage du formulaire Configuration avec les valeurs par défaut, en raison de l'erreur ci-avant.", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning)
                End If
            Else
                Dim Racine As String = String.Empty
                Dim NomAffaire As String = String.Empty
                Call Lecture_chaine_Racine(Aff.FileName, Racine, NomAffaire, Verif)
                Me.Text = "Configuration du logiciel : [ " & NomAffaire.ToString & " ]"
            End If

            If Aff.i_data = 1 And Aff.msgData <> Directory.GetCurrentDirectory.ToString() & "\Data" Then
                Aff.msgData = Directory.GetCurrentDirectory.ToString() & "\Data" 'on conserve le Aff.i_data = 1
                MessageBox.Show("L'adresse du répertoire par défaut du fichier de données a été modifiée." & Environment.NewLine & "Voir ci-dessous la nouvelle adresse.", Me.Text,
                                MessageBoxButtons.OK, MessageBoxIcon.Information)

            ElseIf My.Computer.FileSystem.DirectoryExists(Aff.msgData) = False Then
                'Vérification que le répertoire Racine existe sur l'ordinateur
                's'il existe, je conserve le Aff.i_data = 2 sinon je reviens au répertoire par défaut
                Aff.i_data = 1 : Aff.msgData = Directory.GetCurrentDirectory.ToString() & "\Data"
                MessageBox.Show("L'adresse du répertoire du fichier de données n'est pas accessible ou n'existe pas." & Environment.NewLine &
                                "Provisoirement, le fichier de données sera sauvegardé dans le répertoire suivant :" & Environment.NewLine & Aff.msgData.ToString, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If '

            If Aff.i_result = 1 And Aff.msgResult <> Directory.GetCurrentDirectory.ToString() & "\Note_de_calcul" Then
                Aff.msgResult = Directory.GetCurrentDirectory.ToString() & "\Note_de_calcul"
                MessageBox.Show("L'adresse du répertoire par défaut des notes de calcul a été modifiée." & Environment.NewLine & "Voir ci-dessous la nouvelle adresse.", Me.Text,
                               MessageBoxButtons.OK, MessageBoxIcon.Information)
                'Vérification que le répertoire Racine existe sur l'ordinateur
                's'il existe, je conserve le Aff.i_result = 2 sinon je reviens au répertoire par défaut
            ElseIf My.Computer.FileSystem.DirectoryExists(Aff.msgResult) = False Then
                Aff.i_result = 1 : Aff.msgResult = Directory.GetCurrentDirectory.ToString() & "\Note_de_calcul"
                MessageBox.Show("L'adresse du répertoire de la note de calcul n'est pas accessible ou n'existe pas." & Environment.NewLine &
                                "Provisoirement, la note de calcul sera sauvegardé dans le répertoire suivant :" & Environment.NewLine & Aff.msgResult.ToString, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If

            Call Affichage()

        Catch ex As Exception
            MessageBox.Show("Erreur lors de la lecture du fichier de configuration: " & Environment.NewLine & ex.Message & ex.StackTrace, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub
    Function IsWordPadInstalled() As Boolean
        ' Chemin standard de WordPad sous Windows 10 / 11
        Dim programFilesPath As String = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
        Dim wordpadPath As String = Path.Combine(programFilesPath, "Windows NT\Accessories\wordpad.exe")

        ' Vérification alternative dans system32 (write.exe) au cas échéant
        Dim systemPath As String = Environment.GetFolderPath(Environment.SpecialFolder.System)
        Dim writePath As String = Path.Combine(systemPath, "write.exe")

        ' Retourne vrai si l'un des deux exécutables historiques existe
        Return File.Exists(wordpadPath) OrElse File.Exists(writePath)
    End Function
    Private Sub BtnQuit_Click(sender As Object, e As EventArgs) Handles BtnQuit.Click
        Me.Dispose()
        Me.Close() 'quitte le formulaire
    End Sub
    Private Sub BtnOK_Click(sender As Object, e As EventArgs) Handles BtnOK.Click
        Dim Verif As Boolean = True
        Dim msg As String = String.Empty
        Call Lecture(Verif, msg)
        If Verif = False Then
            MessageBox.Show("Erreur dans la lecture des données du formulaire Configuration :" & Environment.NewLine & msg, "Module de lecture des données du formulaire Configuration", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Exit Sub
        End If
        Me.Dispose()
        Me.Close() 'quitte le formulaire
    End Sub
    Private Sub BtnSauvegarde_Click(sender As System.Object, e As System.EventArgs) Handles BtnSauvegarde.Click
        Dim Verif As Boolean = True
        Dim filename As String
        Dim msg As String = String.Empty
        filename = Directory.GetCurrentDirectory.ToString() & "\cfg_LaboBeton.ini"
        Call Lecture(Verif, msg)
        If Verif = False Then
            MessageBox.Show("Erreur dans la lecture des données du formulaire Configuration :" & Environment.NewLine & msg, "Module de lecture des données du formulaire Configuration", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Exit Sub
        End If
        Call Ecriture_fichier_Cfg_Ini(filename, Verif)
        If Verif = False Then Exit Sub

        MessageBox.Show("Fichier de configuration modifié avec succés.", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)

    End Sub
    Private Sub BtnReinit_Click(sender As System.Object, e As System.EventArgs) Handles BtnReinit.Click
        Dim reponse As DialogResult
        reponse = MessageBox.Show("Attention, vous allez modifier vos préférences !!!!" & Environment.NewLine & "Voulez-vous continuer?", "Labo béton : formulaire configuration", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
        If reponse = Windows.Forms.DialogResult.Yes Then
            Stop '      Call Variables_generales()   'appel au modules contenant les variables par defaut, écrites en dur dans le logiciel, se trouve dans le module General.vb
            Call Affichage()
        End If

    End Sub

    ''' <summary>Lecture des données de l'ensemble des onglets</summary>
    '''  <param name="Verif">Renvoi FALSE si pb de lecture des données</param>
    '''  <param name="msg">message indiquant les défauts relevés lors de la lecture conduisant à l'Erreur en lecture</param> 
    Private Sub Lecture(ByRef Verif As Boolean, ByRef msg As String)
        Try
            'Onglet General
            If RbtnDatadefaut.Checked = True Then
                Aff.msgData = Directory.GetCurrentDirectory.ToString() & "\Data" : Aff.i_data = 1 ' Directory.GetParent(Directory.GetCurrentDirectory).ToString() 
            Else
                Aff.msgData = LblData.Text : Aff.i_data = 2
            End If
            If RbtnResultDefaut.Checked = True Then
                Aff.msgResult = Directory.GetCurrentDirectory.ToString() & "\Note_de_calcul" : Aff.i_result = 1 'Directory.GetParent(Directory.GetCurrentDirectory).ToString() 
            Else
                Aff.msgResult = LblResult.Text : Aff.i_result = 2
            End If
            Aff.Chantier = TxtChantier.Text
            Aff.Redacteur = TxtRedacteur.Text
            If gestionderreur(TxtAide_Hauteur, EP1) = True Then Aff.Aide_Hauteur = CInt(TxtAide_Hauteur.Text) Else msg += "Défaut de lecture écran d'Aide : hauteur" & Environment.NewLine : Verif = False
            If gestionderreur(TxtAide_Largeur, EP1) = True Then Aff.Aide_Largeur = CInt(TxtAide_Largeur.Text) Else msg += "Défaut de lecture écran d'Aide : largeur" & Environment.NewLine : Verif = False

            'onglet Editeur
            If RbtnEditeurInterne.Checked = True Then Aff.Editeur = 1
            If RbtnWordPad.Checked = True Then Aff.Editeur = 2
            If RbtnWord.Checked = True Then Aff.Editeur = 3

            'Onglet béton
            With Beton
                '--> Formulation retenue par Défaut
                Select Case CbFormulation.SelectedIndex
                    Case 0 'Dreux-Gorisse
                        .Formulation = 1'  
                    Case 1 'Baron-Ollivier
                        .Formulation = 2 ' CbFormulation.Text = CbFormulation.Items(1).ToString
                End Select
                '-> Durabilité : prise en compte des valeurs limites des composants de la formulation imposé par l'EN206-1
                If ChkbExigenceEN206.Checked = False Then
                    .EN206 = 0 ': .EN206_Durabilite = False
                Else
                    'dans le cas ou le projeteur a coché mais ne s'est pas rendu dans le formulaire Classe d'exposition pour définir l'EN 206-1 en base réglementaire.
                    If .EN206 <> 1 AndAlso .EN206 <> 2 Then '.EN206_Durabilite = True
                        EP1.SetError(ChkbExigenceEN206, "La base réglementaire EN206-1 n'a pas été définie.")
                        MessageBox.Show("Vous ne vous êtes pas rendu dans le formulaire Classe d'exposition pour indiquer la base réglementaire EN206-1 sur laquelle vous contrôlez la formulation.", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
                        Verif = False
                    End If
                End If
                '-> prise en compte soit des Fck imposés par l'EN206-1 soit Fck libre comme au temps du BAEL
                Select Case CbEN206.SelectedIndex
                    Case 0
                        .EN206_Fc = True
                        Select Case CbFc28.Text
                            Case "C8/10"
                                .Fck = 8
                            Case "C12/15"
                                .Fck = 12
                            Case "C16/20"
                                .Fck = 16
                            Case "C20/25"
                                .Fck = 20
                            Case "C25/30"
                                .Fck = 25
                            Case "C30/37"
                                .Fck = 30
                            Case "C35/45"
                                .Fck = 35
                            Case "C40/50"
                                .Fck = 40
                            Case "C45/55"
                                .Fck = 45
                            Case "C50/60"
                                .Fck = 50
                            Case "C55/67"
                                .Fck = 55
                            Case Else
                                EP1.SetError(CbFc28, "Indiquez la valeur numérique de fc.")
                                msg += "Défaut de lecture sur Fck : Vous avez oublié de renseigner la résistance caractéristique visée" & Environment.NewLine : Verif = False
                        End Select
                    Case 1
                        .EN206_Fc = False
                        If gestionderreur(TxtFc, EP1) = True Then .Fck = CInt(TxtFc.Text) Else msg += "Défaut de lecture sur Fck." & Environment.NewLine : Verif = False
                End Select

                'Suivant la méthode de formulation retenue
                Call Lecture_Onglet_Beton(Verif, msg)
            End With
            'onglet Sable
            With Sable.Item(0)
                .NomSable = TxtNomSable.Text
                If gestionderreur(TxtdSable, EP1) = True Then .ds = CDbl(TxtdSable.Text) Else msg += "Défaut de lecture sur Sable: d mini." & Environment.NewLine : Verif = False
                If gestionderreur(TxtDmSable, EP1) = True Then .Dms = CDbl(TxtDmSable.Text) Else msg += "Défaut de lecture sur Sable: D Maxi" & Environment.NewLine : Verif = False
                If RbtnConcasseSable.Checked = True Then
                    .Forme = 1
                ElseIf RbtnRouleSable.Checked = True Then
                    .Forme = 2
                Else
                    msg += "La forme du sable (concassé ou roulé) n'a pas été renseignée" & Environment.NewLine : Verif = False
                End If
                If gestionderreur(TxtDensiteSecheSable, EP1) = True Then .Densite = CDbl(TxtDensiteSecheSable.Text) Else msg += "Défaut de lecture sur Sable: densité sèche ." & Environment.NewLine : Verif = False '  
                If gestionderreur(TxtHumiditeSable, EP1) = True Then .Humidite = CDbl(TxtHumiditeSable.Text) / 100 Else msg += "Défaut de lecture sur Sable: humidité." & Environment.NewLine : Verif = False '
                If gestionderreur(TxtWabsSable, EP1) = True Then .Wabs = CDbl(TxtWabsSable.Text) / 100 Else msg += "Défaut de lecture sur Sable: coefficient d'absorption." & Environment.NewLine : Verif = False
                'Lecture du mode de référence de la granulométrie
                .Choix_mesureGranulo = CbRefusSable.SelectedIndex
                If gestionderreur(TxtFines, EP1) = True Then .Humidite = CDbl(TxtFines.Text) / 100 Else msg += "Défaut de lecture sur Sable: humidité." & Environment.NewLine : Verif = False
                If gestionderreur(TxtMfCible, EP1) = True Then .Humidite = CDbl(TxtMfCible.Text) / 100 Else msg += "Défaut de lecture sur Sable: humidité." & Environment.NewLine : Verif = False
            End With
            'Onglet Gravillon
            With Gravillon.Item(0)
                .NomGravillon = TxtNomGravillon.Text
                If gestionderreur(TxtdGravillon, EP1) = True Then .dg = CDbl(TxtdGravillon.Text) Else msg += "Défaut de lecture sur Gravillon: d mini." & Environment.NewLine : Verif = False
                If gestionderreur(TxtDmGravillon, EP1) = True Then .Dmg = CDbl(TxtDmGravillon.Text) Else msg += "Défaut de lecture sur Gravillon: D Maxi" & Environment.NewLine : Verif = False
                If RBtnConcasseGravillon.Checked = True Then
                    .Forme = 1
                ElseIf RbtnRouleGravillon.Checked = True Then
                    .Forme = 2
                Else
                    msg += "La forme du Gravillon (concassé ou roulé) n'a pas été renseignée" & Environment.NewLine : Verif = False
                End If
                Select Case CbQualiteGranulat.Text
                    Case CbQualiteGranulat.Items(0).ToString
                        .Qualite = 1 'qualité A
                    Case CbQualiteGranulat.Items(1).ToString
                        .Qualite = 2 'qualité B
                    Case CbQualiteGranulat.Items(2).ToString
                        .Qualite = 3 'qualité C
                    Case CbQualiteGranulat.Items(3).ToString
                        .Qualite = 4 'qualité D
                    Case Else
                        msg += "La qualité du Gravillon (indice A, B, C ou D) n'a pas été renseignée" & Environment.NewLine : Verif = False
                End Select
                Select Case CbPetrographie.Text
                    Case CbPetrographie.Items(0).ToString
                        .Petrographie = 1 'siliceux altérés
                    Case CbPetrographie.Items(1).ToString
                        .Petrographie = 2 'siliceux roulés
                    Case CbPetrographie.Items(2).ToString
                        .Petrographie = 3 'calcaires, durs
                    Case Else
                        msg += "La pétrographie du Gravillon (siliceux, calcaire, etc. ...) n'a pas été renseignée" & Environment.NewLine : Verif = False
                End Select
                If gestionderreur(TxtDensiteSecheGravillon, EP1) = True Then .Densite = CDbl(TxtDensiteSecheGravillon.Text) Else msg += "Défaut de lecture sur Gravillon: Densité sèche" & Environment.NewLine : Verif = False '  
                If gestionderreur(TxtHumiditeGravillon, EP1) = True Then .Humidite = CDbl(TxtHumiditeGravillon.Text) / 100 Else msg += "Défaut de lecture sur Gravillon: taux d'humidité" & Environment.NewLine : Verif = False '  
                If gestionderreur(TxtWabsGravillon, EP1) = True Then .Wabs = CDbl(TxtWabsGravillon.Text) / 100 Else msg += "Défaut de lecture sur Gravillon: Coefficient d'absorption" & Environment.NewLine : Verif = False
                'Lecture du mode de référence de la granulométrie
                .Choix_mesureGranulo = CbRefusGravillon.SelectedIndex
            End With
            'Onglet Ciment & Additions
            With Beton.Ciment
                'caractéristique du ciment par défaut
                .Type = CbType.SelectedIndex + 1
                If .Type > 1 Then
                    Select Case CbClasse.Text
                        Case "A"
                            .Clinker = 1
                        Case "B"
                            .Clinker = 2
                        Case "C"
                            If .Type = 3 Then
                                .Clinker = 3
                            Else
                                EP1.SetError(CbClasse, "Pb lecture : CEM II de sous-type C ! Voir bug!")
                                msg += "Pb lecture : CEM II de sous-type C ! Voir bug!" & Environment.NewLine
                                Verif = False
                            End If
                        Case Else
                            EP1.SetError(CbClasse, "Indiquez le taux de clinker")
                            msg += "Vous avez oublié de renseigner le taux de clinker" & Environment.NewLine
                            Verif = False
                    End Select
                    Select Case CbSousClasse.Text
                        Case "S"
                            .Constituant = 1
                        Case "D"
                            .Constituant = 2
                        Case "P"
                            .Constituant = 3
                        Case "Q"
                            .Constituant = 4
                        Case "V"
                            .Constituant = 5
                        Case "W"
                            .Constituant = 6
                        Case "T"
                            .Constituant = 7
                        Case "L"
                            .Constituant = 8
                        Case "LL"
                            .Constituant = 9
                        Case Else
                            EP1.SetError(CbSousClasse, "Indiquez le 2ième constituant du ciment")
                            msg += "Vous avez oublié de renseigner le 2ième constituant du ciment" & Environment.NewLine
                            Verif = False
                    End Select
                ElseIf .Type > 3 OrElse .Type < 1 Then
                    EP1.SetError(CbType, "Indiquez le type de ciment")
                    msg += "Vous avez oublié de renseigner le type de ciment" & Environment.NewLine
                    Verif = False
                End If



                If gestionderreur(TxtDensiteCiment, EP1) = True Then .Densite = CDbl(TxtDensiteCiment.Text) Else msg += "Défaut de lecture Ciment: densité." & Environment.NewLine : Verif = False
                'Classe vrai du ciment par défaut
                If gestionderreur(TxtClasseVrai325, EP1) = True Then .FcE325 = CInt(TxtClasseVrai325.Text) Else msg += "Défaut de lecture Ciment: Classe Vraie 325." & Environment.NewLine : Verif = False '   .Text = .ToString("#0")
                If gestionderreur(TxtClasseVrai425, EP1) = True Then .FcE425 = CInt(TxtClasseVrai425.Text) Else msg += "Défaut de lecture Ciment: Classe Vraie 425." & Environment.NewLine : Verif = False ' .Text = .ToString("#0")
                If gestionderreur(TxtClasseVrai525, EP1) = True Then .FcE525 = CInt(TxtClasseVrai525.Text) Else msg += "Défaut de lecture Ciment: Classe Vraie 525." & Environment.NewLine : Verif = False ' .Text = .ToString("#0")
            End With
            With Addition
                If gestionderreur(TxtFcalcaireCatA, EP1) = True Then .L_dens = CDbl(TxtFcalcaireCatA.Text) Else msg += "Défaut de lecture Additions: densité calcaire A ." & Environment.NewLine : Verif = False
                If gestionderreur(TxtkcalcaireCatA, EP1) = True Then .L_k = CDbl(TxtkcalcaireCatA.Text) Else msg += "Défaut de lecture Additions: coef k calcaire A ." & Environment.NewLine : Verif = False '.Text = .ToString("#0.00") : TxtkcalcaireCatA.Text = .L_k.ToString("#0.00")
                If gestionderreur(TxtFcalcaireCatB, EP1) = True Then .LL_dens = CDbl(TxtFcalcaireCatB.Text) Else msg += "Défaut de lecture Additions: densité calcaire B ." & Environment.NewLine : Verif = False
                If gestionderreur(TxtkcalcaireCatB, EP1) = True Then .LL_k = CDbl(TxtkcalcaireCatB.Text) Else msg += "Défaut de lecture Additions: coef k calcaire B." & Environment.NewLine : Verif = False
                If gestionderreur(TxtFMetakaolin, EP1) = True Then .MK_dens = CDbl(TxtFMetakaolin.Text) Else msg += "Défaut de lecture Additions: densité Métakaolin ." & Environment.NewLine : Verif = False
                If gestionderreur(TxtkMetakaolin, EP1) = True Then .MK_k = CDbl(TxtkMetakaolin.Text) Else msg += "Défaut de lecture Additions: coef k Métakaolin." & Environment.NewLine : Verif = False
                If gestionderreur(TxtFCV, EP1) = True Then .V_dens = CDbl(TxtFCV.Text) Else msg += "Défaut de lecture Additions: densité cendre volante siliceuse." & Environment.NewLine : Verif = False
                If gestionderreur(TxtkCV, EP1) = True Then .V_k = CDbl(TxtkCV.Text) Else msg += "Défaut de lecture Additions: coef k Cendre volante siliceuse." & Environment.NewLine : Verif = False
                If gestionderreur(TxtFLV, EP1) = True Then .S_dens = CDbl(TxtFLV.Text) Else msg += "Défaut de lecture Additions: densité laitier vitrifié." & Environment.NewLine : Verif = False
                If gestionderreur(TxtkLV, EP1) = True Then .S_k = CDbl(TxtkLV.Text) Else msg += "Défaut de lecture Additions: coef k Laitier vitrifié." & Environment.NewLine : Verif = False
                If gestionderreur(TxtFFS, EP1) = True Then .D_dens = CDbl(TxtFFS.Text) Else msg += "Défaut de lecture Additions: densité fumée de silice." & Environment.NewLine : Verif = False
                If gestionderreur(TxtkFS, EP1) = True Then .D_k = CDbl(TxtkFS.Text) Else msg += "Défaut de lecture Additions: coef k fumée de silice." & Environment.NewLine : Verif = False
                If gestionderreur(TxtFsiliceuse, EP1) = True Then .U_dens = CDbl(TxtFsiliceuse.Text) Else msg += "Défaut de lecture Additions: densité addition siliceuse." & Environment.NewLine : Verif = False
                If gestionderreur(Txtksiliceuse, EP1) = True Then .U_k = CDbl(Txtksiliceuse.Text) Else msg += "Défaut de lecture Additions: coef k addition siliceuse." & Environment.NewLine : Verif = False

            End With
            'Onglet Formulation Dreux-Gorisse
            With Aff
                'bornes pour le tableau du coefficient de compacité
                If gestionderreur(TxtConsistancePlastiqueMolle, EP1) = True Then .BorneMollePlastique = CInt(TxtConsistancePlastiqueMolle.Text) Else Verif = False : msg += "Défaut sur lecture borne Plastique/Molle méthode Dreux-Gorisse" & Environment.NewLine
                If gestionderreur(TxtConsistancePlastiqueFerme, EP1) = True Then .BornePlastiqueFerme = CInt(TxtConsistancePlastiqueFerme.Text) Else Verif = False : msg += "Défaut sur lecture borne Plastique/Ferme méthode Dreux-Gorisse" & Environment.NewLine
            End With
            'Onglet Formulation Baron - Ollivier
            With Aff
                'Coefficient de majoration en cas de granulats concassés
                If gestionderreur(TxtBaron_kTableauD, EP1) = True Then .BaronCoefTabD = CDbl(TxtBaron_kTableauD.Text) / 100 Else Verif = False : msg += "Défaut sur lecture Coefficient majoration méthode Baron-Ollivier" & Environment.NewLine
            End With
        Catch ex As Exception
            Verif = False
            MessageBox.Show("Erreur lors de lecture des données renseignées: " & Environment.NewLine & ex.Message & ex.StackTrace, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub

    ''' <summary>Lecture des données spécifiques au béton suivant la méthode de formulation retenue</summary>
    '''  <param name="Verif">Renvoi FALSE si pb de lecture des données</param>
    '''  <param name="msg">message indiquant les défauts relevés lors de la lecture conduisant à l'Erreur en lecture</param> 
    Private Sub Lecture_Onglet_Beton(ByRef Verif As Boolean, ByRef msg As String)
        With Beton
            Select Case .Formulation
                Case 1 'Méthode Dreux-Gorisse
                    'Ouvrabilité
                    If .Slump > 22 Then
                        msg += "Ouvrabilité : impossible de lire la classe d'affaissement." : Verif = False
                    Else
                        .Slump = CbConsistance.SelectedIndex + 1
                    End If
                    '-> Coefficient de majoration pour détermination de fcm
                    If gestionderreur(TxtFactMajorationFc28, EP1) = True Then .FcmCoef = CDbl(TxtFactMajorationFc28.Text) Else msg += "Coefficient de majoration pour détermination de fcm : impossible de lire la valeur." : Verif = False
                    'Vibration
                    .Vibration = CbVibration.SelectedIndex + 1
                Case 2 'Méthode Baron Ollivier
                    'Ouvrabilité
                    .Slump = CbConsistance.SelectedIndex + 1
                    If .Slump > 4 Then msg += "Ouvrabilité : impossible de lire la classe d'affaissement." : Verif = False
            End Select
        End With
    End Sub

    ''' <summary>Affichage des données dans les différents onglets
    ''' </summary>
    Private Sub Affichage()
        'Onglet général
        TxtChantier.Text = Aff.Chantier
        TxtRedacteur.Text = Aff.Redacteur
        If Aff.i_result = 1 Then RbtnResultDefaut.Checked = True Else RbtnResultPerso.Checked = True
        If Aff.i_data = 1 Then RbtnDatadefaut.Checked = True Else RbtndataPerso.Checked = True
        LblData.Text = Aff.msgData
        LblResult.Text = Aff.msgResult
        TxtAide_Hauteur.Text = Aff.Aide_Hauteur.ToString("#0")
        TxtAide_Largeur.Text = Aff.Aide_Largeur.ToString("#0")
        'Onglet Editeur
        Select Case Aff.Editeur
            Case 1
                RbtnEditeurInterne.Checked = True
            Case 2
                RbtnWordPad.Checked = True
            Case 3
                RbtnWord.Checked = True
        End Select

        'Onglet Béton
        With Beton
            '--> Formulation retenue par Défaut
            Select Case .Formulation
                Case 1
                    CbFormulation.Text = CbFormulation.Items(0).ToString
                Case 2
                    CbFormulation.Text = CbFormulation.Items(1).ToString
            End Select
            'Affichage invariable suivant la méthode de formulation choisie
            '--> Durabilité
            Select Case .EN206
                Case 0
                    ChkbExigenceEN206.Checked = False
                Case 1, 2
                    ChkbExigenceEN206.Checked = True
            End Select
            '--> Resistance caractéristique suivant EN206-1
            Select Case .EN206_Fc
                Case True
                    CbEN206.Text = CbEN206.Items(0).ToString
                    CbFc28.Visible = True
                    CbFc28.Left = 355 : CbFc28.Top = 138
                    Select Case Beton.Fck
                        Case 8
                            CbFc28.Text = CbFc28.Items(0).ToString '"C8/10"
                        Case 12 '"C12/15"
                            CbFc28.Text = CbFc28.Items(1).ToString '  .Fck = 12
                        Case 16 '"C16/20"
                            CbFc28.Text = CbFc28.Items(2).ToString '  .Fck = 16
                        Case 20 '"C20/25"
                            CbFc28.Text = CbFc28.Items(3).ToString '   .Fck = 20
                        Case 25 '"C25/30"
                            CbFc28.Text = CbFc28.Items(4).ToString ' .Fck = 25
                        Case 30 '"C30/37"
                            CbFc28.Text = CbFc28.Items(5).ToString '  .Fck = 30
                        Case 35 '"C35/45"
                            CbFc28.Text = CbFc28.Items(6).ToString '  .Fck = 35
                        Case 40 '"C40/50"
                            CbFc28.Text = CbFc28.Items(7).ToString '  .Fck = 40
                        Case 45 '"C45/55"
                            CbFc28.Text = CbFc28.Items(8).ToString '  .Fck = 45
                        Case 50 '"C50/60"
                            CbFc28.Text = CbFc28.Items(9).ToString ' .Fck = 50
                        Case 55 '"C55/67"
                            CbFc28.Text = CbFc28.Items(10).ToString '  .Fck = 55
                        Case Else
                            CbFc28.Text = CbFc28.Items(4).ToString ' 
                            .Fck = 25
                    End Select
                    TxtFc.Visible = False : LblFcMpa.Visible = False
                Case False
                    CbEN206.Text = CbEN206.Items(1).ToString
                    CbFc28.Visible = False
                    TxtFc.Visible = True : LblFcMpa.Visible = True
                    TxtFc.Text = .Fck.ToString("#0")
            End Select
            'Affichage variable suivant la méthode de formulation choisie
            Call Affichage_Onglet_Beton()
        End With

        'onglet Sable
        With Sable.Item(0)
            TxtNomSable.Text = .NomSable.ToString
            TxtdSable.Text = .ds.ToString("#0.000")
            TxtDmSable.Text = .Dms.ToString("#0.000")
            Select Case .Forme
                Case 1
                    RbtnConcasseSable.Checked = True
                Case 2
                    RbtnRouleSable.Checked = True
            End Select
            TxtDensiteSecheSable.Text = .Densite.ToString("#0.00")
            TxtHumiditeSable.Text = (.Humidite * 100).ToString("#0.00")
            TxtWabsSable.Text = (.Wabs * 100).ToString("#0.00")
            'Affichage du mode de référence de la granulométrie
            CbRefusSable.SelectedIndex = .Choix_mesureGranulo
            CbRefusSable.Text = CbRefusSable.SelectedItem.ToString
            TxtFines.Text = (.TeneurFines * 100).ToString("#0.00")
            TxtMfCible.Text = .mfCible.ToString("#0.00")
        End With

        'Onglet Gravillon
        With Gravillon.Item(0)
            TxtNomGravillon.Text = .NomGravillon.ToString
            TxtdGravillon.Text = .dg.ToString("#0.000")
            TxtDmGravillon.Text = .Dmg.ToString("#0.000")
            Select Case .Forme
                Case 1
                    RBtnConcasseGravillon.Checked = True
                Case 2
                    RbtnRouleGravillon.Checked = True
            End Select
            'Qualité du gravillon
            Select Case .Qualite
                Case 1 'qualité A
                    CbQualiteGranulat.Text = CbQualiteGranulat.Items(0).ToString
                Case 2 'Qualité B
                    CbQualiteGranulat.Text = CbQualiteGranulat.Items(1).ToString
                Case 3 'Qualité C
                    CbQualiteGranulat.Text = CbQualiteGranulat.Items(2).ToString
                Case 4 'Qualité D
                    CbQualiteGranulat.Text = CbQualiteGranulat.Items(3).ToString
            End Select
            'Pétrographie du gravillon
            Select Case .Petrographie
                Case 1 'siliceux altérés
                    CbPetrographie.Text = CbPetrographie.Items(0).ToString
                Case 2 'siliceux roulés
                    CbPetrographie.Text = CbPetrographie.Items(1).ToString
                Case 3 'calcaire dur
                    CbPetrographie.Text = CbPetrographie.Items(2).ToString
            End Select
            TxtDensiteSecheGravillon.Text = .Densite.ToString("#0.00")
            TxtHumiditeGravillon.Text = (.Humidite * 100).ToString("#0.00")
            TxtWabsGravillon.Text = (.Wabs * 100).ToString("#0.00")
            'Affichage du mode de référence de la granulométrie
            CbRefusGravillon.SelectedIndex = .Choix_mesureGranulo
            CbRefusGravillon.Text = CbRefusGravillon.SelectedItem.ToString
        End With
        'Onglet Ciment & Additions
        With Beton.Ciment
            'caractéristique du ciment par défaut
            Select Case .Type
                Case 1 'CEM I
                    CbClasse.Visible = False : CbSousClasse.Visible = False : LblClasse.Visible = False : LblSousClasse.Visible = False
                    CbType.Text = CbType.Items.Item(0).ToString()
                    BtnHlpCimentCaractéristique.Left = 159 : BtnHlpCimentCaractéristique.Top = 45
                    TxtDensiteCiment.Text = .Densite_CEM_I.ToString("#0.00")
                Case 2 'CEM II
                    CbType.Text = CbType.Items.Item(1).ToString()
                    CbClasse.Items.Clear() : CbClasse.Items.AddRange(New String() {"A", "B"})
                    BtnHlpCimentCaractéristique.Left = 419 : BtnHlpCimentCaractéristique.Top = 45
                    Call Affichage_CEM_II()
                Case 3 'CEM III
                    CbType.Text = CbType.Items.Item(2).ToString()
                    CbClasse.Items.Clear() : CbClasse.Items.AddRange(New String() {"A", "B", "C"})
                    BtnHlpCimentCaractéristique.Left = 419 : BtnHlpCimentCaractéristique.Top = 45
                    Call Affichage_CEM_III()
            End Select
            TxtDensiteCiment.Text = .Densite.ToString("#0.00")

            'Classe vrai du ciment par défaut
            TxtClasseVrai325.Text = .FcE325.ToString("#0")
            TxtClasseVrai425.Text = .FcE425.ToString("#0")
            TxtClasseVrai525.Text = .FcE525.ToString("#0")
        End With
        With Addition
            TxtFcalcaireCatA.Text = .L_dens.ToString("#0.00") : TxtkcalcaireCatA.Text = .L_k.ToString("#0.00")
            TxtFcalcaireCatB.Text = .LL_dens.ToString("#0.00") : TxtkcalcaireCatB.Text = .LL_k.ToString("#0.00")
            TxtFMetakaolin.Text = .MK_dens.ToString("#0.00") : TxtkMetakaolin.Text = .MK_k.ToString("#0.00")
            TxtFCV.Text = .V_dens.ToString("#0.00") : TxtkCV.Text = .V_k.ToString("#0.00")
            TxtFLV.Text = .S_dens.ToString("#0.00") : TxtkLV.Text = .S_k.ToString("#0.00")
            TxtFFS.Text = .D_dens.ToString("#0.00") : TxtkFS.Text = .D_k.ToString("#0.00")
            TxtFsiliceuse.Text = .U_dens.ToString("#0.00") : Txtksiliceuse.Text = .U_k.ToString("#0.00")
        End With
        'Onglet Formulation Dreux-Gorisse
        With Aff
            'bornes pour le tableau du coefficient de compacité
            TxtConsistancePlastiqueMolle.Text = .BorneMollePlastique.ToString("#0")
            TxtConsistancePlastiqueFerme.Text = .BornePlastiqueFerme.ToString("#0")
        End With
        'Onglet Formulation Baron - Ollivier
        With Aff
            'Coefficient de majoration en cas de granulats concassés
            TxtBaron_kTableauD.Text = (.BaronCoefTabD * 100).ToString("#0.0")
        End With
    End Sub
    Private Sub Affichage_Onglet_Beton()
        With Beton
            Select Case .Formulation
                Case 1 'Méthode Dreux-Gorisse
                    'ce qui signifie que le projeteur vient de passer de la méthode Dreux-Gorisse à la méthode Baron-Ollivier
                    'Affichage de la valeur par défaut dans le logiciel
                    CbConsistance.Items.Clear()
                    CbConsistance.Items.AddRange(New String() {"1", "1,5", "2", "2,5", "3", "3,5", "4", "4,5", "5", "5,5", "6", "6,5", "7", "7,5", "8", "8,5", "9", "9,5", "10", "10,5", "11", "11,5", "12"})
                    CbConsistance.Text = CbConsistance.Items(.Slump - 1).ToString
                    LblOuvrabilite_cm.Visible = True
                    '-> Coefficient de majoration pour détermination de fcm
                    LblCoefMajoration.Visible = True : TxtFactMajorationFc28.Visible = True : BtnHlpCoefMajoration.Visible = True
                    TxtFactMajorationFc28.Text = .FcmCoef.ToString("#0.00")
                    'Vibration
                    LblVibration.Visible = True : BtnHlpVibration.Visible = True : CbVibration.Visible = True
                    Select Case .Vibration
                        Case 1
                            CbVibration.Text = CbVibration.Items(0).ToString
                        Case 2
                            CbVibration.Text = CbVibration.Items(1).ToString
                        Case 3
                            CbVibration.Text = CbVibration.Items(2).ToString
                        Case 4 'Puissant
                            CbVibration.Text = CbVibration.Items(3).ToString
                    End Select
                Case 2 'Méthode Baron Ollivier
                    CbConsistance.Items.Clear()
                    CbConsistance.Items.AddRange(New String() {"S1", "S2", "S3", "S4"})
                    If .Slump < 5 Then
                        CbConsistance.Text = CbConsistance.Items.Item(.Slump - 1).ToString()
                    Else
                        .Slump = 2
                        CbConsistance.Text = CbConsistance.Items.Item(.Slump - 1).ToString() 'S2
                        MessageBox.Show("Affichage de la valeur de consistance par défaut, la valeur de la variable Slump > 4" & Environment.NewLine & "A corriger si nécessaire", "Formulaire Exigence - Affichage des données", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End If
                    LblOuvrabilite_cm.Visible = False
                    'Résistance fkc28
                    LblCoefMajoration.Visible = False : TxtFactMajorationFc28.Visible = False : BtnHlpCoefMajoration.Visible = False
                    'Vibration
                    LblVibration.Visible = False : BtnHlpVibration.Visible = False : CbVibration.Visible = False
            End Select
        End With
    End Sub
    Private Sub Affichage_CEM_II()
        With Beton.Ciment
            Select Case .Clinker
                Case 1
                    CbClasse.Text = CbClasse.Items.Item(0).ToString()
                Case 2
                    CbClasse.Text = CbClasse.Items.Item(1).ToString()
            End Select
            Call Affichage_Constituant()
        End With
    End Sub
    Private Sub Affichage_CEM_III()
        With Beton.Ciment
            Select Case .Clinker
                Case 1
                    CbClasse.Text = CbClasse.Items.Item(0).ToString()
                Case 2
                    CbClasse.Text = CbClasse.Items.Item(1).ToString()
                Case 3
                    CbClasse.Text = CbClasse.Items.Item(2).ToString()
            End Select
            Call Affichage_Constituant()
        End With
    End Sub
    Private Sub Affichage_Constituant()
        With Beton.Ciment
            Select Case .Constituant
                Case 1 '=S
                    CbSousClasse.Text = CbSousClasse.Items.Item(0).ToString()
                    TxtDensiteCiment.Text = .Densite_CEM_II_S.ToString("#0.00")
                Case 2 '=D
                    CbSousClasse.Text = CbSousClasse.Items.Item(1).ToString()
                    TxtDensiteCiment.Text = .Densite_CEM_II_D.ToString("#0.00")
                Case 3 '=P
                    CbSousClasse.Text = CbSousClasse.Items.Item(2).ToString()
                    TxtDensiteCiment.Text = .Densite_CEM_II_III.ToString("#0.00")'Provisoire
                Case 4 '=Q
                    CbSousClasse.Text = CbSousClasse.Items.Item(3).ToString()
                    TxtDensiteCiment.Text = .Densite_CEM_II_III.ToString("#0.00")'Provisoire
                Case 5 '=V
                    CbSousClasse.Text = CbSousClasse.Items.Item(4).ToString()
                    TxtDensiteCiment.Text = .Densite_CEM_II_VW.ToString("#0.00")
                Case 6 '=W
                    CbSousClasse.Text = CbSousClasse.Items.Item(5).ToString()
                    TxtDensiteCiment.Text = .Densite_CEM_II_VW.ToString("#0.00")
                Case 7 '=T
                    CbSousClasse.Text = CbSousClasse.Items.Item(6).ToString()
                    TxtDensiteCiment.Text = .Densite_CEM_II_III.ToString("#0.00")'Provisoire
                Case 8 '=L
                    CbSousClasse.Text = CbSousClasse.Items.Item(7).ToString()
                    TxtDensiteCiment.Text = .Densite_CEM_II_L.ToString("#0.00")
                Case 9 '=LL
                    CbSousClasse.Text = CbSousClasse.Items.Item(8).ToString()
                    TxtDensiteCiment.Text = .Densite_CEM_II_L.ToString("#0.00")
            End Select
        End With
    End Sub
    Private Sub BtnResultModif_Click(sender As System.Object, e As System.EventArgs) Handles BtnResultModif.Click
        Try
            With FolderBrowserDialog1
                'En principe, après avoir créé un FolderBrowserDialog, vous définissez RootFolder à l'emplacement à partir duquel commencer la navigation. 
                'Vous pouvez choisir un emplacement dans la liste des dossiers système spéciaux, notamment Program Files, Programmes, System ou Démarrage, qui contiennent des informations communes.  
                .RootFolder = Environment.SpecialFolder.Desktop
                ' Si vous le voulez, vous pouvez aussi définir la propriété Description afin de fournir des instructions supplémentaires à l'utilisateur.
                .Description = "Selectionnez le répertoire ..."
                ' Vous pouvez utiliser la propriété ShowNewFolderButton pour déterminer si l'utilisateur est en mesure de créer des dossiers à l'aide du bouton Nouveau dossier.
                .ShowNewFolderButton = True
                If .ShowDialog = DialogResult.OK Then
                    If .SelectedPath = String.Empty Then
                        MessageBox.Show("Aucune sélection", "Modification de répertoire ...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    Else
                        LblResult.Text = .SelectedPath
                    End If
                End If
            End With
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Modification de répertoire ...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub

    Private Sub RbtnResultDefaut_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles RbtnResultDefaut.CheckedChanged
        If RbtnResultDefaut.Checked = True Then BtnResultModif.Visible = False : LblResult.Text = Directory.GetCurrentDirectory.ToString()
    End Sub

    Private Sub RbtnResultPerso_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles RbtnResultPerso.CheckedChanged
        If RbtnResultPerso.Checked = True Then BtnResultModif.Visible = True : BtnResultModif.Focus()
    End Sub

    Private Sub RbtnDatadefaut_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles RbtnDatadefaut.CheckedChanged
        If RbtnDatadefaut.Checked = True Then BtnDataModif.Visible = False : LblData.Text = Directory.GetCurrentDirectory.ToString()
    End Sub

    Private Sub RbtndataPerso_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles RbtndataPerso.CheckedChanged
        If RbtndataPerso.Checked = True Then BtnDataModif.Visible = True : BtnDataModif.Focus()
    End Sub

    Private Sub BtnDataModif_Click(sender As System.Object, e As System.EventArgs) Handles BtnDataModif.Click
        Try
            With FolderBrowserDialog1
                .RootFolder = Environment.SpecialFolder.Desktop
                .Description = "Selectionnez le répertoire ..."
                .ShowNewFolderButton = True
                If .ShowDialog = DialogResult.OK Then
                    If .SelectedPath = String.Empty Then
                        MessageBox.Show("Aucune sélection", "Modification de répertoire ...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    Else
                        LblData.Text = .SelectedPath
                    End If
                End If
            End With
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Modification de répertoire ...", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub

#Region "Gestion des boutons d'aide"

#Region "Onglet Beton"
    Private Sub BtnHlpFormulation_Click(sender As Object, e As EventArgs) Handles BtnHlpFormulation.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 10
        frm1.Show()
    End Sub

    Private Sub BtnHlpExigenceEN206_Click(sender As Object, e As EventArgs) Handles BtnHlpExigenceEN206.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 22
        frm1.Show()
    End Sub

    Private Sub BtnHlpCoefMajoration_Click(sender As Object, e As EventArgs) Handles BtnHlpCoefMajoration.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 8
        frm1.Show()
    End Sub

    Private Sub BtnHlpResistanceCompression_Click(sender As Object, e As EventArgs) Handles BtnHlpResistanceCompression.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 9
        frm1.Show()
    End Sub
    Private Sub BtnHlpOuvrabilite_Click(sender As Object, e As EventArgs) Handles BtnHlpOuvrabilite.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 2
        frm1.Show()
    End Sub

    Private Sub BtnHlpVibration_Click(sender As Object, e As EventArgs) Handles BtnHlpVibration.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 12
        frm1.Show()
    End Sub
#End Region

#Region "Onglet Sable"
    Private Sub btnHlpFormeSable_Click(sender As Object, e As EventArgs) Handles btnHlpFormeSable.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 1
        frm1.Show()
    End Sub

    Private Sub btnHlpDensiteSecheSable_Click(sender As Object, e As EventArgs) Handles btnHlpDensiteSecheSable.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 5
        frm1.Show()
    End Sub

    Private Sub BtnHlpHumiditeSable_Click(sender As Object, e As EventArgs) Handles BtnHlpHumiditeSable.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 4
        frm1.Show()
    End Sub

    Private Sub BtnHlpWabsSable_Click(sender As Object, e As EventArgs) Handles BtnHlpWabsSable.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 30
        frm1.Show()
    End Sub
    Private Sub BtnHlpFines_Click(sender As Object, e As EventArgs) Handles BtnHlpFines.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 26
        frm1.Show()
    End Sub
#End Region

#Region "Onglet Gravillon"
    Private Sub btnHlpDensiteSecheGravillon_Click(sender As Object, e As EventArgs) Handles btnHlpDensiteSecheGravillon.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 7
        frm1.Show()
    End Sub

    Private Sub BtnHlpHumiditeGravillon_Click(sender As Object, e As EventArgs) Handles BtnHlpHumiditeGravillon.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 6
        frm1.Show()
    End Sub

    Private Sub BtnHlpWabsGravillon_Click(sender As Object, e As EventArgs) Handles BtnHlpWabsGravillon.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 31
        frm1.Show()
    End Sub

    Private Sub BtnHlpQualiteGravillon_Click(sender As Object, e As EventArgs) Handles BtnHlpQualiteGravillon.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 25
        frm1.Show()
    End Sub

    Private Sub BtnHlpTypeGravillon_Click(sender As Object, e As EventArgs) Handles BtnHlpTypeGravillon.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 1
        frm1.Show()
    End Sub
#End Region

#Region "Onglet Ciment et Additions"
    Private Sub BtnHlpCimentCaractéristique_Click(sender As Object, e As EventArgs) Handles BtnHlpCimentCaractéristique.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 20
        frm1.Show()
    End Sub
    Private Sub BtnHlpDensite_Click(sender As Object, e As EventArgs) Handles BtnHlpDensite.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 32
        frm1.Show()
    End Sub
    Private Sub BtnHlpClasseVraiCiment_Click(sender As Object, e As EventArgs) Handles BtnHlpClasseVraiCiment.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 13
        frm1.Show()
    End Sub
    Private Sub BtnHlpAddition_Click(sender As Object, e As EventArgs) Handles BtnHlpAddition.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 21
        frm1.Show()
    End Sub
#End Region

#Region "Onglet Méthode Dreux-Gorisse"
    Private Sub BtnHllpConsistance_Click(sender As Object, e As EventArgs) Handles BtnHllpConsistance.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 15
        frm1.Show()
    End Sub
#End Region

#Region "Onglet Méthode Baron-Ollivier"
    Private Sub BtnHlpBaronCoefMajoration_Click(sender As Object, e As EventArgs) Handles BtnHlpBaronCoefMajoration.Click
        Dim frm1 As frmAide
        frm1 = New frmAide
        Aff.FichierAide = 27
        frm1.Show()
    End Sub
#End Region

#End Region

#Region "Gestion des Textbox"

#Region "Onglet General"
    Private Sub TextFc_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtFc.Enter
        TxtFc.SelectionStart = 0
        TxtFc.SelectionLength = TxtFc.Text.Length
    End Sub

    Private Sub TextFc_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles TxtFc.KeyPress
        Call Gestion_Keypress(e, TxtFc, True, True)
    End Sub

    Private Sub TxtAide_Largeur_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtAide_Largeur.Enter
        TxtAide_Largeur.SelectionStart = 0
        TxtAide_Largeur.SelectionLength = TxtAide_Largeur.Text.Length
    End Sub

    Private Sub TxtAide_Largeur_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles TxtAide_Largeur.KeyPress
        Call Gestion_Keypress(e, TxtAide_Largeur, True, True)
    End Sub

    Private Sub TxtAide_Hauteur_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtAide_Hauteur.Enter
        TxtAide_Hauteur.SelectionStart = 0
        TxtAide_Hauteur.SelectionLength = TxtAide_Hauteur.Text.Length
    End Sub

    Private Sub TxtAide_Hauteur_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles TxtAide_Hauteur.KeyPress
        Call Gestion_Keypress(e, TxtAide_Hauteur, True, True)
    End Sub
#End Region

#Region "Ciment"
    Private Sub TxtDensite_Enter(sender As Object, e As EventArgs) Handles TxtDensiteCiment.Enter
        TxtDensiteCiment.SelectionStart = 0
        TxtDensiteCiment.SelectionLength = TxtDensiteCiment.Text.Length
    End Sub

    Private Sub TxtDensite_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtDensiteCiment.KeyPress
        Call Gestion_Keypress(e, TxtDensiteCiment, True, False)
    End Sub

    Private Sub TxtClasseVrai325_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtClasseVrai325.Enter, TxtClasseVrai325.Click
        TxtClasseVrai325.SelectionStart = 0
        TxtClasseVrai325.SelectionLength = TxtClasseVrai325.Text.Length
    End Sub

    Private Sub TxtClasseVrai325_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtClasseVrai325.KeyPress
        Call Gestion_Keypress(e, TxtClasseVrai325, True, True)
    End Sub
    Private Sub TxtClasseVrai425_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtClasseVrai425.Enter, TxtClasseVrai425.Click
        TxtClasseVrai425.SelectionStart = 0
        TxtClasseVrai425.SelectionLength = TxtClasseVrai425.Text.Length
    End Sub

    Private Sub TxtClasseVrai425_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtClasseVrai425.KeyPress
        Call Gestion_Keypress(e, TxtClasseVrai425, True, True)
    End Sub
    Private Sub TxtClasseVrai525_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtClasseVrai525.Enter
        TxtClasseVrai525.SelectionStart = 0
        TxtClasseVrai525.SelectionLength = TxtClasseVrai525.Text.Length
    End Sub

    Private Sub TxtClasseVrai525_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtClasseVrai525.KeyPress
        Call Gestion_Keypress(e, TxtClasseVrai525, True, True)
    End Sub
#End Region

#Region "Additions"
    Private Sub TxtFcalcaireCatA_Enter(sender As Object, e As EventArgs) Handles TxtFcalcaireCatA.Enter
        TxtFcalcaireCatA.SelectionStart = 0
        TxtFcalcaireCatA.SelectionLength = TxtFcalcaireCatA.Text.Length
    End Sub
    Private Sub TxtFcalcaireCatA_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtFcalcaireCatA.KeyPress
        Call Gestion_Keypress(e, TxtFcalcaireCatA, True, False)
    End Sub

    Private Sub TxtkcalcaireCatA_Enter(sender As Object, e As EventArgs) Handles TxtkcalcaireCatA.Enter
        TxtkcalcaireCatA.SelectionStart = 0
        TxtkcalcaireCatA.SelectionLength = TxtkcalcaireCatA.Text.Length
    End Sub

    Private Sub TxtkcalcaireCatA_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtkcalcaireCatA.KeyPress
        Call Gestion_Keypress(e, TxtkcalcaireCatA, True, False)
    End Sub
    Private Sub TxtFcalcaireCatB_Enter(sender As Object, e As EventArgs) Handles TxtFcalcaireCatB.Enter
        TxtFcalcaireCatB.SelectionStart = 0
        TxtFcalcaireCatB.SelectionLength = TxtFcalcaireCatB.Text.Length
    End Sub
    Private Sub TxtFcalcaireCatB_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtFcalcaireCatB.KeyPress
        Call Gestion_Keypress(e, TxtFcalcaireCatB, True, False)
    End Sub

    Private Sub TxtkcalcaireCatB_Enter(sender As Object, e As EventArgs) Handles TxtkcalcaireCatB.Enter
        TxtkcalcaireCatB.SelectionStart = 0
        TxtkcalcaireCatB.SelectionLength = TxtkcalcaireCatB.Text.Length
    End Sub
    Private Sub TxtkcalcaireCatB_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtkcalcaireCatB.KeyPress
        Call Gestion_Keypress(e, TxtkcalcaireCatB, True, False)
    End Sub

    Private Sub TxtFMetakaolin_Enter(sender As Object, e As EventArgs) Handles TxtFMetakaolin.Enter
        TxtFMetakaolin.SelectionStart = 0
        TxtFMetakaolin.SelectionLength = TxtFMetakaolin.Text.Length
    End Sub

    Private Sub TxtFMetakaolin_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtFMetakaolin.KeyPress
        Call Gestion_Keypress(e, TxtFMetakaolin, True, False)
    End Sub
    Private Sub TxtkMetakaolin_Enter(sender As Object, e As EventArgs) Handles TxtkMetakaolin.Enter
        TxtkMetakaolin.SelectionStart = 0
        TxtkMetakaolin.SelectionLength = TxtkMetakaolin.Text.Length
    End Sub

    Private Sub TxtkMetakaolin_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtkMetakaolin.KeyPress
        Call Gestion_Keypress(e, TxtkMetakaolin, True, False)
    End Sub

    Private Sub TxtFCV_Enter(sender As Object, e As EventArgs) Handles TxtFCV.Enter
        TxtFCV.SelectionStart = 0
        TxtFCV.SelectionLength = TxtFCV.Text.Length
    End Sub

    Private Sub TxtFCV_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtFCV.KeyPress
        Call Gestion_Keypress(e, TxtFCV, True, False)
    End Sub

    Private Sub TxtkCV_Enter(sender As Object, e As EventArgs) Handles TxtkCV.Enter
        TxtkCV.SelectionStart = 0
        TxtkCV.SelectionLength = TxtkCV.Text.Length
    End Sub

    Private Sub TxtkCV_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtkCV.KeyPress
        Call Gestion_Keypress(e, TxtkCV, True, False)
    End Sub

    Private Sub TxtFLV_Enter(sender As Object, e As EventArgs) Handles TxtFLV.Enter
        TxtFLV.SelectionStart = 0
        TxtFLV.SelectionLength = TxtFLV.Text.Length
    End Sub

    Private Sub TxtFLV_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtFLV.KeyPress
        Call Gestion_Keypress(e, TxtFLV, True, False)
    End Sub

    Private Sub TxtkLV_Enter(sender As Object, e As EventArgs) Handles TxtkLV.Enter
        TxtkLV.SelectionStart = 0
        TxtkLV.SelectionLength = TxtkLV.Text.Length
    End Sub

    Private Sub TxtkLV_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtkLV.KeyPress
        Call Gestion_Keypress(e, TxtkLV, True, False)
    End Sub

    Private Sub TxtFFS_Enter(sender As Object, e As EventArgs) Handles TxtFFS.Enter
        TxtFFS.SelectionStart = 0
        TxtFFS.SelectionLength = TxtFFS.Text.Length
    End Sub

    Private Sub TxtFFS_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtFFS.KeyPress
        Call Gestion_Keypress(e, TxtFFS, True, False)
    End Sub

    Private Sub TxtkFS_Enter(sender As Object, e As EventArgs) Handles TxtkFS.Enter
        TxtkFS.SelectionStart = 0
        TxtkFS.SelectionLength = TxtkFS.Text.Length
    End Sub

    Private Sub TxtkFS_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtkFS.KeyPress
        Call Gestion_Keypress(e, TxtkFS, True, False)
    End Sub

    Private Sub TxtFsiliceuse_Enter(sender As Object, e As EventArgs) Handles TxtFsiliceuse.Enter
        TxtFsiliceuse.SelectionStart = 0
        TxtFsiliceuse.SelectionLength = TxtFsiliceuse.Text.Length
    End Sub

    Private Sub TxtFsiliceuse_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtFsiliceuse.KeyPress
        Call Gestion_Keypress(e, TxtFsiliceuse, True, False)
    End Sub

    Private Sub Txtksiliceuse_Enter(sender As Object, e As EventArgs) Handles Txtksiliceuse.Enter
        Txtksiliceuse.SelectionStart = 0
        Txtksiliceuse.SelectionLength = Txtksiliceuse.Text.Length
    End Sub

    Private Sub Txtksiliceuse_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Txtksiliceuse.KeyPress
        Call Gestion_Keypress(e, Txtksiliceuse, True, False)
    End Sub
#End Region

#Region "Dreux-Gorisse"
    Private Sub TxtConsistancePlastiqueMolle_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles TxtConsistancePlastiqueMolle.KeyPress
        Call Gestion_Keypress(e, TxtConsistancePlastiqueMolle, True, True)
    End Sub

    Private Sub TxtConsistancePlastiqueFerme_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles TxtConsistancePlastiqueFerme.KeyPress
        Call Gestion_Keypress(e, TxtConsistancePlastiqueFerme, True, True)
    End Sub
#End Region

    Private Sub TxtBaron_kTableauD_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles TxtBaron_kTableauD.KeyPress
        Call Gestion_Keypress(e, TxtBaron_kTableauD, True, True)
    End Sub

#End Region
    Private Sub CbType_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CbType.SelectedIndexChanged
        CbClasse.Visible = True : CbSousClasse.Visible = True : LblClasse.Visible = True : LblSousClasse.Visible = True
        Select Case CbType.SelectedIndex '.Type
            Case 0 '1 'CEM I
                CbClasse.Visible = False : CbSousClasse.Visible = False : LblClasse.Visible = False : LblSousClasse.Visible = False
                CbType.Text = CbType.Items.Item(0).ToString()
                BtnHlpCimentCaractéristique.Left = 159 : BtnHlpCimentCaractéristique.Top = 45
                TxtDensiteCiment.Text = Ciment.Densite_CEM_I.ToString("#0.00")
            Case 1 '2 'CEM II
                CbType.Text = CbType.Items.Item(1).ToString()
                CbClasse.Items.Clear() : CbClasse.Items.AddRange(New String() {"A", "B"})
                BtnHlpCimentCaractéristique.Left = 419 : BtnHlpCimentCaractéristique.Top = 45
                Call Affichage_CEM_II()
            Case 2 '3 'CEM III
                CbType.Text = CbType.Items.Item(2).ToString()
                CbClasse.Items.Clear() : CbClasse.Items.AddRange(New String() {"A", "B", "C"})
                BtnHlpCimentCaractéristique.Left = 419 : BtnHlpCimentCaractéristique.Top = 45
                Call Affichage_CEM_III()
        End Select
    End Sub

    Private Sub CbClasse_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CbClasse.SelectedIndexChanged
        Call Affichage_Constituant()
    End Sub

    Private Sub CbSousClasse_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CbSousClasse.SelectedIndexChanged

        Select Case CbSousClasse.SelectedIndex '.Constituant
            Case 0 '1 '=S
                ' CbSousClasse.Text = CbSousClasse.Items.Item(0).ToString()
                TxtDensiteCiment.Text = Ciment.Densite_CEM_II_S.ToString("#0.00")
            Case 1 '2 '=D
                ' CbSousClasse.Text = CbSousClasse.Items.Item(1).ToString()
                TxtDensiteCiment.Text = Ciment.Densite_CEM_II_D.ToString("#0.00")
            Case 2 '3 '=P
                'CbSousClasse.Text = CbSousClasse.Items.Item(2).ToString()
                TxtDensiteCiment.Text = Ciment.Densite_CEM_II_III.ToString("#0.00")'Provisoire
            Case 3 '4 '=Q
                ' CbSousClasse.Text = CbSousClasse.Items.Item(3).ToString()
                TxtDensiteCiment.Text = Ciment.Densite_CEM_II_III.ToString("#0.00")'Provisoire
            Case 4 '5 '=V
                ' CbSousClasse.Text = CbSousClasse.Items.Item(4).ToString()
                TxtDensiteCiment.Text = Ciment.Densite_CEM_II_VW.ToString("#0.00")
            Case 5 '6 '=W
                'CbSousClasse.Text = CbSousClasse.Items.Item(5).ToString()
                TxtDensiteCiment.Text = Ciment.Densite_CEM_II_VW.ToString("#0.00")
            Case 6 '7 '=T
                'CbSousClasse.Text = CbSousClasse.Items.Item(6).ToString()
                TxtDensiteCiment.Text = Ciment.Densite_CEM_II_III.ToString("#0.00")'Provisoire
            Case 7 '8 '=L
                'CbSousClasse.Text = CbSousClasse.Items.Item(7).ToString()
                TxtDensiteCiment.Text = Ciment.Densite_CEM_II_L.ToString("#0.00")
            Case 8 '9 '=LL
                'CbSousClasse.Text = CbSousClasse.Items.Item(8).ToString()
                TxtDensiteCiment.Text = Ciment.Densite_CEM_II_L.ToString("#0.00")
        End Select
    End Sub

    Private Sub BtnAffichageClasseExposition_Click(sender As Object, e As EventArgs) Handles BtnAffichageClasseExposition.Click
        Dim frm1 As New frmEnrobage
        'frm1.MdiParent = Me
        frm1.Show()
        frm1 = Nothing 'pour libérer la mémoire
    End Sub

    Private Sub ChkbExigenceEN206_CheckedChanged(sender As Object, e As EventArgs) Handles ChkbExigenceEN206.CheckedChanged
        If ChkbExigenceEN206.Checked = True Then
            BtnAffichageClasseExposition.Visible = True
        Else
            BtnAffichageClasseExposition.Visible = False
        End If
    End Sub

    Private Sub CbFormulation_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CbFormulation.SelectedIndexChanged
        Select Case CbFormulation.SelectedIndex
            Case 0
                Beton.Formulation = 1
            Case 1
                Beton.Formulation = 2
        End Select
        'La part invariable ne change pas
        'Appel de la partie variable
        Call Affichage_Onglet_Beton()
    End Sub

    Private Sub CbEN206_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CbEN206.SelectedIndexChanged
        Select Case CbEN206.SelectedIndex
            Case 0 'suivant EN206-1
                Beton.EN206_Fc = True
                TxtFc.Visible = False : LblFcMpa.Visible = False
                CbFc28.Left = 355 : CbFc28.Top = 138
                CbFc28.Visible = True
                Select Case Beton.Fck
                    Case 8
                        CbFc28.Text = CbFc28.Items(0).ToString '"C8/10"
                    Case 12 '"C12/15"
                        CbFc28.Text = CbFc28.Items(1).ToString '  .Fck = 12
                    Case 16 '"C16/20"
                        CbFc28.Text = CbFc28.Items(2).ToString '  .Fck = 16
                    Case 20 '"C20/25"
                        CbFc28.Text = CbFc28.Items(3).ToString '   .Fck = 20
                    Case 25 '"C25/30"
                        CbFc28.Text = CbFc28.Items(4).ToString ' .Fck = 25
                    Case 30 '"C30/37"
                        CbFc28.Text = CbFc28.Items(5).ToString '  .Fck = 30
                    Case 35 '"C35/45"
                        CbFc28.Text = CbFc28.Items(6).ToString '  .Fck = 35
                    Case 40 '"C40/50"
                        CbFc28.Text = CbFc28.Items(7).ToString '  .Fck = 40
                    Case 45 '"C45/55"
                        CbFc28.Text = CbFc28.Items(8).ToString '  .Fck = 45
                    Case 50 '"C50/60"
                        CbFc28.Text = CbFc28.Items(9).ToString ' .Fck = 50
                    Case 55 '"C55/67"
                        CbFc28.Text = CbFc28.Items(10).ToString '  .Fck = 55
                    Case Else
                        'Affichage de la valeur par défaut
                        CbFc28.Text = CbFc28.Items(4).ToString ' .Fck = 25
                End Select
                CbFc28.Focus()
            Case 1 'Libre
                Beton.EN206_Fc = False
                CbFc28.Visible = False
                LblFcMpa.Visible = True
                TxtFc.Visible = True : TxtFc.Focus()
        End Select
    End Sub
End Class