Référencer des contrôles en vue de sauvegarder une configuration
-
mardi 3 avril 2012 16:58
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).
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 ClassQuelqu'un peut-il m'aider ?
Pierre Allemand
Toutes les réponses
-
mardi 3 avril 2012 17:06
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 ClassLa "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
- Modifié Pierre Allemand mardi 3 avril 2012 17:10
-
mardi 3 avril 2012 17:26Modérateur
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
nextDonc 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.ExecuteNonQueryJe 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:37
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 23:23
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

