Vooyez vous ce qui cloche dans ce code ?????

Résolu
Signaler
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Statut
Membre
Dernière intervention
21 novembre 2013
-
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Statut
Membre
Dernière intervention
21 novembre 2013
-
Bonjour
J'ai crée un petit form pour un logiciel. Ce petit form se lance avec le bouton d'un autre form initialement ouvert et est censé effectuer un petit calcul
- on rentre les valeurs A et B comprises entre 40.00 et 56.00
- On clique sur un bouton calcul qui fait l'operation C = -4[1-((B/A)^2)]
- La valeur C s'affiche
- je peux fermer le formulaire avec un bouton "close"
- Je peux transferer la valeur de C dans le formulaire initial avec un bouton "replace"

Voici une image du formulaire



et voici mon code :
Public Class form
    Private Property valA As Double
    Private Property valB As Double
    Private Property valC As Double
        
Private Sub Calculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Calculate.Click
        valC = -4 * (1 - ((valB / valA) ^ 2))
        C.Text = valC.ToString("0.00")
    End Sub

Private Sub Buttonclose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttonclose.Click
        If langue = "en" Then
            messageaff = "Really exit the form ?"
            infoaff = "Exit"
        Else
            messageaff = "Voulez vous vraiment le Formulaire ?"
            infoaff = "Quitter"
        End If
        If MessageBox.Show(messageaff, infoaff, MessageBoxButtons.YesNo) = DialogResult.Yes Then
            Me.Hide()
        End If
    End Sub
End Class


A priori vraiment simple donc.
Mais j'ai les 2 problemes suivants :
- Lorsque je clique sur close, ce n'est pas le formulaire form qui se ferme mais tout le logiciel
- Lorsque je clique sur "Calculate", je n'ai pas la valeur dans la textbox C. J'ai ecrit "non numerique"

Je ne vois pas le souci, le voyez vous ?
Merci

26 réponses

Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
53
J'ai meme crée une textbox 1 ou je ne tape que "," ou "." ben il ne me remplace pas
la ","

chez moi ça remplace
envoie le bout de code que tu as adapté

il n'y a plus de erreurmessage

oui mais tu peux faire plus simple surtout
la sub Erreurmessage()
Messages postés
33
Date d'inscription
jeudi 16 juin 2011
Statut
Membre
Dernière intervention
19 mai 2014
1
Tu as assayé Me.close() ?
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Statut
Membre
Dernière intervention
21 novembre 2013
1
Oui Me.close est encore pire, il me ferme tout et supprime tout ce qui est en memoire dans les forms mais ca c'est normal
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
53
Salut
sers tu du debugger
mets un point d'arret F9 à la ligne
 If langue = "en" Then 

lance le prog appuis sur le bouton close et
continue pas à pas F8 que se passe t'il ?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bonjour,

1) où et comment sont mises à jour les variables ValA et ValB ?
2) aucune raison pour que le Hide ferme quoi que ce soit ! (ne confondrais-tu pas "fermé" avec "invisible", ce qui serait le cas si tu avais déjà caché le premier form et que tu caches ensuite le second).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
111
Date d'inscription
dimanche 24 décembre 2000
Statut
Membre
Dernière intervention
17 novembre 2012
6
1) Déjà dans l'Explorateur de Solution faire un double clic sur "My Project".
Puis, dans l'onglet "Application", à "Mode d'arrêt", mettre "A la fermeture du dernier formulaire". Le programme ne devrait ainsi s'arrêter que lorsque toutes les fenêtres sont fermées ou lorsqu'on lui demande explicitement.

2)Quel intérêt de créer une Property en Private.
Autant mettre : Private nomVariable as double

3) Pour le résultat du calcul, il doit y avoir un truc avec l'entrée des valeurs dans les TextBox.
Attention à bien entrer les décimaux avec une virgule (et non un point).
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
53
Lorsque je clique sur close, ce n'est pas le formulaire form qui se ferme mais tout le logiciel


comment fais tu la différence ?
la cause est
me.hide cache ta form elle n'est pas minimisée
elle est en mémoire de la tu penses que le logiciel est fermé
mais si tu n'as qu'une form et tu écris
me.hide tu ne verras plus rien
Messages postés
14828
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 novembre 2021
157
Bonjour,

Aurais-tu vérifier si dans "l'architecture d'application" (propriétés du projet), tu as séletionné "Quitter le programme à la fermeture du formulaire principal" ou à la fermeture de tous les formulaires ?

De fait, un formulaire masque est considéré Fermé dans cette logique.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Statut
Membre
Dernière intervention
21 novembre 2013
1
Je viens de regarder du cote de l'architecture d'application
Mode d'arret : à la fermeture du formulaire de demarrage
Et pourtant l'action sur le bouton close me ferme tout et j'en suis certain puisqu'il me ferme aussi le formulaire de lancement et je n'ai plus aucun process dans le gestionnaire de tâches.

Pour mon calcul, j'ai toujours le souci de "non numérique" a la place du resultat.

J'investique en mode debug mais je mets quand même le code actuel qui a un peu change

Public Class FORM
    Private Property valB As String
    Private Property valA As String
    Private Property valC As String
    Private erreur As Boolean
    
Private Sub InitialisationFORM()
        ' appelé par lancement du formulaire FORM
        A.Text = ""  'Le textbox A est vide au lancement
        B.Text = ""  'Le textbox A est vide au lancement
        C.Text = ""  'Le textbox A est vide au lancement
 A.BackColor = Color.LightSlateGray
        B.BackColor = Color.LightSlateGray
        C.BackColor = Color.LightSlateGray

End Sub

Private Sub FORM_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     ' Lancement du formulaire
   InitialisationFORM()
   End Sub

Private Sub A_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles A.GotFocus
    ' A a le focus    
A.Text = ""
        A.Refresh()
        Initialisecolor()
        A.BackColor = Color.Purple
End Sub

Private Sub B_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles B.GotFocus
' B a le focus            
B.Text = ""
        B.Refresh()
        Initialisecolor()
        B.BackColor = Color.Purple
End Sub
    

Private Sub Erreurmessage()
'Traitement des erreurs de saisie : 
Les valeurs A et B doivent être compris entre 36.00 et 50.00 (2 décimales) et le point doit apparaitre si on tape une « , » . De plus,, si A et/ou B dépassent 50 on a un message d'avertissement demandant si on veut quand même continuer         

erreur = False
        ' Erreur dans saisie A
        With oeil
            If DecimalSeparator "," Then A.Text A.Text.Replace(".", ",")
            If Double.TryParse(A.Text, .valA) = True Then ' test si numérique
                ' A contient bien une valeur numérique
                .valA = Convert.ToDouble(A.Text)
                If .valA < 36 Or .valA > 50 Then
                    ' on affiche un message d'erreur et on redonne le focus à KC pour renouveler la saisie
                    If langue = "en" Then
                        messageaff = "The A value must be ranging between 36.00 and 50.00°"
                        infoaff = "Data out of range"
                    Else
                        messageaff = "La valeur A doit être comprise entre 36,00 et 50,00"
                        infoaff = "Données hors plage"
                    End If
                    MessageBox.Show(messageaff, infoaff, MessageBoxButtons.OK, MessageBoxIcon.Warning)
                    A.Text = ""
                    A.Refresh()
                    A.Focus()
                    erreur = True
                    Exit Sub
                Else
                    ' Valeur correcte dans la TextBox A
                    ' Test si >= à 52 et message d'avertissement
                    If .valA >= 50 Then
                        If langue = "en" Then
                            messageaff = "The A value is higher or equal to 50: want you to continue with this value ?"
                            infoaff = "Information : A value"
                        Else
                            messageaff = "La valeur A est supérieure ou égale à 50 : voulez-vous continuer avec cette valeur ?"
                            infoaff = "Information : valeur A"
                        End If
                        If MessageBox.Show(messageaff, infoaff, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.No Then
                            A.Text = ""
                            A.Refresh()
                            A.Focus()
                            erreur = True
                            Exit Sub
                        End If
                    End If
                    A.Text = .valA.ToString("0.00") ' 2 chiffres après la virgule
                End If
            Else
                If langue = "en" Then
                    messageaff = "A is not a numeric value"
                    infoaff = "Incorrect data"
                Else
                    messageaff = "La valeur A n'est pas une valeur numérique"
                    infoaff = "Données incorrectes"
                End If
                MessageBox.Show(messageaff, infoaff, MessageBoxButtons.OK, MessageBoxIcon.Warning)
                A.Text = ""
                A.Refresh()
                A.Focus()
                erreur = True
                Exit Sub
            End If

            ' Erreur dans B
            If DecimalSeparator "," Then B.Text B.Text.Replace(".", ",")
            If Double.TryParse(B.Text, .valB) = True Then ' test si numérique
                ' B contient bien une valeur numérique
                .valB = Convert.ToDouble(B.Text)
                If .valB < 36 Or .valB > 50 Then
                    ' on affiche un message d'erreur et on redonne le focus à B pour renouveler la saisie
                    If langue = "en" Then
                        messageaff = "The B value must be ranging between 36.00 and 50.00°"
                        infoaff = "Data out of range"
                    Else
                        messageaff = "La valeur B doit être comprise entre 36,00 et 50,00"
                        infoaff = "Données hors plage"
                    End If
                    MessageBox.Show(messageaff, infoaff, MessageBoxButtons.OK, MessageBoxIcon.Warning)
                    B.Text = ""
                    B.Refresh()
                    B.Focus()
                    erreur = True
                    Exit Sub
                Else
                    ' Valeur correcte dans la TextBox B
                    ' Test si >= à 52 et message d'avertissement
                    If .valB >= 50 Then
                        If langue = "en" Then
                            messageaff = "The B value is higher or equal to 50: want you to continue with this value ?"
                            infoaff = "Information : B value"
                        Else
                            messageaff = "La valeur B est supérieure ou égale à 50 : voulez-vous continuer avec cette valeur ?"
                            infoaff = "Information : valeur B"
                        End If
                        If MessageBox.Show(messageaff, infoaff, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.No Then
                            B.Text = ""
                            B.Refresh()
                            B.Focus()
                            erreur = True
                            Exit Sub
                        End If
                    End If
                    B.Text = .valB.ToString("0.00") ' 2 chiffres après la virgule
                End If
            Else
                If langue = "en" Then
                    messageaff = "B is not a numeric value"
                    infoaff = "Incorrect data"
                Else
                    messageaff = "La valeur B n'est pas une valeur numérique"
                    infoaff = "Données incorrectes"
                End If
                MessageBox.Show(messageaff, infoaff, MessageBoxButtons.OK, MessageBoxIcon.Warning)
                B.Text = ""
                B.Refresh()
                B.Focus()
                erreur = True
                Exit Sub
            End If
        End With
    End Sub
    
'Bouton de calcul faisant l'opération C = -4 [1 ? (B/A)^2]
    Private Sub Calculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Calculate.Click
        With oeil
            C.Text = CStr(-4 * (1 - ((CDbl(valB) / CDbl(valA)) ^ 2)))
        End With
    End Sub
'Bouton de fermeture devant fermer ou cacher le formulaire « FORM » uniquement
Private Sub Buttonclose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttonclose.Click
        If langue = "en" Then
            messageaff = "Really exit the Calculated form ?"
            infoaff = "Exit"
        Else
            messageaff = "Voulez vous vraiment le formulaire ?"
            infoaff = "Aperçu"
        End If
        If MessageBox.Show(messageaff, infoaff, MessageBoxButtons.YesNo) = DialogResult.Yes Then
            forme.Enabled = True
            Me.Hide()
        End If
    End Sub

End Class


Je ne vois pas d'incohérence, j'ai essae de commenter au maximum et pourtant je pense qu'il y a un souci dans les conversions lors du clic sur le Bouton de calcul faisant l'opération C = -4 [1 ? (B/A)^2]

Merci pour l'aide
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Statut
Membre
Dernière intervention
21 novembre 2013
1
ps
j'ai remplace
Private Property valB As String
Private Property valA As String
Private Property valC As String

par
Private valB As String
Private valA As String
Private valC As String
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Statut
Membre
Dernière intervention
21 novembre 2013
1
petite precision quand a l'architectrue d'ouverture et de fermeture de ce formulaire
J'ai le formulaire initial qui se lance au clic sur l'application. Ce formulaire s'appelle forminitial

- Forminitial se lance et on entre des valeurs
- Si on le desire, on clique sur le bouton ouverture_form qui ouvre le formulaire
FORM,il vient se mettre en centerscreen au dessus du forminitial (mais le forminitial ne disparait pas)
- On entre A et B dans FORM et il calcule C
- On peut ensuite
* Soit recopier la valeur C dans le forminitial (non traite encore)
* Soit Fermer le formulaire FORM mais en gardant ouvert le fomrinitial

Voila comment devrait marcher ce petit form et la, quoi que je mette dans archi d'application (fermeture du dernier formulaire de demarrage ou fermeture du dernier formulaire) il me ferme tous les forms et les processus
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Statut
Membre
Dernière intervention
21 novembre 2013
1
Bon, j'ai résolu le probleme de fermeture du formulaire
j'ai crée une fonction

Private Sub closeFORM()
         Me.Hide()
    End Sub


et sur le button close j'ai mis :
  Private Sub Buttonclose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttonclose.Click
        closeFORM()
    End Sub


Je ne sais strictement pas pourquoi cela fonctionne maintenant et pas avant mais ... ca fonctionne ...

me reste le souci de la formule de calcul
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
53
Salut
de toute l'histoire peut tu dires ce qui ne marche pas comme tu veux ?
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Statut
Membre
Dernière intervention
21 novembre 2013
1
salut
Ben maintenant il ne me reste plus qu' regler un petit probleme de decimalseparator
je veux que si on frappe 47,20 par exemple, cela s affiche 47.00 donc prendre le "." . Je suis en train de plancher la dessus c'est pour cela que je n'ai pas poste.
J'essaye dabord de trouver
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
53
Salut

Saches aussi qu'il y a des pc dont le séparateur décimal est une , et si tu forces à changer
en un point causera une erreur

donc pour savoir

Dim sp As String
   sp = 1 / 2
   sp = sp.Substring(1, 1)


opère selon le résultat de sp
if sp = "." then
affiche .
end if

et le reste est Le reste est reglé
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
53
j'ai voulu dire
et si tu forces à changer
en un point cela causera une erreur pour les
caculs mathématique
Messages postés
111
Date d'inscription
dimanche 24 décembre 2000
Statut
Membre
Dernière intervention
17 novembre 2012
6
Si ça peut t'aider, on peut obtenir le signe du séparateur par la propriété suivante :

Dim separateur As String = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator


Si tu veux ensuite remplacer la virgule par un point, tu transformes le nombre obtenu en chaîne (toString) et tu remplaces la virgule par le point.

nombreAvecPoint = (nombre.tostring).replace(",", ".")
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Statut
Membre
Dernière intervention
21 novembre 2013
1
Enfait, j'ai 2 choses a faire
- faire en sorte que A et B soient toujours a 2 decimales si on entre 43,2 il affiche 43,20)
- que le"." soit accepte comme separateur

donc si on entre au clavier "42.56", il affiche "42.56" et si on entre "42,56" il affiche "42.56" et que bien sur le calcul fonctionne
j'avais fait ceci pour le "."

Dim DecimalSeparator As String
en entête
puis
Private Sub A_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles A.GotFocus
        If DecimalSeparator "," Then A.Text A.Text.Replace(".", ",")
        A.Text = ""
        A.Refresh()
        A.BackColor = Color.Purple
    End Sub
pour A
Visiblement cela ne fonctionne pas, peut être ais je mal insere le code ou me suis je trompe ?????
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Statut
Membre
Dernière intervention
21 novembre 2013
1
Voila le code avec lequel je travaille
j'ai essaye le (nombre.tostring).replace(",", ".")
visiblement cela ne fonctionne pas en tout cas je n'ai pas ce que je veux

Public Class FORM
    Dim messageaff As String, infoaff As String
    Dim langue As String
    Dim valA, valB, valC As Double

'Fonction fermeture (masquage du form)
Private Sub closeFORM()
         Me.Hide()
End Sub

' Le textbox A a le focus, son contenu est vide et son fond est violet
Private Sub A_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs)   
Handles A.GotFocus
        A.Text = ""
        A.BackColor = Color.Purple
End Sub
    
' Le textbox A perd le focus, fond devient gris
Private Sub A_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles A.LostFocus
        A.BackColor = Color.LightSlateGray
End Sub

' Le textbox B a le focus, son contenu est vide et son fond est violet
Private Sub B_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles B.GotFocus
        B.Text = ""
        B.BackColor = Color.Purple
End Sub

' Le textbox B perd le focus, fond devient gris
Private Sub B_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles B.LostFocus
      B.BackColor = Color.LightSlateGray
End Sub

'Bouton de calcul, Il fait l'operation -4 [1 - ((b/a)^2)] et place cette valeur dans le textbox C
' En même temps il effectue le traitement d'erreur

'Valeur min et max de A et contrôle si format numérique
Private Sub Calculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Calculate.Click
        If (Not Double.TryParse(A.Text, valA)) Then
            MessageBox.Show("Mauvais format!!!")
            A.Text = ""
            A.BackColor = Color.Purple
            A.Focus()
        End If
        
        If (valA <= 36 Or valA >= 50) Then
            MessageBox.Show("Attention, valeur A doit être comprise entre 36 et
            50!!!")
            A.Text = ""
            A.BackColor = Color.Purple
            A.Focus()
        End If

        'Valeur min et max de B et contrôle si format numérique
        If (Not Double.TryParse(B.Text, valB)) Then
            MessageBox.Show("Mauvais format!!!")
            B.Text = ""
            B.BackColor = Color.Purple
            B.Focus()
        End If
        
        If (valB <= 36 Or valB >= 50) Then
            MessageBox.Show("Attention, valeur B doit être comprise entre 36 et 50!!!")
            B.Text = ""
            B.BackColor = Color.Purple
            B.Focus()
        End If
        
'Calcul de C
C.Text = (-4 * (1 - ((valB) / (valA) ^ 2))).ToString("0.00")
End Sub
    
'Fermeture du formulaire
Private Sub Buttonclose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttonclose.Click
        closeFORM()
    End Sub

' Transfert eventuel de la veleur de C vers un autre formulaire
Private Sub Buttonexport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttonexport.Click
        If langue = "en" Then
            messageaff = "Really export C value in FormB ?"
            infoaff = "Exit"
        Else
            messageaff = "Voulez vous vraiment exporter C dans FORM2 ?"
            infoaff = "Aperçu"
        End If
        If MessageBox.Show(messageaff, infoaff, MessageBoxButtons.YesNo) =   DialogResult.Yes Then
            Form2.Show()
            Form2.X.Text = C.Text
        Else
            Me.Dispose()
        End If
    End Sub
    End Class


Il me manque donc le principal, que je puisse taper un "." a la place de la virgule en entrant les valeurs de A et B, que le chiffre entré s'arrondisse a 2 decimales et que C se calcule sans souci

Voili voila toute l'histoire
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
53
essayes

Private Function GetSp() As Char
        Dim sp As String
        sp = CStr((1 / 2))
        sp = sp.Substring(1, 1)
        Return CChar(sp)
    End Function

    Private Sub TextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp
        Dim sp As Char

        sp = GetSp()

        If sp = "." Then
            If e.KeyCode = Keys.Oemcomma Then
                DirectCast(sender, TextBox).Text = DirectCast(sender, TextBox).Text.Replace(",", sp)
                DirectCast(sender, TextBox).Select(DirectCast(sender, TextBox).TextLength, 0)
            End If
        End If
    End Sub