OVH Cloud OVH Cloud

Formulaires ... ?

6 réponses
Avatar
Jacques
Bonjour,

J'essaie tant bien que mal de passer de VB6 à VB NET. Après plusieurs
recherches , je ne trouve pas la solution ou l'explication à mon problème.
J'ai créé deux formulaires. J'ouvre le premier et via un évènement bouton
j'ouvre le deuxième formulaire. Si j'ai bien compris au moment du click,
j'ai écris ceci :

...

Dim frmFiche As New Form2

frmFiche.ShowDialog()

effectivement mon deuxième formulaire s'ouvre.

Dans ce deuxième formulaire, j'entre des données de distances et de temps et
dans un module je calcule la moyenne au kilomètre.
Le problème se situe dans le module où je calcule la moyenne. A l'issue du
calcul, je veux mettre la propriété texte d'un contrôle
textbox (txtMoyenne) à jour qui se trouve sur mon deuxième formulaire.

MKm = TTotal / (Distance / 1000)

frmFiche.txtMKm.Text = MKm


et c'est là que j'ai une erreur ! Il ne connait pas frmFiche.Si je fais un
frmFiche as New Form2, il me semble qu'il crée alors un deuxième formulaire
donc ce n'est pas cela que je dois faire. Comment avoir accès au propriétés
des contrôles qui se trouvent sur ce deuxième formulaire.
Dans VB6, cela était facile puisqu'il fallait juste écrire le nom du
formulaire (formulaire.nomcontrole.text) .

Un peu d'aide me serait d'une grande utilité pour que je puisse continuer
mon apprentissage :-)

Merci d'avance de vos réponses

6 réponses

Avatar
Jacques
Petite précision, voici le message d'erreur :

Informations supplémentaires : La référence d'objet n'est pas définie à une
instance d'un objet.



"Jacques" a écrit dans le message de
news:%
Bonjour,

J'essaie tant bien que mal de passer de VB6 à VB NET. Après plusieurs
recherches , je ne trouve pas la solution ou l'explication à mon problème.
J'ai créé deux formulaires. J'ouvre le premier et via un évènement bouton
j'ouvre le deuxième formulaire. Si j'ai bien compris au moment du click,
j'ai écris ceci :

...

Dim frmFiche As New Form2

frmFiche.ShowDialog()

effectivement mon deuxième formulaire s'ouvre.

Dans ce deuxième formulaire, j'entre des données de distances et de temps


et
dans un module je calcule la moyenne au kilomètre.
Le problème se situe dans le module où je calcule la moyenne. A l'issue du
calcul, je veux mettre la propriété texte d'un contrôle
textbox (txtMoyenne) à jour qui se trouve sur mon deuxième formulaire.

MKm = TTotal / (Distance / 1000)

frmFiche.txtMKm.Text = MKm


et c'est là que j'ai une erreur ! Il ne connait pas frmFiche.Si je fais un
frmFiche as New Form2, il me semble qu'il crée alors un deuxième


formulaire
donc ce n'est pas cela que je dois faire. Comment avoir accès au


propriétés
des contrôles qui se trouvent sur ce deuxième formulaire.
Dans VB6, cela était facile puisqu'il fallait juste écrire le nom du
formulaire (formulaire.nomcontrole.text) .

Un peu d'aide me serait d'une grande utilité pour que je puisse continuer
mon apprentissage :-)

Merci d'avance de vos réponses


























Avatar
Zoury
Salut Jacques !

J'essaie tant bien que mal de passer de VB6 à VB NET.



ahHa! l'orienté-objet fait encore des victimes. ;O)

Si j'ai bien compris au moment du click,
j'ai écris ceci :

Dim frmFiche As New Form2
frmFiche.ShowDialog()



C'est excellent ça. :OD


Dans ce deuxième formulaire, j'entre des données de distances et de temps


et
dans un module je calcule la moyenne au kilomètre.



C'est là que ça se corse.. :O)

N'oublie pas le concept de portée d'une variable. la variable frmFiche
n'existe que pour la fonction ou le module où elle a été définie.

Ex :
'***
Option Explicit On

Public Class Test

Private m_s As String

Public Function f1() As Int32
m_s = "" ' m_s est disponible dans tout le module
End Function

Public Function f2() As Int32
m_s = "" ' m_s est disponible dans tout le module
End Function

End Class
'***
Option Explicit On

Public Class Test

Public Function f1() As Int32
Dim s As String
s = "" ' s n'est disponible que dans cette fonction
End Function

Public Function f2() As Int32
s = "" ' s n'est pas disponible dans cette fonction
End Function

End Class
'***

petite note :
L'emploi de Module en .NET n'est pas utile. Ça va à l'encontre du concept de
l'orienté objet. On peut les remplacer par des classes avec des membres
partagés (c'est ce qu'il devienne après la compile de toute façon).

Mais ton problème ne situe pas là..

En fait ta fonction ne devrait contenir qu'une seule ligne :
Return TTotal / (Distance / 1000)



et la ligne suivante devrait être remplacer comme ceci par exemple dans ton
Form2.
frmFiche.txtMKm.Text = CalculerMoyenne(...)





Isole bien ton code.

Une fonction ne devrait faire que ce qu'elle dit. CalculerMoyenne() devrait
calculer une moyenne et retourner le résultat, un point c'est tout.
L'affectation du résultat à un TextBox ne fait pas partie de ses tâches.

Maintenant Form2 est un formulaire de type "dialogue" (c'est pourquoi tu
l'affiches avec ShowDialog()). Les boîtes de dialogues peuvent être
considérées comme des fonctions (ou centre de fonctions), seulement certains
paramètres sont fournis par l'utilisateur. Si on respecte ce concept, ton
formulaire Form2, devrait s'ouvrir, recevoir les données de l'utilisateur,
effectuer le calcul de la moyenne et retourner le résultat à Form1 via une
ou des propriétés.

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Jacques
Bonjour Zouri (et merci),

Je suis peut-être lourd mais ça ne fonctionne pas :-( ... voici mon code !
Où est l'erreur cher maître ?? :-)

Ma classe : (Calcul.vb)

Option Explicit On

Public Class Calcul

Dim THr As Single

Dim TMin As Single

Dim TSec As Single

Dim TTotal As Single

Dim Distance As Single

Dim MKm As Single

Public Function Moyenne(ByVal H As Single, ByVal M As Single, ByVal S As
Single, ByVal D As Single) As Single

THr = CSng(H)

TMin = CSng(M)

TSec = CSng(S)

Distance = CSng(D)

'ramener tout en secondes

THr = THr * 3600

TMin = TMin * 60

TTotal = THr + TMin + TSec

'total en minutes

TTotal = Format((TTotal / 60), "##.00")



MKm = TTotal / (Distance / 1000)

Return MKm

End Function

End Class



Dans mon formulaire :



'calcul moyenne au km

Me.txtMKm.Text = Moyenne(CSng(txtTHr.Text), CSng(txtTMin.Text),
CSng(txtTSec.Text), CSng(txtDistance.Text))


Message d'erreur -->

Visual Studio ProjectsWindowsApplication1Form2.vb(683): Le nom 'Moyenne'
n'est pas déclaré.


Si je comprends celle-ci , je devrait comprendre le reste ... ou plutôt les
autres :-)
Avatar
Emmanuel Petit
Jacques a écrit :
Bonjour Zouri (et merci),

Je suis peut-être lourd mais ça ne fonctionne pas :-( ... voici mon code !
Où est l'erreur cher maître ?? :-)

Ma classe : (Calcul.vb)

Option Explicit On

Public Class Calcul

Dim THr As Single

Dim TMin As Single

Dim TSec As Single

Dim TTotal As Single

Dim Distance As Single

Dim MKm As Single

Public Function Moyenne(ByVal H As Single, ByVal M As Single, ByVal S As
Single, ByVal D As Single) As Single

THr = CSng(H)

TMin = CSng(M)

TSec = CSng(S)

Distance = CSng(D)

'ramener tout en secondes

THr = THr * 3600

TMin = TMin * 60

TTotal = THr + TMin + TSec

'total en minutes

TTotal = Format((TTotal / 60), "##.00")



MKm = TTotal / (Distance / 1000)

Return MKm

End Function

End Class



Dans mon formulaire :





Dans le formulaire, il faut declarer une instance de la classe
soit

dim MonCalcul as New Calcul

et ensuite changer
Me.txtMKm.Text = MonCalcul.Moyenne(CSng(txtTHr.Text),
CSng(txtTMin.Text),CSng(txtTSec.Text), CSng(txtDistance.Text))

Là celà devrait marcher

'calcul moyenne au km

Me.txtMKm.Text = Moyenne(CSng(txtTHr.Text), CSng(txtTMin.Text),
CSng(txtTSec.Text), CSng(txtDistance.Text))


Message d'erreur -->

Visual Studio ProjectsWindowsApplication1Form2.vb(683): Le nom 'Moyenne'
n'est pas déclaré.


Si je comprends celle-ci , je devrait comprendre le reste ... ou plutôt les
autres :-)




Avatar
Zoury
> Dans le formulaire, il faut declarer une instance de la classe soit



J'opterais pour une méthode Shared, car logiquement, nous ne devrions pas
devoir instancier un objet Calcul pour appeler la fonction, car un objet
Calcul dans ce cas ci ne peux changer d'état. Il n'a pas de propriétés qui
serait propre à chaque instance.


Jacques,

Essai de déclarer tes variables avec la plus petite portée nécessaire (soit
dans la fonction dans ce cas ci). Essai aussi de ne pas déclarer de variable
inutilement. Dans ton cas, les paramètres sont passés ByVal (par copie), tu
peux donc travailler directement avec ceux-ci sans avoir à les recopier
ailleurs.

Deux petites notes :

THr = CSng(H)


Cette convertion est inutile puisque H est déjà de type Single.

TTotal = Format((TTotal / 60), "##.00")


La fonction Format() permet de transformer une donnée (Date ou numérique) en
chaine de caractère selon un format spécifié. Dans ce cas-ci, puisque tu
envois le résultat dans un type Single, VB retransforme la chaine en type
Single automatiquement, tu perds donc ton formatage. Le *formatage de
chaine* ne devrait être utiliser que *lorsque l'on veut afficher une donnée
à l'utilisateur*.

Aussi, tu ramènes le tout en secondes pour ensuite recalculer le nombre de
minute (* 60, / 60)... Tu peux t'éviter beaucoup de problème en employant la
classe TimeSpan qui représente une période de temps.

Voici ta classe modifié en suivant les commentaires énoncé ci-haut. J'ai
ajouté le mot Shared dans la signature pour désigné que la méthode est
accessible au niveau de la classe (pas d'instance nécesssaire). Le mot clé
NotInheritable désigne que cette classe ne peut être hérité (et il me semble
avoir lu que le compilateur effectuait quelques optimisations
supplémentaires à l'interne).
'***
Option Explicit On

Public NotInheritable Class FonctionsCalculs

Public Function CalculerMinutesParKM(ByVal tsTempsEcoule As TimeSpan,
ByVal fDistMetre As Single) As Single
' temps en minutes / distance en kilomètre
Return tsTempsEcoule.TotalMinutes / (fDistMetre / 1000)
End Function

End Class
'***

Tu l'utilises comme ceci :
'***
' parcours de 1000 mètres en 1 heure -> résultat = 60 min
Console.WriteLine(FonctionsCalculs.CalculerMinutesParKM(New TimeSpan(1,
0, 0), 1000))

' parcours de 2200 mètres en 42 minutes et 17 secondes -> résultat 19,2197 min
Console.WriteLine(FonctionsCalculs.CalculerMinutesParKM(New TimeSpan(0,
42, 17), 2200))
'***

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Jacques
Merci à vous deux ... pour votre patience :-)



"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
> Dans le formulaire, il faut declarer une instance de la classe soit

J'opterais pour une méthode Shared, car logiquement, nous ne devrions pas
devoir instancier un objet Calcul pour appeler la fonction, car un objet
Calcul dans ce cas ci ne peux changer d'état. Il n'a pas de propriétés qui
serait propre à chaque instance.


Jacques,

Essai de déclarer tes variables avec la plus petite portée nécessaire


(soit
dans la fonction dans ce cas ci). Essai aussi de ne pas déclarer de


variable
inutilement. Dans ton cas, les paramètres sont passés ByVal (par copie),


tu
peux donc travailler directement avec ceux-ci sans avoir à les recopier
ailleurs.

Deux petites notes :

> THr = CSng(H)
Cette convertion est inutile puisque H est déjà de type Single.

> TTotal = Format((TTotal / 60), "##.00")
La fonction Format() permet de transformer une donnée (Date ou numérique)


en
chaine de caractère selon un format spécifié. Dans ce cas-ci, puisque tu
envois le résultat dans un type Single, VB retransforme la chaine en type
Single automatiquement, tu perds donc ton formatage. Le *formatage de
chaine* ne devrait être utiliser que *lorsque l'on veut afficher une


donnée
à l'utilisateur*.

Aussi, tu ramènes le tout en secondes pour ensuite recalculer le nombre de
minute (* 60, / 60)... Tu peux t'éviter beaucoup de problème en employant


la
classe TimeSpan qui représente une période de temps.

Voici ta classe modifié en suivant les commentaires énoncé ci-haut. J'ai
ajouté le mot Shared dans la signature pour désigné que la méthode est
accessible au niveau de la classe (pas d'instance nécesssaire). Le mot clé
NotInheritable désigne que cette classe ne peut être hérité (et il me


semble
avoir lu que le compilateur effectuait quelques optimisations
supplémentaires à l'interne).
'***
Option Explicit On

Public NotInheritable Class FonctionsCalculs

Public Function CalculerMinutesParKM(ByVal tsTempsEcoule As TimeSpan,
ByVal fDistMetre As Single) As Single
' temps en minutes / distance en kilomètre
Return tsTempsEcoule.TotalMinutes / (fDistMetre / 1000)
End Function

End Class
'***

Tu l'utilises comme ceci :
'***
' parcours de 1000 mètres en 1 heure -> résultat = 60 min
Console.WriteLine(FonctionsCalculs.CalculerMinutesParKM(New


TimeSpan(1,
0, 0), 1000))

' parcours de 2200 mètres en 42 minutes et 17 secondes -> résultat > 19,2197 min
Console.WriteLine(FonctionsCalculs.CalculerMinutesParKM(New


TimeSpan(0,
42, 17), 2200))
'***

--
Cordialement
Yanick
MVP pour Visual Basic