zebiker
Messages postés34Date d'inscriptionvendredi 10 janvier 2003StatutMembreDernière intervention12 novembre 2008
-
2 mars 2008 à 16:31
zebiker
Messages postés34Date d'inscriptionvendredi 10 janvier 2003StatutMembreDernière intervention12 novembre 2008
-
4 mars 2008 à 13:19
bonjour à tous
je ne comprend pas pourquoi j'ai une erreur, ca devrait etre simple :
Voici la classe que j'ai définie :
'definition radio class
Public Class uneRadio
Private frequency As Double
Private modulation As String
Private description As String
'constructor of creating a new object of type 'radio'
Sub New(ByVal Lafreq As Double, ByVal Lemode As String, ByVal ladesc As String)
frequency = Lafreq
modulation = Lemode
description = ladesc
End Sub
'constructors
Public Function create(ByVal Lafreq As Double, ByVal Lemode As String, ByVal ladesc As String)
frequency = Lafreq
modulation = Lemode
description = ladesc
End Function
'accessors
Public Function laFrequency()
Return frequency
End Function
Public Function laModulation()
Return modulation
End Function
Public Function laDescription()
Return description
End Function
'exemple de creation de radio :
'Dim maradio As New uneRadio(89.4, librairie.leMode.FM, "salut toi")
End Class
Est ce que vous voyez une erreur ???? Moi non, VB non plus...
ensuite dans ma form je fais ceci :
'cree mon tablea de type unRadio
Dim lesRadioFav(10) As uneRadio
dim index as integer
For index = 0 To 10
' ET LA ERREUR :
'Additional information: Object reference not set to an instance of an object.
'a cause de la lign suivante :
lesRadioFav(index).create(56.5, "AM", "description")
Next
Voila je comprend pas bien pourquoi cette erreur : les types sont bien respectés et tout ...
keke4483
Messages postés17Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention 6 mars 2008 2 mars 2008 à 16:43
Ca fait bien longtemps que je n'ai pas de VB mais je dirais que le problème vient du fait que tu n'instancie pas tes classes avant de les utiliser.
'cree mon tablea de type unRadio
Dim lesRadioFav(10) As uneRadio
dim index as integer
For index = 0 To 10
lesRadioFav(index) = new uneRadio()
lesRadioFav(index).create(56.5, "AM", "description")
Next
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 4 mars 2008 à 05:18
Salut zebiker,
Bon début, mais apparement tu as "hérité" de qq techniques venant d'un autre langage
1° Ta function 'create'
A priori elle ne sers pas à grand chose dans ton cas. Pour instancier une classe uneRadio tu vas utiliser son constructeur, dans lequel tu va passer les arguments adéquats. La fonction create peut tout de même être utile lorsque tu voudra changer les données de ta radio (frequ, ...) déjà instancié dans une autre partie du code, mais tu pourra tout aussi bien utiliser ses propriétés pour le faire (voir la suite).
De plus, tu aura un warning, car une fonction doit retourner une valeur. (il faut faire une Sub si tu ne veux pas qu'elle retourne de valeur)
2° Tes 'accessors'
Pour retourner une valeur, il vaut mieux utiliser des propriétés et non des fonctions:
Public Property laFrequency() as Double
Get
Return frequency
End Get
Set(Value as Double)
frequency = Value
End Set
End Property
ou comme ceci si tu la veux en lecture seule:
Public ReadOnly Property laFrequency() as Double
Get
Return _frequency
End Get
End Property
Enfin, il faut déclarer le type de tes fonctions:
Public Function laFrequency() as Double
Car sinon elle retourne un Object (type par défaut)
3° Fonction Shared
Il est possible que ton erreur venait de là. Tu peux utiliser une fonction quelconque (create par exemple) qui te créé une instance de ta classe et te la retourne. Dans ce cas, on la déclare Shared.
Shared Function create(ByVal Lafreq As Double, ByVal Lemode As String, ByVal ladesc As String) as uneRadio
Return New uneRadio(Lafreq, Lemode, ladesc)
End Function
Et on l'utilise de cette façon (sans utiliser le constructeur):
lesRadioFav(index) = uneRadio.create(56.5, "AM", "description")
Ceci n'est pas utile dans la plupart des cas, mais il faut savoir que ça existe.
4° Autres remarques
Lorsque tu déclare un constructeur qui possède des arguments, le
constructeur par défaut (constructeur sans argument) n'est plus créé et
n'est donc plus utilisable. Si tu veux avoir un constructeur sans
argument et un autre avec des arguments, il faut explicitement les
déclarer les deux:
Public Sub New(Arg1 as Integer, Arg2 as Integer)
...
End Sub
Public Sub New()
...
End Sub
Dans ton cas tu ne peux donc pas instancier une classe uneRadio de cette façon:
Dim laRadio =new uneRadio()
zebiker
Messages postés34Date d'inscriptionvendredi 10 janvier 2003StatutMembreDernière intervention12 novembre 2008 4 mars 2008 à 13:19
okies merci beaucoup aussi à toi kevin, j'avais quelques bases de Java (mais j'avais pas écouté en cours, ce que je regrette maintenant)
Tout marche nikel, j'ai modifié comme tu me l'as expliqué.
Ce qui me manquait c'était des explication claires, car des exemples simple j'en ai pas trouvé beaucoup sur le net ...
Merci d'avoir pris le temps d'écrire tout ca !
bonne continuation
Florian