Imports System.IO

Public Class frmLaboBeton
    Private m_ChildFormNumber As Integer = 0
    Dim Fichier_NotedeCalcul As String = String.Empty
    'Dim Reponse As Integer
    Private Sub frmLaboBeton_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim Verif As Boolean = True
        Call ForceDot() 'pour imposer le point décimal quelque soit la culture du système d'exploitation
        Dim filename As String = String.Empty

        Try
            Me.Text = "Laboratoire béton  :  [ aucun fichier chargé ]"
            '--> création des répertoires data et note de calcul si n'existe pas
            If My.Computer.FileSystem.DirectoryExists(Directory.GetCurrentDirectory.ToString() & "\Data") = False Then
                My.Computer.FileSystem.CreateDirectory(Directory.GetCurrentDirectory.ToString() & "\Data")
            End If
            If My.Computer.FileSystem.DirectoryExists(Directory.GetCurrentDirectory.ToString() & "\Note_de_calcul") = False Then
                My.Computer.FileSystem.CreateDirectory(Directory.GetCurrentDirectory.ToString() & "\Note_de_calcul")
            End If
            '--> création des répertoires Aide si n'existe pas
            'ce qui est le cas lors de l'installation du logiciel
            If My.Computer.FileSystem.DirectoryExists(Directory.GetCurrentDirectory.ToString() & "\Aide") = False Then
                Try
                    '  Dim startPath As String = Directory.GetCurrentDirectory.ToString() ' & ".\start"
                    Dim zipPath As String = Directory.GetCurrentDirectory.ToString() & "\Aide.zip"
                    My.Computer.FileSystem.CreateDirectory(Directory.GetCurrentDirectory.ToString() & "\Aide")
                    Dim extractPath As String = Directory.GetCurrentDirectory.ToString() & "\Aide"
                    '   System.IO.Compression.ZipFile.CreateFromDirectory(startPath, zipPath)
                    System.IO.Compression.ZipFile.ExtractToDirectory(zipPath, extractPath)

                Catch ex As Exception
                    MessageBox.Show("Problème de décompression du fichier Aide.zip" & Environment.NewLine & "Exception: " & ex.Message, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                End Try
            End If

            '--> création du fichier ini si n'existe pas
            filename = Directory.GetCurrentDirectory.ToString() & "\cfg_LaboBeton.ini"
            If File.Exists(filename) = False Then
                Call Initialisation() 'appel au modules contenant les variables par defaut
                Call Ecriture_fichier_Cfg_Ini(filename, Verif) 'creation du fichier lors de l'installation du logiciel
            Else

                'Affichage des valeurs en cours
                Try
                    Call Lecture_fichier_Ini(filename, Verif) 'Initialisation du logiciel avec les préférences de l'utilisateur
                    If Verif = False Then
                        Call Initialisation() 'lecture variables par defaut 'appel aux variables générales inscrites en dur dans le logiciel
                        MessageBox.Show("Appel à la configuration par défaut", "Module démarrage", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End If
                Catch exc As Exception
                    MessageBox.Show("Erreur lors du chargement du logiciel:" & Environment.NewLine & "Exception: " & exc.Message & Environment.NewLine & exc.StackTrace, "Module général", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    Call Initialisation() 'appel aux variables générales inscrites en dur dans le logiciel
                    MessageBox.Show("Appel à la configuration par défaut", "Module démarrage", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End Try
            End If

            '--> Affichage  des menus
            MnuFormulation.Enabled = False 'pour être validé, sable.count=1 minimum et gravillon.count=1 minimum

        Catch ex As Exception
            MessageBox.Show("Erreur lors de la lecture du fichier de configuration: " & Environment.NewLine & ex.Message & Environment.NewLine & ex.StackTrace, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
        End Try
    End Sub

    ''' <summary>Programme Force la culture à utiliser le point pour les décimales</summary>
    Private Sub ForceDot() ' Force la culture à utiliser le point pour les décimales

        Dim oldDecimalSeparator As String = Application.CurrentCulture.NumberFormat.NumberDecimalSeparator

        If Not oldDecimalSeparator = "." Then ' Si ce n'est pas un point
            Dim forceDotCulture As Globalization.CultureInfo
            forceDotCulture = CType(Application.CurrentCulture.Clone(), Globalization.CultureInfo)
            forceDotCulture.NumberFormat.NumberDecimalSeparator = "."
            Application.CurrentCulture = forceDotCulture
        End If
    End Sub

    Private Sub frmLaboBeton_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        Dim r As DialogResult
        r = MessageBox.Show("Voulez-vous quitter l'application ?", Me.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1)
        If r = Windows.Forms.DialogResult.Yes Then
            e.Cancel = False
        Else
            e.Cancel = True
        End If
    End Sub

#Region "Gestion des menus"

#Region "Menu Fichier"
    Private Sub NouveauProjet_Click(ByVal sender As Object, ByVal e As EventArgs) Handles MnuNouveau.Click
        'Affichage de la fenêtre d'invite
        Dim message, title, defaultValue As String
        message = "Validez le nom de l'affaire"   ' Set prompt.
        title = "Formulation béton"   ' Set title.
        defaultValue = "Exemple 1"   ' Set default value.


        Dim ib = New InputBox With {.Text = title}
        ib.Lbl.Text = message
        ib.Txt.Text = defaultValue
        ib.ShowDialog()
        ib.Txt.Focus()

        Dim result As String = String.Empty
        result = ib.Txt.Text   'Aff.FileName = InputBox(message, title, defaultValue)
        If String.IsNullOrEmpty(result) And ib.DialogResult = DialogResult.OK Then
            Dim msg As String = String.Empty
            msg = "Aucun nom de répertoire de sauvegarde n'a été indiqué. Aucune sauvegarde n'a été effectuée."
            MessageBox.Show("Erreur:" & Environment.NewLine & msg, title, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
            Exit Sub
        ElseIf ib.DialogResult = DialogResult.Cancel Then
            Exit Sub
        End If
        result = result.Trim(New Char() {" "c, ","c, ";"c, "_"c, ":"c}) 'supprime les espaces , _ en debut et fin de chaine 'supprime les espaces en debut et fin de chaine
        Aff.FileName = result
        Me.Text = "Laboratoire béton  :  [ " & result & " ]"
        Call Mise_a_zero_generale()
    End Sub
    Private Sub OuvrirFichierExistant(ByVal sender As Object, ByVal e As EventArgs) Handles MnuOuvrir.Click

        Dim OpenFileDialog As New OpenFileDialog
        Try
            With OpenFileDialog
                If Aff.msgData <> String.Empty Then
                    .InitialDirectory = Aff.msgData
                Else
                    .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
                End If

                .FileName = "" 'pour éviter tout affichage initial dans la boite de dialogue
                .CheckFileExists = True ' Vérifie que le fichier sélectionné existe. Sinon, la boîte de dialogue affiche un avertissement.
                .CheckPathExists = True ' Vérifie que le chemin sélectionné existe. Sinon, la boîte de dialogue affiche un avertissement.
                .DefaultExt = "txt" ' Obtient ou définit une extension par défaut. N'inclut pas le "." de début.
                ' Retourne le fichier référencé par un lien ? Si la valeur de retour est False, retourne simplement le fichier de liaison
                ' sélectionné. Si elle est True, retourne le fichier lié au fichier LNK.
                .DereferenceLinks = True
                .Title = "Ouvrir le projet"
                ' .InitialDirectory = Directory.GetParent(Directory.GetCurrentDirectory).ToString() & "\data"
                .FilterIndex = 1
                .Filter = "Fichiers textes (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"
                .Multiselect = False
                .RestoreDirectory = True
                .ShowHelp = True ' Affiche le bouton Aide et la case à cocher Lecture seule ?
                .ShowReadOnly = False
                ' Commence avec la case à cocher Lecture seule activée ? Ceci n'est justifié que si ShowReadOnly a la valeur True.
                .ReadOnlyChecked = False
                If (.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK) Then
                    If .FileName <> "" Then
                        'remise à zero générale
                        Aff = New clsAffaire
                        Call Mise_a_zero_generale()    'mise à zéro de toutes les variables publiques
                        'Appel au fichier
                        Aff.FileName = .FileName
                        Dim toto As String = Aff.FileName
                        Dim Racine As String = String.Empty
                        Dim Verif As Boolean = True
                        Call Lecture_chaine(toto, Racine, Verif)
                        If Verif = True Then
                            Call DeSerializeData(.FileName, Racine, Verif)
                            If Verif = False Then
                                'Pb sur la deserialization
                                Me.Text = "Laboratoire béton : [ aucun fichier de données ]"
                                MessageBox.Show("Pb sur la deserialization du fichier Data", "Ouverture du fichier data: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
                            Else
                                Me.Text = "Laboratoire béton  :  [ " & toto & " ]"
                                '--> Affichage  des menus
                                MnuFormulation.Enabled = True 'pour être validé, sable.count=1 minimum et gravillon.count=1 minimum
                                MnuCompGranul.Enabled = False
                            End If
                        Else
                            Me.Text = "Laboratoire béton : [ aucun fichier de données ]"
                        End If
                    Else
                        Me.Text = "Labo Béton : [ aucun fichier de données ]"
                        MessageBox.Show("Aucun nom de fichier Data n'a été indiqué.", "Ouverture du fichier data: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    End If

                End If
            End With

        Catch ex As Exception
            Me.Text = "Laboratoire béton : [ aucun fichier de données ]"
            MessageBox.Show("Erreur lors de la lecture du fichier: " & Environment.NewLine & ex.Message & ex.StackTrace, "Ouverture de fichier data: " & Aff.FileName, MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

    End Sub
    Private Sub MnuEnregistrer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuEnregistrer.Click
        Try
            If Aff.FileName = String.Empty Then
                Dim message, title, defaultValue As String
                message = "Validez le nom de l'affaire"   ' Set prompt.
                title = "Formulation béton"   ' Set title.
                defaultValue = "Exemple 1"   ' Set default value.

                Dim ib = New InputBox With {.Text = title}
                ib.Lbl.Text = message
                ib.ShowDialog()
                ib.Txt.Focus()
                Dim result As String = String.Empty
                result = ib.Txt.Text   'Aff.FileName = InputBox(message, title, defaultValue)
                If String.IsNullOrEmpty(result) And ib.DialogResult = DialogResult.OK Then
                    Dim msg As String = String.Empty
                    msg = "Aucun nom de répertoire de sauvegarde n'a été indiqué. Aucune sauvegarde n'a été effectuée."
                    MessageBox.Show("Erreur:" & Environment.NewLine & msg, title, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
                    Exit Sub
                ElseIf ib.DialogResult = DialogResult.Cancel Then
                    Exit Sub
                End If
                result = result.Trim(New Char() {" "c, ","c, ";"c, "_"c, ":"c}) 'supprime les espaces , _ en debut et fin de chaine 'supprime les espaces en debut et fin de chaine

                Aff.FileName = result
                If My.Computer.FileSystem.DirectoryExists(Aff.msgData) = False Then
                    Aff.msgData = Directory.GetCurrentDirectory.ToString()
                    Dim msg As String = String.Empty
                    msg = "Aucun répertoire de données n'a été indiqué." & Environment.NewLine &
                          "Les données seront sauvegardées dans le répertoire d'installation du logiciel:" & Environment.NewLine &
                          Directory.GetCurrentDirectory.ToString()
                    MessageBox.Show("Erreur:" & Environment.NewLine & msg, title, MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
                End If
                If My.Computer.FileSystem.DirectoryExists(Aff.msgResult) = False Then
                    Aff.msgResult = Directory.GetCurrentDirectory.ToString()
                    Dim msg As String = String.Empty
                    msg = "Aucun répertoire de stockage des notes de calcul n'a été indiqué." & Environment.NewLine &
                          "Les notes de calcul seront sauvegardées dans le répertoire d'installation du logiciel:" & Environment.NewLine &
                          Directory.GetCurrentDirectory.ToString()
                    MessageBox.Show("Erreur:" & Environment.NewLine & msg, title, MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
                End If
                Aff.FileName = Aff.msgData & "\" & Aff.FileName & ".txt"
                ib.Dispose()
            End If
            'Lecture des données avant la sauvegarde dans le cas ou aucun calcul n'ait été lancé
            Dim Verif As Boolean = True
            'Vérification des données, la lecture s'est faite normalement en sortie des formulaires d'entrées de données. Si elle ne l'a pas été, des incohérences seront détectées empéchant toute sauvegarde.
            '  Call Coherence_donnees(Verif)
            If Verif = False Then Exit Sub

            Call SerializeData()
            MessageBox.Show("Sauvegarde réalisée ", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
        Catch ex As Exception
            MessageBox.Show("Erreur inattendue lors de la sauvegarde des données de calcul :" & Environment.NewLine & ex.Message & Environment.NewLine & ex.StackTrace,
                            Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
        End Try
    End Sub
    Private Sub EnregistrerSous_Click(ByVal sender As Object, ByVal e As EventArgs) Handles MnuEnregistrerSous.Click
        Try
            Dim SaveFileDialog As New SaveFileDialog
            SaveFileDialog.Title = "Enregistrer le projet sous ..."
            If Aff.msgData <> String.Empty AndAlso Directory.Exists(Aff.msgData) Then
                SaveFileDialog.InitialDirectory = Aff.msgData
            Else
                SaveFileDialog.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
            End If
            SaveFileDialog.Filter = "Fichiers texte (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"
            SaveFileDialog.FilterIndex = 1
            SaveFileDialog.RestoreDirectory = True
            Dim Res As DialogResult
            Res = SaveFileDialog.ShowDialog()
            If Res = DialogResult.OK Then
                Aff.FileName = SaveFileDialog.FileName
                Call SerializeData()
            End If
        Catch ex As Exception
            MessageBox.Show("Erreur:" & Environment.NewLine & ex.Message & Environment.NewLine & ex.StackTrace, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
        End Try
    End Sub
    Private Sub Quitter_Click(ByVal sender As Object, ByVal e As EventArgs) Handles MnuQuitter.Click
        Me.Close()
    End Sub
#End Region

    Private Sub MnuExigence_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuExigence.Click
        Dim frm1 As frmExigence
        frm1 = New frmExigence
        frm1.MdiParent = Me
        frm1.Show()
    End Sub

#Region "Sable - Gravillon"
    Private Sub MnuSable_Click(sender As Object, e As EventArgs) Handles MnuSable.Click
        Dim frm1 As frmSable
        frm1 = New frmSable
        frm1.MdiParent = Me
        frm1.Show()
    End Sub

    Private Sub MnuGravillon_Click(sender As Object, e As EventArgs) Handles MnuGravillon.Click
        Dim frm1 As frmGrav
        frm1 = New frmGrav
        frm1.MdiParent = Me
        frm1.Show()
    End Sub
#End Region

    Private Sub MnuCiment_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuCiment.Click
        'Dim frm1 As frmCiment
        'frm1 = New frmCiment
        Dim frm1 As frmCiment_Fines
        frm1 = New frmCiment_Fines
        frm1.MdiParent = Me
        frm1.Show()
    End Sub

    Private Sub MnuAdjuvant_Click(sender As Object, e As EventArgs) Handles MnuAdjuvant.Click
        Dim frm1 As frmAdjuvant
        frm1 = New frmAdjuvant
        frm1.MdiParent = Me
        frm1.Show()
    End Sub

#Region "Formulation"
    Private Sub MnuFormulBeton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuFormulBeton.Click
        Dim verif As Boolean = True
        Dim Note_de_Calcul As String
        'writer de sortie du RTF
        Dim sw As New System.IO.StringWriter
        'crée un writer de RTF avec une police par défaut
        Dim rtf As New To_Rtf.RtfAnsiTextWriter(sw, New Font(FontFamily.GenericSerif, 12, FontStyle.Regular))
        Dim rtff As String
        MnuCompGranul.Enabled = False
        Try
            'chaque formulaire vérifie sa propre cohérence.
            'le module au dessous vérifie la cohérence des données entre les divers formulaires - Exemple: vérification ...
            Call Coherence_donnees(verif)
            If verif = False Then Exit Sub 'le calcul n'est pas lancé, incohérence trop importante.
        Catch ex As Exception
            MessageBox.Show("Erreur lors de lecture des données " & Environment.NewLine & ex.Message & Environment.NewLine & ex.StackTrace, Me.Text,
                                    MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
            Exit Sub
        End Try
        Try
            Aff.msg_Avertiss.Clear() 'remise à zéro de tous les avertissements qui figurent dans la note de calcul
            Call Formulation(rtf, verif)
            'Provisoire: si erreur sur note de calcul, pas d'affichage de cette dernière
            If verif = False Then Exit Sub
            MnuCompGranul.Enabled = True
            'génère le RTF complet
            Note_de_Calcul = "Formulation_beton_" & Mise_en_Forme_date(CStr(DateTime.Now)) & ".rtf"
            If Directory.Exists(Aff.msgResult) Then
                Fichier_NotedeCalcul = Aff.msgResult & "\" & Note_de_Calcul
            Else
                Fichier_NotedeCalcul = Directory.GetCurrentDirectory.ToString() & "\Note_de_calcul" & "\" & Note_de_Calcul
                MessageBox.Show("Attention ! Veuillez modifier le répertoire de sauvegarde de vos notes de calcul, celui actuellement référencé ne convient pas" & Environment.NewLine &
                                "Veuillez vous rendre dans le formulaire de configuration pour le modifier", "Menu FormulBeton", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            End If
            rtf.Generate() : rtff = sw.ToString : File.WriteAllText(Fichier_NotedeCalcul, rtff)


            If Aff.msg_Avertiss.Count = 0 Then
                MessageBox.Show("Calcul terminé !", "Labo Béton", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Else
                MessageBox.Show("Calcul terminé !" & Environment.NewLine & "Attention: voir les avertissements.", "Labo béton", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If

        Catch ex As Exception
            MessageBox.Show("Erreur lors de l'édition de la note de calcul " & Environment.NewLine & ex.Message & Environment.NewLine & ex.StackTrace, Me.Text,
                                    MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
            Exit Sub
        End Try
        Try
            Select Case Aff.Editeur
                Case 1 'Editeur Interne
                    Dim frm1 As New Editeur.frmEdit
                    frm1.Affichage_frmEdit(Fichier_NotedeCalcul)
                Case 2 'WordPad
                    Dim KEY As Microsoft.Win32.RegistryKey = My.Computer.Registry.ClassesRoot.OpenSubKey("wordpad.exe")
                    If KEY Is Nothing Then
                        MessageBox.Show("WordPad inaccessible!" & Environment.NewLine & "Impossible d'afficher la note de calcul", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                        Exit Sub
                    End If
                    Dim SousDossier1 As String = My.Application.Info.DirectoryPath 'répertoire dans lequel se trouve le logiciel Poutre BA
                    Dim startInfo As New ProcessStartInfo("wordpad.exe") '("word.exe")
                    startInfo.WindowStyle = ProcessWindowStyle.Normal
                    startInfo.Arguments = Fichier_NotedeCalcul
                    Process.Start(startInfo.Arguments)
                Case 3 'éditeur Word
                    Dim KEY As Microsoft.Win32.RegistryKey = My.Computer.Registry.ClassesRoot.OpenSubKey("word.application")
                    If KEY Is Nothing Then
                        MessageBox.Show("Word inaccessible!" & Environment.NewLine & "Impossible d'afficher la note de calcul", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                        Exit Sub
                    End If
                    Dim SousDossier1 As String = My.Application.Info.DirectoryPath 'répertoire dans lequel se trouve le logiciel Poutre BA
                    Dim startInfo As New ProcessStartInfo("word.exe") '("word.exe")
                    startInfo.WindowStyle = ProcessWindowStyle.Normal
                    startInfo.Arguments = Fichier_NotedeCalcul
                    Process.Start(startInfo.Arguments)
            End Select
        Catch ex As Exception
            Dim msg As String
            msg = "Impossible d'afficher la note de calcul" & Environment.NewLine & "Exception: " & ex.Message & Environment.NewLine & ex.StackTrace
            MessageBox.Show(msg, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub

    Private Sub MnuCompGranul_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuCompGranul.Click
        Dim verif As Boolean = True
        Try
            'chaque formulaire vérifie sa propre cohérence.
            If Sable.Item(0).S_Vs = 0 OrElse Gravillon.Item(0).G_Vg = 0 Then
                MessageBox.Show("Erreur de données : % de sable et/ou % de gravillon nul." & Environment.NewLine & "Vérifiez que vous avez bien lancé la formulation", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
                Exit Sub
            End If
            'le module au dessous vérifie la cohérence des données entre les divers formulaires - Exemple: vérification ...
            Call Coherence_donnees(verif)
            If verif = False Then Exit Sub 'le calcul n'est pas lancé, incohérence trop importante.
        Catch ex As Exception
            MessageBox.Show("Erreur lors de lecture des données " & Environment.NewLine & ex.Message & Environment.NewLine & ex.StackTrace, Me.Text,
                                    MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
            Exit Sub
        End Try
        Call Squelette_Granulaire(verif)
        If verif = False Then Exit Sub
        Dim frm1 As frmCompGranul
        frm1 = New frmCompGranul
        frm1.MdiParent = Me
        frm1.Show()
    End Sub
#End Region

#Region "Outils"
    Private Sub MnuCalculatrice_Click(sender As Object, e As EventArgs) Handles MnuCalculatrice.Click
        Try
            Dim startInfo As New ProcessStartInfo("calc.exe")
            Process.Start(startInfo)
            startInfo.WindowStyle = ProcessWindowStyle.Normal
        Catch ex As Exception
            Dim msg As String
            msg = "Erreur lors du chargement de la calculatrice Windows" & Environment.NewLine & "Exception: " & Environment.NewLine & ex.Message & Environment.NewLine & ex.StackTrace
            MessageBox.Show(msg, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub

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

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

#Region "?"
    Private Sub MnuFichierAide_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuFichierAide.Click
        Dim PDFExe As String

        Try
            'Dim KEY As Microsoft.Win32.RegistryKey = My.Computer.Registry.ClassesRoot.OpenSubKey(PDFExe) '"acroPDF.PDF")
            PDFExe = CType(Microsoft.Win32.Registry.GetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pdf\OpenWithList", "C", ""), String)   'récupère le reader par défaut
            If PDFExe Is Nothing Then 'KEY
                MessageBox.Show("Impossible d'accèder au lecteur pdf par défaut!" & Environment.NewLine & "Affichage document Classes d'exposition CERIB FIB annulé.", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Exit Sub
            End If
            Dim SousDossier1 As String = My.Application.Info.DirectoryPath 'répertoire dans lequel se trouve le logiciel Labo beton
            Dim startInfo As New ProcessStartInfo(PDFExe) '"AcroRd32.exe")
            startInfo.WindowStyle = ProcessWindowStyle.Normal
            startInfo.Arguments = SousDossier1 & "\LaboBeton_Notice.pdf"
            Process.Start(startInfo.Arguments)

        Catch ex As Exception
            Dim msg As String = String.Empty
            msg = "Impossible d'afficher le manuel d'utilisation" & Environment.NewLine & "Exception: " & Environment.NewLine & ex.Message & Environment.NewLine & ex.StackTrace
            MessageBox.Show(msg, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub
    Private Sub MnuApropos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuApropos.Click
        Dim frmsplash1 As frmSplash
        frmsplash1 = New frmSplash
        frmsplash1.MdiParent = Me
        frmsplash1.Show()
    End Sub
#End Region

#End Region

    ''' <summary>Lit la chaine de caractère toto et récupère le répertoire (= racine) et renvoie le nom du fichier (= toto)</summary>
    ''' <param name="toto">Chaine de caractères renvoyé en format nom de fichier</param>
    ''' <param name="Racine">Répertoire de toto</param>
    ''' <param name="Verif">Renvoi False si pb d'exécution du programme</param>
    Private Sub Lecture_chaine(ByRef toto As String, ByRef Racine As String, ByRef Verif As Boolean)
        'Traitement de la chaine de caractère pour pouvoir être lu par le logiciel
        Try
            Dim tutu As String = String.Empty
            toto = toto.Trim(New Char() {" "c, ","c, ";"c, "_"c, ":"c}) 'supprime les espaces en debut et fin de chaine
            Racine = toto.Substring(0, toto.LastIndexOf("\"))
            toto = toto.Substring(toto.LastIndexOf("\"), toto.Length - toto.LastIndexOf("\"))
        Catch ex As Exception
            MessageBox.Show("Erreur lors de la lecture du la chaine " & toto.ToString & Environment.NewLine & ex.Message & ex.StackTrace, "Module Lecture_Chaine", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1)
            Verif = False
        End Try
    End Sub

    ''' <summary>Vérifie la cohérence des données</summary>
    ''' <param name="toto">Chaine de caractères renvoyé en format nom de fichier</param>
    ''' <param name="Racine">Répertoire de toto</param>
    ''' <param name="Verif">Renvoi False si pb d'exécution du programme</param>
    Private Sub Coherence_donnees(ByRef Verif As Boolean)
        Dim j As Integer
        Dim msg As String = String.Empty
        'Vérification de la cohérence des données sur les exigences
        With Beton
            If .Formulation = 2 Then
                If .Slump = 4 And .Plastifiant = False Then
                    msg = "Vous avez oublié de spécifier les caractéristiques du plastifiant alors que votre ouvrabilité est classée S4. Renseigner le formulaire Adjuvant." & Environment.NewLine
                    Verif = False
                End If
            End If

        End With

        'Vérification de la cohérence des données sur les sables
        '--> aucun test pour le moment, les éléments ont été testés directement dans le formulaire Sable

        'Vérification de la cohérence des données sur les Gravillon
        '--> aucun test pour le moment, les éléments ont été testés directement dans le formulaire Gravillon

#Region " A voir dans prochaine version"
        ''Vérification de la bonne adaptation du sable et du gravillon sélectionné:
        ''sable
        ''Pourcentage de perte
        'mtotal = 0 : i = 0
        'Do
        '    If Rs(i) > 0 Then mtotal = Tns + Rs(i) : Exit Do
        '    i = i + 1
        'Loop
        'perte = (Ms - mtotal) / Ms
        'perte = perte * 100
        'F_perte = Format(perte, "#0.00")
        'If perte > 2 Then
        '    msg = "Pertes inacceptables suivant NF P18560, le taux de perte = " & F_perte & "% > 2%"
        '    MsgBox(msg, MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "Module Formulation")
        '    Calcul_OK = False : Exit Sub
        'End If


        ''Teneur en fines
        ''Teneur en fines = passant 0,08mm<12%
        'Tf = 100 - Rsp(1)
        'F_Tf = Format(Tf, "#0.00")
        'If Tf > 12 Then
        '    msg = "La teneur en fines du sable est trop élevé : " & F_Tf & " % > 12%"
        '    MsgBox(msg, MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "Module Formulation") : Calcul_OK = False : Exit Sub
        'End If
#End Region


        If Verif = False Then
            MessageBox.Show(msg, "Module de vérification de cohérence des données", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End If
    End Sub


End Class
