Quel est l'erreur ?

arthurbertau Messages postés 2 Date d'inscription dimanche 27 décembre 2020 Statut Membre Dernière intervention 28 décembre 2020 - Modifié le 27 déc. 2020 à 22:23
 arthurbertau - 7 janv. 2021 à 08:19
Bonsoir,
Je dois rendre un dossier pour mon examen de janvier, mon code fonctionne mais j'aimerais rajouter de l'automatisation. J'aimerais que lorsque j'appuie sur enter mon code s'active mais rien ne se passe ...
Pouvez-vous m'aider ?

Merci et bonne fin de soirée
Public Class Form1
    Dim A, B, C, D, J, F, G, H, I, K, L, M, X, Y, Z
    Dim matrice(1) As Double
    Dim déterminant As Double
    Dim det1 As Double
    Dim det2 As Double
    Dim det3 As Double
    Dim det4 As Double
    Dim det5 As Double
    Dim det6 As Double

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles calculer.Click
        A = TextBox1.Text
        B = TextBox2.Text
        C = TextBox3.Text
        D = TextBox4.Text
        J = TextBox5.Text
        F = TextBox6.Text
        G = TextBox7.Text
        H = TextBox8.Text
        I = TextBox9.Text
        K = TextBox10.Text
        L = TextBox11.Text
        M = TextBox12.Text
        det1 = A * (((J) * (I)) - ((H) * (F)))
        det2 = B * (((D) * (I)) - ((G) * (F)))
        det3 = C * (((D) * (H)) - ((G) * (J)))
        déterminant = det1 - det2 + det3
        If déterminant = 0 Then
            TextBox13.Text = "les équations sont indéterminée"
        ElseIf déterminant <> 0 Then
            det4 = (K * (((J) * (I)) - ((H) * (F)))) - (B * (((L) * (I)) - ((M) * (F)))) + (C * (((L) * (H)) - ((M) * (J))))
            X = det4 / déterminant
            det5 = (A * (((L) * (I)) - ((M) * (F)))) - (K * (((D) * (I)) - ((G) * (F)))) + (C * (((D) * (M)) - ((G) * (L))))
            Y = det5 / déterminant
            det6 = ((((J) * (M)) - ((H) * (L)))) - (B * (((D) * (M)) - ((G) * (L)))) + (K * (((D) * (H)) - ((G) * (J))))
            Z = det6 / déterminant
            TextBox13.Text = "x =" & X & "   " & "y=" & Y & "   " & "z=" & Z
        End If
    End Sub

    Private Sub calculer_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles calculer.KeyPress
        If Asc(e.KeyChar) = 13 Then
            det1 = A * (((J) * (I)) - ((H) * (F)))
            det2 = B * (((D) * (I)) - ((G) * (F)))
            det3 = C * (((D) * (H)) - ((G) * (J)))
            déterminant = det1 - det2 + det3
            If déterminant = 0 Then
                TextBox13.Text = "les équations sont indéterminée"
            ElseIf déterminant <> 0 Then
                det4 = (K * (((J) * (I)) - ((H) * (F)))) - (B * (((L) * (I)) - ((M) * (F)))) + (C * (((L) * (H)) - ((M) * (J))))
                X = det4 / déterminant
                det5 = (A * (((L) * (I)) - ((M) * (F)))) - (K * (((D) * (I)) - ((G) * (F)))) + (C * (((D) * (M)) - ((G) * (L))))
                Y = det5 / déterminant
                det6 = ((((J) * (M)) - ((H) * (L)))) - (B * (((D) * (M)) - ((G) * (L)))) + (K * (((D) * (H)) - ((G) * (J))))
                Z = det6 / déterminant
                TextBox13.Text = "x =" & X & "   " & "y=" & Y & "   " & "z=" & Z
            End If
        End If
    End Sub
End Class

7 réponses

Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
28 déc. 2020 à 09:30
Bonjour

Maintenant que @Karamel a rendu ton code lisible, on peut commencer à y voir clair.

J'aimerais que lorsque j'appuie sur enter mon code s'active mais rien ne se passe ...

Où appuies tu tu enter?
  • sur button1?
  • sur calculer?


Quel est le type de calculer?

As tu placé un point d’arret dans tes méthodes et exécuté le code en pas à pas, tout en espionnant le contenu des variables pour voir ce qui se passe?

En aparté, ton nommage de contrôle n’est pas bon. « Button1 » ou « textbox1 » ne donnent aucune indication sur leur utilité, et « calculer » ne donne aucune indication sur le type du contrôle.
Dans 6 mois, si on te demande de faire évoluer ce code tu ne sauras plus qui fait quoi....
Une façon de nommer conseillée un peu partout et de commencer par quelques caractères qui symbolise le type de contrôle (par exemple tbx => TextBox, but => Button, frm => Form, etc) et ensuite un ou deux mots en camel case décrivant l’utilité (par exemple butCalcuDeterminant, txtParamA)
1
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
28 déc. 2020 à 15:53
Tu peux commencer par lire ceci
https://openclassrooms.com/fr/courses/1526901-apprenez-a-developper-en-c/2867766-utilisez-le-debogueur/

Ensuite, quand on clique sur enter alors qu’un bouton a le focus, c’est l’événement Click qui est déclenché.
1
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 28 déc. 2020 à 17:48
Salut Whis
Le lien que tu as donné est un lien "mort"

Bonjour arthurberteau
On a tous été débutant un jour . Pour être efficace il faut apprendre et assimiler les bases du langage .
Un excellent cours bien qu'il date un peu : https://plasserre.developpez.com/cours/vb-net/ . il ne fera pas de toi un codeur hors pair mais te permettra de coder correctement et d'évoluer si tu suis ce cours .
Bon courage

Ton "Enter" c'est lorsque tu modifies une Textbox et que tu valides par la touche "Enter" . Et tu voudrais que ceci déclenche ton code si je comprends bien ?

1
oui c'est ça
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > arthurbertau
Modifié le 3 janv. 2021 à 17:05
Bonjour
il faut te servir de l'évènement KeyPress de tes TexTbox en enchainant les évènements à la même Textbox . Ceci évite la répétion de code inutililement ;

Private Sub Textbox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Textbox1.KeyPress,  Textbox2.KeyPress, Textbox3.KeyPress,    ' etc... jusqu'à la dernière Textbox à contrôler

        If e.KeyChar = Convert.ToChar(13) Then
            ' ton code
        End if


On peut faire autrement avec une List(of Textbox) créees dybamiquement par le code mais je ne sais pas si tu connais cette technique .

Autre chose
1) Pourquoi les variables
Dim A, B, C, D, J, F, G, H, I, K, L, M, X, Y, Z 
ne sont pas typées ?
2)
    Dim det1 As Double
    Dim det2 As Double
    Dim det3 As Double
    Dim det4 As Double
    Dim det5 As Double
    Dim det6 As Double
peut s'écrire sur une seule ligne

    Dim det1, det2, det3, det4, det5, det6 As Double
    


3) On réserve Dim aux procédures Sub et Function . Pour les variables générales à une Form on préfèrera Private
    Public Class Form1
    
        Private A, B, C, D, J, F, G, H, I, K, L, M, X, Y, Z ' types à rajouter
        Private matrice(1) As Double
        Private determinant As Double ' remarque : ne pas mettre d'accent ou de cédille dans les variables
        Private det1, det2, det3, det4, det5, det6 As Double
        
       '  etc .....
    


4) du coup Button1 devient inutile
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
3 janv. 2021 à 23:25
Quelques erreurs de frappe dans mon message précédent .
Il faut lire inutilement et non inutililement, créées et non créees et aussi dynamiquement et non dybamiquement .
Fautes de frappe surement dues à mon âge avancé .
0
arthurbertau > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
4 janv. 2021 à 15:18
bonjour,
merci pour votre temps !
que voulez vous dire pas typée ?
merci
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > arthurbertau
4 janv. 2021 à 15:44
Bonjour
Prenons un exemple
Dim A, B, C
là je déclare 3 variables mais on ne sait pas le type de variable

Dim A, B, C as Integer
là je déclare 3 variables de type Integer

Dim A, B, C as String
là je déclare 3 variables de type String
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
28 déc. 2020 à 17:27
Ha ben pour une fois qu’openclassroom avait un bon tuto, ils l’ont viré....

Y’a celui là aussi
https://docs.microsoft.com/fr-fr/visualstudio/debugger/debugger-feature-tour?view=vs-2019
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
5 janv. 2021 à 21:01
Bonsoir

j'avais laissé de coté cette discussion, pensant le problème simple à résoudre et VB parfaitement à même de t'y mener.
Il semble que non finalement, on dirait qu'il y a une incompréhension entre vous.

Je reviendrais un peu plus tard avec un exemple (code et captures d'écran) de ce que je pense être une solution.

Mais en attendant, sur la forme, ton code est "lourd", il y a des choses inutiles ou obsolètes qui le rendent plus difficile à lire que nécessaire (et donc à debboguer)
  • les parenthèses en trop

sur cette ligne par exemple
det1 = A * (((J) * (I)) - ((H) * (F)))
les parenthèses autour d'une variable ne servent à rien, on peut donc déjà simplifier comme ça
det1 = A * ((J * I) - (H * F))
. Mais c'est pas tout, VB respecte la priorité des opérations => la multiplication est prioritaire sur la soustraction et l'addition, il ne faut mettre des parenthèses que pour contrecarrer cette priorité.
On arrive à
det1 = A * (J * I - H * F)
, ça fait moins mal aux yeux non?
  • la construction de string

ça
TextBox13.Text = "x =" & X & "   " & "y=" & Y & "   " & "z=" & Z
c'est du VB6. Comme précédement c'est lourd à lire, les & et les ", y'en a partout et on a vite fait de se tromper. En plus en l'état, X, Y et Z étant des doubles ça peut afficher pleins de chiffres après la virgule => code difficile à coder et à lire et résultat encore plus difficiles à lire du gens
"x= 1.99999999999999999999999 y = 1.234567890123456789 etc..."
effet pourri garanti, surtout si c'est plus long que ce que ton textbox peut afficher.
VB.Net, permet d'écrire le texte fixe d'un coup, en balisant l'emplacement des données variables. Et en plus de baliser on, peut formater. On liste ensuite les variables à insérer
String.Format("x={0:0.00} y={1:0.00} z={2:0.00}", 1.23456789, 2.99999999999, 3.0987654321)
ce qui donne en mode console


PS pour l'historique VB6 a été abandonné par Microsoft progressivement entre 1998 et 2005 (plus de 15 ans....)
PS2 VB.Net est en fait du C# avec un skin VB, C# a une lointaine ascendance avec le C, langage dans lequel il est déjà possible de composer des strings avec le modèle balisé et formaté et ensuite les variables

1
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
5 janv. 2021 à 21:22
J'ai oublié un truc sur le fond
  • "chacun chez soi et les poules seront bien gardés"

un bout de code qui fait un calcul, fait un calcul
un bout de code qui interagit avec l'interface, interagit avec l'interface

Moins on mélange plus c'est clair
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
5 janv. 2021 à 21:52
Pour mon exemple, j'ai un formulaire avec 3 textbox
  • tbxA
  • tbxB
  • tbxRes

et des labels qui indiquent leur rôles.


J'ai une méthode qui calcule (et rien que ça)
    ''' <summary>
    ''' Méthode qui calcule la division de 2 nombres
    ''' C'est donc une méthode dont le travail est un calcul
    ''' </summary>
    ''' <param name="Dividende">Nombre à diviser</param>
    ''' <param name="Diviseur">Nombre par lequel on divise</param>
    ''' <returns></returns>
    Private Function Divise(Dividende As Double, Diviseur As Double) As Double
        If Diviseur = 0 Then
            Return Double.NaN 'la division par 0 est impossible alors on retourne Not A Number
        End If

        Return Dividende / Diviseur

    End Function


J'ai aussi une méthode qui gère l'IHM, attention sa signature est celle d'une méthode abonnée à un évènement KeyPress d'un TextBox
    ''' <summary>
    ''' Méthode abonné aux évenènements KeyPress des 2 textbox d'entrée
    ''' Cette méthode vérifie que les conditions sont remplies pour le calcul et si oui demande à la méthode dédiée de le faire.
    ''' Elle affiche un text selon le cas.
    ''' C'est une méthode d'IHM
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub MesTextBox_KeyPress(sender As Object, e As KeyPressEventArgs)
        'sender est l'objet qui appelle la méthode, en théorie c'est un textbox, on essaye de caster pour vérifier

        Dim tbx As TextBox = TryCast(sender, TextBox)
        If tbx Is Nothing Then
            Return 'finallement c'était pas un textbox, y'a un bog quelque part mais on s'en affanchi en quittant la méthode maintenant
        End If

        If e.KeyChar <> Convert.ToChar(13) Then
            tbxRes.Text = "tapez Enter pour calculer"
            Return
        End If

        Dim a, b As Double
        If Double.TryParse(tbxA.Text, a) And Double.TryParse(tbxB.Text, b) Then
            'les textes contenus dans tbxA et tbxB sont convertis en double, on peut appeler la méthode qui calcule
            Dim res As Double = Divise(a, b)
            If Double.IsNaN(res) Then
                tbxRes.Text = "Division par 0 impossible"
            Else
                tbxRes.Text = String.Format("A/B = {0:0.000}", res)
            End If

        Else
            tbxRes.Text = "tbxA et tbxB ne contiennent pas que des nombres"
        End If


    End Sub


Dans le designer, on sélectionne un textBox d'entrée, on va chercher l'évènement KeyPress et surtout on ne double clique pas, on clique sur la liste déroulantes et toutes les méthodes du formulaire dont la signature est compatible seront sélectionnables.


Là y'en a qu'une, mais faudra faire attention quand tu en auras plusieurs (d'où l'importance d'un nom fort).

On fait pareil avec le 2eme textbox et y'a plus qu'à




1
merci pour votre temps ;)
0
arthurbertau Messages postés 2 Date d'inscription dimanche 27 décembre 2020 Statut Membre Dernière intervention 28 décembre 2020
28 déc. 2020 à 15:22
Bonjour,
je suis nouveau sur le forum mais je ferais gaffe pr la prochaine fois ( merci @Karamel).
J'ai changé le nom de button1 par calculer mais je l'ai oublié dans mon code. Qu'est ce qu'un point d'arrêt. je suis désolé mais je suis vriament pas doué en code (j'esssaye d'évoluer mais ce n'est pas facile)

merci pour vos réponse
0
Rejoignez-nous