Pb classes imbriquées

Résolu
cs_olivier_1968 Messages postés 5 Date d'inscription mercredi 1 juin 2005 Statut Membre Dernière intervention 20 janvier 2009 - 24 janv. 2008 à 18:17
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 - 30 janv. 2008 à 13:33
Bonsoir à tous,

J'ai un petit probleme dans mon code VB .net

Voici le code :

Public Class PurchaseOrder
    Public shipTo As USAddress
    Public billTo As USAddress
    Public comment As String
End Class
Public Class USAddress
    Public name As String
    Public street As String
    Public city As String
    Public state As String
    Public zip As Decimal
End Class
Module Serial
Dim po As New PurchaseOrder

Public Sub main()
po.shipTo.city = "test"
End Sub
End Module

Le problem est que lorsque je veut renseigner po.shipTo.city = "test" le
system me dit que l'objet n'existe pas !!

Pourtant lorsque je tape ma ligne po.shitpto.   le vb m'ammene bien les
valeurs dispo en automatique c'est a dir name ou city ou state.
je pourrais déclarer directement  tt as new usaddress mais là je ne vois pas
l'interet de faire des classes imbriquées si il faut décalrer tout les
niveau.

Pour info mon code est largement plus compliqué que l'exemple ci dessus que
j'ai volontairement simplifié pour mieux cilber mon probleme.

J'espere que quelqu'un aura une idée.

Merci d'avance

Olivier

7 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
24 janv. 2008 à 23:50
salut

Public Sub main()

dim usadr as new USAddress
po.shipTo = usadr
usadr.city = "test"
End Sub

ou
po.shipTo  = new USAddress
po.shipTo.city = "test"

C'est comme tu veux
mais il faut instancier ton objet intermediaire ici ton Usadtress

evites d'utiliser les modules
utilise les classes (statiques pour avoir l'équivalent)

bon courage
3
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
25 janv. 2008 à 04:03
Ou plus simplement:

Public Class PurchaseOrder
    Public shipTo As New USAddress
    Public billTo As New USAddress
    Public comment As String
End Class

shipTo et billTo seront automatiquement instanciés lorsque un objet PurchaseOrder sera créé.

a+
3
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
25 janv. 2008 à 09:37
Bonjour

Ou sinon utiliser une structure.

Public Structure PurchaseOrder
    Public shipTo As USAddress
    Public billTo As USAddress
    Public comment As String
End Structure
Public Structure USAddress
    Public name As String
    Public street As String
    Public city As String
    Public state As String
    Public zip As Decimal
End Structure

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
25 janv. 2008 à 22:08
Tu ne peux pas modifier un membre d'une strucure, donc ça par exemple ça ne fonctionnerait pas:

po.shipTo.city = "test"
0

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

Posez votre question
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
28 janv. 2008 à 09:04
Bonjour

Kevin, je vien de vérifier (j'avais déjà de gros doute), ce que tu vien de dire est complement faux, il est facile de modifier la valeur des membres d'une structure (il suffit qu'il soit accessible).
En .NET, les seules différences entre une classe et une structure, c'est que la structure ne peut pas avoir de constructeur par défaut et qu'elle est immédiatement crée lors de la déclaration (pas besoin de New) et que les attributs ne peuvent être initialisés dans leurs déclarations.

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
29 janv. 2008 à 19:48
Effectivement NHenry

Mais:

Dim r As Rectangle
r.Location.X = 23

C'est aussi une structure dans une autre structure, mais ca ne fonctionne pas.. et je ne sais pas trop pourquoi . Location de Rectangle est Read/Write, et X de Point est aussi Read/Write, pourtant ceci génère l'erreur "Cette expression est une valeur et ne peut donc pas être la cible d'une assignation."

De là vient mon erreur. Si qqun pouvait expliquer pourquoi ceci ne fonctionne pas...

Une différence importante avec les structures est aussi que ce sont des variable par valeur, et non par référence comme une classe.. (si on les copie, on copie la valeur, pas la référence)
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
30 janv. 2008 à 13:33
Bonjour

En effet, étrange
Je n'ai pas d'explication.
Mulder et Scully sauront peut être ...

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
Rejoignez-nous