IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Calcul en temps réel dans une 2ème fenêtre


Sujet :

VB.NET

  1. #1
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut Calcul en temps réel dans une 2ème fenêtre
    Bonjour,

    Comme j'avais prédis mon retour ... j'ai regarder la FAQ et j'ai résolu déjà pas mal de souci (très bien faite au passage!) bref !

    Mon problème est assez simple je pense : je souhaiterais qu'un Label situé dans une 2ème fenêtre se calcule en temps réel (si possible).

    Je détaille :

    Dans ma fenêtre de mon Main j'ai deux Textbox donc deux variables : A et B.
    Dans ma 2ème fenêtre j'ai un Label (C) qui dépend de A et B ... mais le calcul ne se fait pas en temps réel, il se fait avec les valeurs par défaut de A et B au démarrage et après c'est figé. ... même si je change A et B et je ferme et ré-ouvre la fenetre secondaire.

    Voici ma portion de code dans mon Main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Sub VarA_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VarA.TextChanged
            Loads_Result.LBL_C.Text = (Math.PI * (VarA - 2 * VarB) ^ 2) / 4     'La 2ème fenetre s'appelle "Loads_Result
        End Sub
     
        Public Sub VarB_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VarB.TextChanged
            Loads_Result.LBL_C.Text = (Math.PI * (VarA - 2 * VarB) ^ 2 )/ 4
        End Sub

    Et celle de mon secondaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Sub Loads_Result_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
             Calcul_coeff()    'appelle de la sub
         End Sub
     
        ' --- Calcul de C ---
        Public Sub Calcul_coeff()
             LBL_C.Text = Format((Math.PI * (TSP.VarA - 2 * TSP.VarB) ^ 2) / 4, ("0.00"))    ' calcul quand la fenetre s'ouvre
        End sub

    J'ai essayé de rendre la chose la plus claire possible j'espère que c'est le cas, merci d'avance pour vos réponses !

  2. #2
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Bonjour

    mais le calcul ne se fait pas en temps réel, il se fait avec les valeurs par défaut de A et B au démarrage et après c'est figé
    avec quelles valeurs de A et B veux tu utiliser?
    sers toi tu my.settings
    http://msdn.microsoft.com/en-us/library/saa62613.aspx

  3. #3
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Ben A et B sont des variables donc des valeurs comprises entre 0 et l'infini ..enfin un 'petit' infini ^^
    C'est l'opérateur qui la met, mais le Label (C) ne change pas sa valeur (alors qu'il le devrait)

    Je regarde les propriétés de mysettings, merci

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    utilise un délégué Action


    la portion de code dans ton Main :
    La déclaration du délégué dans ta classe main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Private CalculCoef As Action(Of Integer, Integer)
    portion de code à placer dans ton load du main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            VarA.Text = 0
            VarB.Text = 0
            Dim f As Loads_Result = New Loads_Result
            CalculCoef = AddressOf f.Calcul_coeff
            f.Show()
    La gestion des saisies et le passage d'info (dans le main)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
        Private Sub VarB_TextChanged(sender As System.Object, e As System.EventArgs) Handles VarB.TextChanged
            If Not EnvoieAuCalcul() Then MessageBox.Show("A et B doivent être des nombres")
        End Sub
     
        Private Sub VarA_TextChanged(sender As System.Object, e As System.EventArgs) Handles VarA.TextChanged
            If Not EnvoieAuCalcul() Then MessageBox.Show("A et B doivent être des nombres")
        End Sub
     
        Function EnvoieAuCalcul() As Boolean
            Dim nombreA As Integer
            Dim nombreB As Integer
            If Integer.TryParse(VarA.Text, nombreA) AndAlso Integer.TryParse(VarB.Text, nombreB) Then
                CalculCoef(nombreA, nombreB)
                Return True
            End If
            Return False
        End Function
    Dans ta fenêtre secondaire , calcul et affichage en direct.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        ' --- Calcul de C ---
        Public Sub Calcul_coeff(a As Integer, b As Integer)
            Label1.Text = Format((Math.PI * (a - 2 * b) ^ 2) / 4, ("0.00"))
        End Sub
    Place tes fenêtres côte à côte pour voir.

  5. #5
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Merci beaucoup de t'être donné la peine de tapé tout ce code !

    Je vois mieux la chose, je ne savais pas comment appeler une méthode d'une autre classe et c'est un peu ce qu'on fait là il me semble ?!

    J'ai mit tout le code et j'ai une erreur dès le début (j'ai mit un point d'arrêt), il n'est pas content quand il arrive à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim f As Loads_Result = New Loads_Result
            CalculCoef = AddressOf f.Calcul_coeff
            f.Show()
    au début du main, alors je cherche d'où ça peut venir ..
    En fait il m'affiche direct ta phrase dans une ptite fenêtre "A et B doivent être des nombres" et c'est tout, erreur innerexception .. etc


    EDIT : en fait j'ai mit un point d'arrêt, mais meme quand je met en commentaire ce truc ça fait l'erreur, du coup ..
    InnerException: System.NullReferenceException
    Message="La référence d'objet n'est pas définie à une instance d'un objet."

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Il faut mettre le code ainsi (désolé) sinon l'appel du calcul est fait avant que l'instance n'existe à cause du textchanged
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            Dim f As Loads_Result = New Loads_Result
            CalculCoef = AddressOf f.Calcul_coeff
            VarA.Text = 0
            VarB.Text = 0
            f.Show()
    Pour le message d'erreur (c'était un exemple) il faut tester si l'on est pas dans le load (l'init) avec une variable boolean ou traiter les mauvaises saisies autrement. (je l'avais rajouté après pour exemple)
    Autres solution, tu fais des AddHandler dynamique pour le textchanged sur les textBox après les affectations d'init des textbox VarA et VarB. (là je n'ai pas le temps, mais si cela t'intéresse je te montrerai)

    Pour tester fait juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Private Sub VarB_TextChanged(sender As System.Object, e As System.EventArgs) Handles VarB.TextChanged
            EnvoieAuCalcul()
         End Sub
     
        Private Sub VarA_TextChanged(sender As System.Object, e As System.EventArgs) Handles VarA.TextChanged
            EnvoieAuCalcul() 
        End Sub

  7. #7
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Malheureusement j'avais déjà tester tout ça. Mes variables sont définies après ces lignes. Je les définie bien par VarA.text = 0.
    Mais t'excuse pas, ça se trouve c'est moi qui est fait une erreur en mettant dans mon code, parce que j'ai voulu simplifié à mort pour rendre explicite mon problème mais je doit remettre toutes mes variables (qui sont directement en fait des TextBox.text etc... )

    mon programme approche les 1000 lignes sur le Main, alors c'est peut être pas énorme mais même en commentant bien j'avoue je suis paumé parfois ^^

    Je penche dessus ce soir et je répond demain si ça va pas :/ (j'adore le vb x)

  8. #8
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Bon ça me prend trop la tête en fait, j'ai envie de savoir pourquoi ça va pas j'ai refait ce code dans un nouveau Windows.form pour que ça ne dépende pas de mes paramètres etc ... comme ça tout est clair.

    J'ai, pour le Main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Public Class Form1
     
        Private CalculCoef As Action(Of Integer, Integer)
     
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'VarA.Text = 0   ' en commentaire car de toute façon j'ai mis la textbox initialisée à 0 ! c'est encore mieux non ?
            'VarB.Text = 0
     
            Dim f As Loads_Results = New Loads_Results
            CalculCoef = AddressOf f.Calcul_coeff
            f.Show()
        End Sub
     
        Private Sub VarB_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VarB.TextChanged
            'If Not 
            EnvoieAuCalcul() 'Then MessageBox.Show("A et B doivent être des nombres")
        End Sub
     
        Private Sub VarA_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VarA.TextChanged
            'If Not 
            EnvoieAuCalcul() 'Then MessageBox.Show("A et B doivent être des nombres")
        End Sub
     
     
        Function EnvoieAuCalcul() As Boolean
            Dim nombreA As Integer
            Dim nombreB As Integer
            If Integer.TryParse(VarA.Text, nombreA) AndAlso Integer.TryParse(VarB.Text, nombreB) Then
                CalculCoef(nombreA, nombreB)
                Return True
            End If
            Return False
        End Function
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Loads_Results.Show()
        End Sub
     
    End Class
    Et pour le secondaire, tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Class Loads_Results
     
        Public Sub Calcul_coeff(ByVal a As Integer, ByVal b As Integer)
            Label1.Text = a + b
        End Sub
     
    End Class
    Après ça se trouve ça marche chez toi ! Moi j'ai visual studio 2008 ... pour des trucs c'est plus compliqué.. comme pour sauvegarder un fichier texte à l'endroit où tu veux ... bref
    Si t'as pas le temps de répondre pas grave, j'ai d'autre problèmes sur lesquels travailler, c'est pas ce qui manque

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Pour simplifier, on teste si les textbox ne sont pas vide, et appel à la fonction.
    note les 2 évènements reliés à la sub txtVar_TextChanged. Ainsi tu as une seule sub pour les traitements changed de tes 2 textbox.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
        Private CalculCoef As Action(Of Integer, Integer)
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim f As Loads_Result = New Loads_Result
            CalculCoef = AddressOf f.Calcul_coeff
            f.Show()
        End Sub
        Private Sub txtVar_TextChanged(sender As System.Object, e As System.EventArgs) Handles VarA.TextChanged, VarB.TextChanged
            If Not (VarA.Text = "" OrElse VarB.Text = "") Then If Not EnvoieAuCalcul() Then MessageBox.Show("A et B doivent être des nombres")
        End Sub
        Function EnvoieAuCalcul() As Boolean
            Dim nombreA As Integer
            Dim nombreB As Integer
            If Integer.TryParse(VarA.Text, nombreA) AndAlso Integer.TryParse(VarB.Text, nombreB) Then
                CalculCoef(nombreA, nombreB)
                Return True
            End If
            Return False
        End Function
    Dans la fenêtre secondaire, rien de changé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Public Sub Calcul_coeff(a As Integer, b As Integer)
            LBL_C.Text = Format((Math.PI * (a - 2 * b) ^ 2) / 4, ("0.00"))
        End Sub
    Voila comme cela tu as l'exemple avec les tests pour être sur du fonctionnement.
    Mais du moment que tu as compris le principe, après c'est juste une adaptation à faire dans ton code.

    Citation Envoyé par Adakhum Voir le message
    mon programme approche les 1000 lignes sur le Main, alors c'est peut être pas énorme mais même en commentant bien j'avoue je suis paumé parfois ^^
    Essaye de décomposer et factoriser. Cela te simplifiera la maintenance.

    [Edit]
    Pour répondre à cette question
    Citation Envoyé par Adakhum Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            'VarA.Text = 0   ' en commentaire car de toute façon j'ai mis la textbox initialisée à 0 ! c'est encore mieux non ?
            'VarB.Text = 0
    En fait cela ne changera pas l'erreur, même si tu as initialisé dans le designer, au moment ou la fenêtre est construite avec le code du designer le changed va être appelé, et comme l'init de la fenêtre secondaire n'est pas fait -> erreur ou/et les tests dans le changed verront un textbox non numérique et message erreur. Donc vérifier que les textbox ne soient pas vide.

    [Edit]
    Et celle-ci
    Citation Envoyé par Adakhum Voir le message
    Je vois mieux la chose, je ne savais pas comment appeler une méthode d'une autre classe et c'est un peu ce qu'on fait là il me semble ?!
    On appele une méthode d'une autre classe
    Tu pourrais aussi faire ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable_instance_de_ta_classe_Loads_Result.Calcul_coeff(nombreA, nombreB)

  10. #10
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    '
    Citation Envoyé par Adakhum Voir le message
    j'ai voulu simplifié à mort pour rendre explicite mon problème mais je doit remettre toutes mes variables (qui sont directement en fait des TextBox.text etc... )
    J'avais compris que c'était des textbox.
    En as-tu beaucoup ?
    On peut les traiter ensembles dans une méthode en les mettant dans un panel ou groupbox. Cela simplifie.

    [Edit]
    Je présume que tu as tes raisons pour différer les calculs dans une autre fenêtre, mais on pourrait les faire dans la fenêtre de saisie et afficher le résultat dans l'autre en affectant la valeur du résultat au label. (c'est juste une idée comme ça)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' dans form1
    variable_instance_de_ta_classe_Loads_Result.LBL_C.Text = resultat_calcul

  11. #11
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par rv26t Voir le message
    Je présume que tu as tes raisons pour différer les calculs dans une autre fenêtre
    Ah mais pas du tout x) T'as tout à fait raison !

    En fait, j'ai commencé a envoyé seulement le résultat dans la secondaire mais vu que ça ne marchait pas, j'ai mit les formules sous des méthodes dans les deux fenetres, c'est certainement bête mais au moins je me suis dit "là ça va marcher!" et non .. Ce n'est pas de la mauvaise volonté je suis juste un peu incompétent sur les bords ^^
    Et ce Label une fois calculé, il faut qu'il soit sensible à un .Textchanged car un Label dépend de sa valeur situé aussi sur la fenetre secondaire ... désolé c'est complexe et fastidieux

    Merci de toutes tes réponses c'est carrément sympa! Et merci pour le "multiple" handles ! Je vais diffuser ce truc dans mon ptit programme !

    J'avais compris que c'était des textbox.
    En as-tu beaucoup ?
    On peut les traiter ensembles dans une méthode en les mettant dans un panel ou groupbox. Cela simplifie.
    Oui quand même, j'en ai 33 exactement dans un 1er onlget du Main et une petite dizaine dans un autre onglet du Main.
    J'ai fais des Panel pour les regrouper et des Groupbox, mais pour moi c'est juste une question d'esthétique et d'organisation sur le designer, je ne pense pas vraiment savoir m'en servir

    Voici des p'tites images pour donner une idée ..
    Le Main
    Nom : Prgrm_tabMD.jpg
Affichages : 200
Taille : 139,4 Ko

    Nom : Prgrm_tabL.jpg
Affichages : 208
Taille : 58,1 Ko
    La fameuse seconde fenetre ... où Ai est calculé selon des coeff du Main et Fp en fonction de Ai et d'un coeff du Main
    Nom : Prgrm_wd_loadResult.jpg
Affichages : 181
Taille : 36,0 Ko

    EDIT : (s'il y a écrit (nov) c'est pour dire "not visible" mais j'initialise bien au début à 0 même si Label invisible)

  12. #12
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    T'inquiéte pas, il faut bien apprendre.
    Ton projet à l'air sympa

    Citation Envoyé par Adakhum Voir le message
    Oui quand même, j'en ai 33 exactement dans un 1er onlget du Main et une petite dizaine dans un autre onglet du Main.
    J'ai fais des Panel pour les regrouper et des Groupbox, mais pour moi c'est juste une question d'esthétique et d'organisation sur le designer, je ne pense pas vraiment savoir m'en servir
    Justement, c'est là qu'il faut bien les agencer pour pouvoir s'en servir, et que cela soit convivial pour l'utilisateur.

    Citation Envoyé par Adakhum Voir le message
    Et ce Label une fois calculé, il faut qu'il soit sensible à un .Textchanged car un Label dépend de sa valeur situé aussi sur la fenetre secondaire ... désolé c'est complexe et fastidieux
    ...
    La fameuse seconde fenetre ... où Ai est calculé selon des coeff du Main et Fp en fonction de Ai et d'un coeff du Main
    Je vois mieux le principe maintenant

    Tu peux te servir des groupbox (ou panel) pour effectuer un ensemble de traitement sur les textbox.
    Dans un premier temps fait le avec le panel de l'onglet Loadings.
    Nous allons faire 2 choses
    - 1 attribuer les évènements changed aux textbox (méthode AddEventTextBox) comme cela tu n'a plus a saisir les x handles derriere la méthode txtVar_TextChanged
    - 2 controler que les textbox contiennent tous des entiers (integer). Avant de lancer les calculs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Public Class frmTextBoxEvent
        Dim fenLoads_Result As Loads_Result = New Loads_Result
        Private Sub frmTextBoxEvent_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            AddEventTextBox(GroupBox1)
            fenLoads_Result.Show()
        End Sub
        ''' <summary>ajoute les évènements dynamiquement sur le sub txtVar_TextChanged</summary>
        ''' <param name="conteneur">conteneur de type panel, groupbox, ...</param>
        Sub AddEventTextBox(conteneur As Control)
            For Each txt As TextBox In conteneur.Controls.OfType(Of TextBox)()
                AddHandler txt.TextChanged, AddressOf txtVar_TextChanged
            Next
        End Sub
        ''' <summary>Teste si tous les texbox d'un conteneur sont des entiers</summary>
        ''' <param name="conteneur">conteneur de type panel, groupbox, ...</param>
        ''' <returns>Vrai si tous numérique, sinon faux</returns>
        Function IsAllTextBoxNumeric(conteneur As Control)
            Dim i As Integer
            For Each txt As TextBox In conteneur.Controls.OfType(Of TextBox)()
                If Not Integer.TryParse(txt.Text, i) Then Return False
            Next
            Return True
        End Function
        Private Sub txtVar_TextChanged(sender As System.Object, e As System.EventArgs)
            If IsAllTextBoxNumeric(GroupBox1) Then fenLoads_Result.Label1.Text = Calcul()
            'fenLoads_Result.Label1.Text = TextBox1.Text & " " & TextBox2.Text & " " & TextBox3.Text & " " & TextBox4.Text & " " & TextBox5.Text pour test
        End Sub
        Function Calcul() As String
            Return (Format((Math.PI * (Integer.Parse(TextBox1.Text) - 2 * Integer.Parse(TextBox2.Text)) ^ 2) / 4, ("0.00")))
            ' ton calcul plus complexe
        End Function
    Je présume que les textbox sont iitialisés à 0 dans le designer (sinon il faudrait les initialiser dans la boucle avant le addhandler)

    On peut faire des appel récursif sur les conteneur imbriqué. (il me semble que l'on à déjà vu ça, les écrans ne me sont pas inconue) C'est là qu'il faut bien imbriquer ceux que l'on veut manipuler.

    Attention avec les AddHandler de ne pas l'appeler 2 fois pour le même textbox sinon il se déclenchera 2 fois
    Ne pas inclure le textbox particulier pour le 2ème label du second formulaire dans les évènements.
    Dans ce permier cas de calcul tu peux affecter directement la valeur résultante du calcul au label du second formulaire.

    pour le 2ème label du second formulaire
    Il me semble qu'un label caché peut recevoir la valeur sur modif du coeff du Main (coef du main qui aura un évènement Changed qui mettra à jour le label caché)
    Ce label caché et Ai auront un évènement changed qui fera le calcul et mettra à jour Fp (un évènement déclenchera un autre évènement)
    Je ne sais pas si j'ai été bien clair

    Utilise aussi des try catch,
    Juxtapose tes fenêtres pour voir quand tu testes.


    Tes fenêtres doivent obligatoire être ouvertes toutes les 2. Tu contrôles ce genre de chose ou pas.

    Bon j'espère que je n'ai pas oublié de truc.
    Images attachées Images attachées  

  13. #13
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Navré j'ai pas eu le temps aujourd'hui j'étais sur comment sauvegarder un fichier texte à un endroit précis et le charger le tout dans les bons textbox, j'ai réussi, je suis content x)

    Je reprend tout ça demain matin et je dis quoi ! j’espère que je vais achever ce problème ! Merci pour ta réponse que je me suis tout de même empresser de lire pour y réfléchir en arrière plan :p

  14. #14
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    bonjour

    Bien que ton probleme est un peu mal expose ....le plus simple pour collecter des infos à partir des controls du form principal et et de mettre à jour un ou plusieurs labels du second form (form des resultats) est de declarer :
    A/Dans le Form Principal(main)
    -des variables auxiliaires en homologue des textbox ou combox ou ce que tu veux de saisie....
    -ces variables auxiliaires ont un double role :
    -valider la saisie user(ValidateControl)
    -serviront de parametres d'appel du FONCTION de calcul souhaitee
    B/Dans le Form d'Affichage des resulaltats
    -le FONCTION qui execute les calculs doit etre PUBLIC pour etre accede dans le le Form Principal


    code .vb fu form resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Public Class frmDisplayResult
        'valeur initiale au chargement
        Private initialValue As Double = 1045.55
        Private Sub frmDisplayResult_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     
            lbl_C.Text = Format(initialValue, "0.00")    ' calcul quand la fenetre s'ouvre
     
        End Sub
        ' --- Calcul de C ---
        Public Function Calcul_coeff(ByVal varA, ByVal varB) As Double
            Dim d As Double = (Math.PI * (varA - 2 * varB) ^ 2) / 4
            Return d
        End Function
     
     
     
    End Class
    code .vb fu form principal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     
    Public Class frmMain
        Private Loads_Result As frmDisplayResult
        Private varA As Double
        Private varB As Double
        'variable pour recueuillir le resutat
        Private resultat As Double
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            Loads_Result = New frmDisplayResult()
     
            Loads_Result.Show()
        End Sub
        Private Sub txtVarA_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtVarA.TextChanged
             'reinit variable
             varA = 0.0
            varA = ValidateControl(txtVarA, varA)
            resultat = Loads_Result.Calcul_coeff(varA, varB)
            Loads_Result.lbl_C.Text = Format(resultat, "0.00")
     
     
        End Sub
     
        Private Sub txtVarB_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtVarB.TextChanged
             'reinit variable
             varB = 0.0
            varB = ValidateControl(txtVarB, varB)
            resultat = Loads_Result.Calcul_coeff(varA, varB)
            Loads_Result.lbl_C.Text = Format(resultat, "0.00")
     
        End Sub
        'verifie saisie user et ramasse eventuellement le resultat de la nouvelles valeurs de variable
        Private Function ValidateControl(ByVal ctrl As Control, ByVal var As Double) As Double
            If Double.TryParse(ctrl.Text, var) Then
                Return var
            End If
            Return var
        End Function
     
     
     
     
    End Class
    ce code peut etre factorise pour un GroupBoxe contenant -N TextBoxes (ou Combo) et meme à N GroupBoxes contenant chacun -M TextBoxes....

  15. #15
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Bonjour !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub AddEventTextBox(ByVal conteneur As Control)
            For Each txt As TextBoxBase In conteneur.Controls.OfType(Of TextBoxBase)()
                AddHandler txt.TextChanged, AddressOf txtVar_TextChanged
            Next
        End Sub
    ça, ça dit que dès que les textbox visé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IsAllTextBoxNumeric(UnPanel OU UnGroupbox)
    vont se mettre à jour si j'ai bien compris
    C'est génial !

    J'ai mit tout ça, j'ai juste modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function Calcul() As String
            Return (Format((Math.PI * (Double.Parse(TB_metD0.Text) - 2 * Double.Parse(TB_metThick.Text)) ^ 2) / 4, ("0.00")))
            ' ton calcul plus complexe
        End Function
    parce que mes valeurs ne seront pas entières mais parfois à virgule ...

    ça marche nickel ! Par contre j'aurai souhaité que le calcul se fasse quand j'ouvre la fenetre TAC ! (je suis exigeant yep !)
    Ici, (si je ne met pas Loads_Result.Show() au début) si j'ouvre la fenêtre après seulement (via un ptit bouton!) le calcul affiche 0 jusqu'à temps que je modifie une valeur dans le Main et là par contre le calcul se fait en direct !

    EDIT : Trouvé : j'ai mit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsAllTextBoxNumeric(PL_TG_MD) Then Loads_Result.LBL_metAi.Text = Calcul()
    dans la méthode qui ouvre ma fenetre Loads_Result !

    Je vais essayer d'étendre le principe à mes autres Textbox ! merci beaucoup encore une fois ! merci pour ta réponse idem MABROUKI !

  16. #16
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Bon maintenant c'est le 2eme label qui fait son rebelle,

    Si je fais tout pareil que pour la variable Ai pour Fp ça marche, mais je trouve quand même dingue que : (dans la fenetre secondaire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub LBL_Ai_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles LBL_Ai.TextChanged
          Fp = Ai * P
    End Sub
    ne marche pas mais génère une exception .. pourtant quand mon texte du Label Ai change c'est pas sorcier, il devrait changer le texte de Fp ?

  17. #17
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Et quelle est l'exception ?
    On ne sais pas comment tu agences tout l'ensemble.
    Que sont Ai et P ?

    La méthode AddEventTextBox attribut l'évènement TextChanged des contrôles textbox parcouru à la méthode txtVar_TextChanged.
    Lorsque un chiffre est saisie dans un de ces contrôles textbox la méthode txtVar_TextChanged est appelée et exécute le code : If IsAllTextBoxNumeric...

  18. #18
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    ben ... je l'ai refais ça marche, navré du dérangement

    je crois que j'avais oublié de faire ma ptite fonction magique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    convnum(textbox.text)
     
    Function ConvNum(ByVal txt)
            If IsNumeric(txt) Then
                ConvNum = CDbl(txt)
            Else
                ConvNum = 0
            End If
        End Function
    A ce propos, une dernière question : pourquoi quand je ne met pas cette fonction (pour lui dire en gros que le texte c'est bien du chiffre) le calcul ne se fait pas je dirai 1 fois sur 2 !
    Les multiplications ça va mais les division c'est pas son fort, souvent il aime pas et il me fait une exception

    Merci !

  19. #19
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Bonjour Adakhum

    Bon courage pour ton projet
    Ton application est installée seulement dans un ordi avec la virgule comme séparateur décimal ?

  20. #20
    Membre du Club Avatar de Adakhum
    Homme Profil pro
    Ingénieur Mécanique Numérique
    Inscrit en
    Mars 2014
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur Mécanique Numérique

    Informations forums :
    Inscription : Mars 2014
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Bonjour shayw,

    Non, le programme peut s'executer sur n'importe quel PC, il reconnait l'entrée Point qu'il transforme en Virgule.
    Même lorsque j'insere dans le code par exemple :

    TextboxA.text = 1.08

    (puisque de toute façon le code n'accepte pas la virgule) il assignera la textbox à 1,08 au démarrage

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. récup et sauvegarde d'un axe dans une 2éme fenétre
    Par kwich-bow dans le forum Interfaces Graphiques
    Réponses: 14
    Dernier message: 04/06/2009, 18h06
  2. [XL-2003] Calculer le temps passé dans une boucle for
    Par mancired dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/05/2009, 16h06
  3. Affichage de l'heure en temps réel dans une interface
    Par T-MAT dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 26/12/2008, 20h08
  4. insertion en temps réel dans une combolist
    Par new_wave dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 05/09/2006, 18h55
  5. Réponses: 4
    Dernier message: 16/06/2006, 04h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo