none
Référencer des contrôles en vue de sauvegarder une configuration RRS feed

  • Question

  • Après bien des tâtonnements, je suis arrivé avec votre aide à écrire un code qui  trace des rectangles colorés et de styles variables qui représentent des lames de corps plus ou moins isolants empilés les unes sur les autres.

    L'objectif final est de calculer les pertes de chaleur à travers un système que l'utilisateur construit en en fixant les caractéristiques. 

    Les calculs thermiques sont déjà prêts (il proviennent de la même applicationqui fonctionnait bien sous VB 6 mais que je ne peux plus installer depuis un certain temps sur les ordinateurs actuels pour cause de dll ayant évolué  ).

    Ci-après l'écran que l'utilisateur a devant lui après avoir construit un système comportant un mur de brique de 250 mm recouvert par un complexe isolant comportant 2 feuilles d'aluminium de 10 microns emprisonnant entre elles une couche de laine de verre de 15 mm d'épaisseur. (Les rectangles ne sont évidemment pas à l'échelle).

    Empilement de lames

    Je voudrais que l'utilisateur puisse sauvegarder sa construction afin de la retrouver. Pour cela, je voudrais écrire une commande qui référence chacune des lames avec un index (comme les groupes de contrôles de VB6 étaient simples !) pour ensuite constituer une ligne par lame d'une table Access dont les champs correspondent aux propriétés des contrôles de chacune des lames.

    Voici le code qui permet de construire l'image ci-dessus :

    Imports System
    Imports System.Data
    Imports System.Drawing
    Imports System.Data.OleDb
    Imports Microsoft.VisualBasic
    Imports Microsoft.VisualBasic.PowerPacks
    Public Class Principale
        Dim NuméroLame As Integer
        Dim EstGaz As Boolean
        Dim EstIsolant As Boolean
        Dim MyConnexion As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=Transmission.mdb")
        Dim Mycommand As OleDbCommand = MyConnexion.CreateCommand()
    
    
        Private Sub Principale_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            'Dim ValeurStyleR As String, StyleR As FillStyle = CType([Enum].Parse(GetType(FillStyle), ValeurStyleR, True), FillStyle)
            Mycommand.CommandText = "SELECT Nature FROM NatureLameTest ORDER BY Nature"
            MyConnexion.Open()
            Dim myReader As OleDbDataReader = Mycommand.ExecuteReader()
            ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
            Do While myReader.Read()
                ComboBox1.Items.Add(myReader.GetString(0))
            Loop
            myReader.Close()
            MyConnexion.Close()
            ComboBox1.SelectedIndex = 0
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim u As New UserControl1
            Mycommand.CommandText = "SELECT Nature, Lambda, EpsilonGauche, EpsilonDroite, Couleur, CouleurRemplissage, StyleRemplissage, EstGaz FROM NatureLameTest WHERE Nature = '" & ComboBox1.Text & "'"
            MyConnexion.Open()
            Dim Reader As OleDbDataReader = Mycommand.ExecuteReader()
            Reader.Read()
            NuméroLame = NuméroLame + 1
            u.Nom.Text = "Lame" & Str(NuméroLame)
            u.Nature.Text = Reader(0).ToString
            u.Lambda.Text = Reader(1).ToString
            u.EpsilonGauche.Text = Reader(2).ToString
            u.EpsilonDroite.Text = Reader(3).ToString
            Dim CouleurL As Color = Color.FromName(Reader(4).ToString)
            Dim CouleurR As Color = Color.FromName(Reader(5).ToString)
            u.RectangleShape1.FillColor = CouleurR
            u.BackColor = CouleurL
            Dim StyleR As FillStyle = CType([Enum].Parse(GetType(FillStyle), Reader(6).ToString, True), FillStyle)
            u.RectangleShape1.FillStyle = StyleR
            If Reader.GetBoolean(7) = True Then
                u.EstGaz.Checked = True
            Else
                u.EstGaz.Checked = False
            End If
        End Sub
        Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    
    
        End Sub
        Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click
            End
        End Sub
    
    
        Private Sub SupprimerUneLameToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SupprimerUneLameToolStripMenuItem.Click
            MessageBox.Show("Cliquer sur le nom de la lame à supprimer")
            Suppression = True
        End Sub
    
        Private Sub SauvegarderLaConfigurationToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SauvegarderLaConfigurationToolStripMenuItem.Click
            'For Each UserControl1 In Me
    
            'Next
        End Sub
    End Class
    Quelqu'un peut-il m'aider ?


    Pierre Allemand

    mardi 3 avril 2012 16:58

Toutes les réponses

  • En complément de ma question précédente, voici le code qui permet à l'utilisateur de construire sa configuration (choix des lames) :

    Public Class UserControl1 ' Hérite de UserControl ce qu'on voit dans le fichier UserControl1.Designer.vb
        Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
            MyBase.OnPaintBackground(e)
            ' TODO : hachurer le fond
        End Sub
    
        Private Sub UserControl1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        End Sub
    
        Private Sub Peau_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Peau.CheckedChanged
            If Me.Peau.Checked = True Then
                Me.NaturePeau.Visible = True
                Me.EpaisseurPeau.Visible = True
                Me.LambdaPeau.Visible = True
                Me.EpsilonExterne.Visible = True
                Me.EpsilonInterne.Visible = True
                Principale.Label8.Visible = True
                Principale.Label9.Visible = True
                Principale.Label10.Visible = True
                Principale.Label11.Visible = True
            End If
            If Me.Peau.Checked = False Then
                Me.NaturePeau.Visible = False
                Me.EpaisseurPeau.Visible = False
                Me.LambdaPeau.Visible = False
                Me.EpsilonExterne.Visible = False
                Me.EpsilonInterne.Visible = False
                Principale.Label8.Visible = False
                Principale.Label9.Visible = False
                Principale.Label10.Visible = False
                Principale.Label11.Visible = False
            End If
        End Sub
    
        Private Sub EpaisseurPeau_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles EpaisseurPeau.TextChanged
            If CSng(Me.EpaisseurPeau.Text) <> 0 Then
                Me.RectangleShape1.BorderWidth = 3
                Me.RectangleShape1.BorderColor = Color.Red
                Me.RectangleShape1.Width = 75
                Me.RectangleShape1.Height = 671
            Else
                Me.RectangleShape1.BorderWidth = 1
                Me.RectangleShape1.BorderColor = Color.Black
                Me.RectangleShape1.Width = 81
                Me.RectangleShape1.Height = 675
            End If
        End Sub
    
        Private Sub Nom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Nom.Click
            
            If Suppression = True Then
                Me.Visible = False
            End If
        End Sub
    End Class
    La "peau" est une enveloppe qui entoure l'isolant lorsque celui-ci est un gaz. Elle est représentée par une bordure rouge autour de la lame correspondante. Les paramètres constitutifs de la peau n'apparaissent que si la case à cocher "peau" est cochée. (ou si le produit est un gaz).


    Pierre Allemand


    mardi 3 avril 2012 17:06
  • Bonjour,

    Dans Button1_click je ne vois pas où est ajouté le nouveau contrôle utilisateur "u" ? Mais en gros cela serait qq chose du style :

    for each c as control in ControlParent1.Controls (utiliser le container dans lequel se trouve les contrôles utilisateurs)
       if typeof c is UserControl1 then
     Dim u As UserControl1=CType(c,UserControl1)
     Save(u)
       end if
    next

    Donc le code parcours les contrôles qui se trouvent dans le panneau voulu et si c'est un contrôle de type UserControl1 appelle la méthode Save en passant le nom du contrôle en paramètre.

    Save pourrait être qq chose du style :
    MyCommand.Text="INSERT INTO MaTable(Nature,Lambda) VALUES (?,?)"
    MyCommand.Parameters.AddWithValue("Nature",u.Nature)
    MyCommand.Parameters.AddWithValue("Lambda",u.Lambda)
    MyCommand.ExecuteNonQuery

    Je ne mets pas les ouvertures/fermetures de connexion. Il faudrait sans doute aussi tester avant si la lame existe pour éventuellement la mettre à jour ou lieu de la créer (UPDATE MaTable SET Nature=?,Lambda=? WHERE Key=?). Le principe est de créer une instruction SQL avec des "marqueurs" que AddWithValue permet d'alimenter dans l'ordre de leur apparition dans l'instruction SQL.  A voir aussi la destruction (ou peut-être avoir une propriété qui indique sur chaque lame si elle est nouvelle, chargée depuis la base ou à supprimer ?)

    C'est un peu sommaire mais je pense que cela devrait permettre de commencer à voir ce que cela donne quitte à poster ensuite sur un problème précis.


     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mardi 3 avril 2012 17:26
    Modérateur
  • Salut

    tu peux utiliser les fichiers de configuration en passant par My.settings

    regarde ici

    http://plasserre.developpez.com/cours/vb-net/?page=windows-forms4#LX-N-5

    tu peux trouver quelque chose (de toutes les façons tu dois écrire la logique de configuration)


    la FOI déplace les montagnes et bien DOTNET les effaces complétement.

    mardi 3 avril 2012 17:37
  • Dans  Button1_click, il faut ajouter à la fin de la procédure : "FlowLayoutPanel1.Controls.Add(u)". (Je l'ai effacé par inadvertance en même temps que j'effaçais une tentative de création d'une collection). Cela pour répondre à votre question.

    Ma question 1 : Comment écrire dans les règles la procédure "Sauve" ? Je comprends qu'elle doit se trouver dans la classe "Principale" précédée de "Public sub Sauve()" (avec peut-être un ou plusieurs paramètres entre parenthèses, mais je me débrouillerai) et terminée par "end sub". Mais je ne sais pas si je dois ajouter ces 2 termes à la main ou bien s'il existe une commande "ajouter une procédure" comme dans vb6 qui placerait automatiquement la procédure au bon endroit, mais je ne l'ai pas trouvée.

    Ma question 2 : J'ai créé une commande de menu "Supprimer une lame" qui consiste simplement à rendre invisible la lame en question. J'aurais préféré la supprimer complètement, mais je ne sais pas comment. Dans la procédure Sauve, il faudra donc que j'ajoute "if Me.Visible = true". Ce n'est pas très élégant, mais je n'ai rien trouvé d'autre. Pouvez-vous m'aider ?

    Question subsidiaire : D'une façon générale si une procédure a une portée globale, où doit-on l'écrire ? J'ai essayé en-dessous d'un module1 que j'avais créé pour déclarer des variables globales (comme dans VB6), mais le système ne l'accepte pas.

    Demain 4 avril (aujourd'hui donc plutôt) je fais du grandchildren-sitting (they use to be babies but they have both grown) toute la journée, mais je reprendrai les opérations programmaticales demain soir...

    Cordialement


    Pierre Allemand

    mardi 3 avril 2012 23:23
  • Bonjour, 

    Je suis en train de créer une application dont je veux réaliser tout comme toi  une sauvegarde de la configuration ( les pictureBox notamment, la création dans un fichier texte, leurs positions, les images etc..)

    As tu trouvé une solution pour ton problème? Je suis intéressé :)

    merci

    Julien

    dimanche 27 octobre 2013 09:02