1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 4
    Points : 2
    Points
    2

    Par défaut Tableau dynamique d'objet

    Bonjour tout le monde

    Je souhaite créer un tableau dynamique d'objet qui eux même possèdent un attribut tableau dynamique d'un autre type d'objet...
    Par exemple, j'ai créé la classe qui recense les caractéristiques des cartes réseaux physiques (et actives). Un de ses attributs contient la liste des adresses IP avec les masques qui peuvent lui être affectés, j'ai donc définit cet attribut comme un tableau dynamique d'objet de type adresse IP, pour mieux hiérarchiser ces données, qui elle même ne contient que deux attributs : IP et masque.
    Oui, je sais, cela parait bien compliqué, je joins donc le source épuré pour exposer le problème rencontré :
    J'arrive bien à affecter des valeurs à des attributs basiques (que j'ai supprimé ici par ne pas rendre trop indigeste mon source), mais lorsque je tente de passer mes valeurs à une méthode pour renseigner ma sous classe, ça coince (à la fin du source)

    Vous remerciant de toute l'aide que vous pourriez m'apporter,
    Bien cordialement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    option explicit
    dim objWMIService : set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    dim objShell : set objShell = WScript.CreateObject("WScript.shell")
    dim tabCarte()
    dim nics, ip, subnet
    dim i, j, m ' Petites variables temporaires servant d'indice
     
    ' Récupération des cartes réseau physiques qui sont Ethernet (protocole 802.3)
    set nics = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter WHERE PhysicalAdapter=TRUE AND  ConfigManagerErrorCode=0")
    ' On va alimenter la collection d'éléments de carte réseau avec les éléments trouvés
    for each m in nics ' Liste toutes les interfaces physiques. Attention, les cartes réseau WIFI y sont également inclus
    	' Si on est dans la boucle, c'est qu'une carte a été relevée
    	if(tableauVide(tabCarte)) then i = Ubound(tabCarte) + 1 else i = 0 ' Récupère la taille courant du tableau
    	redim preserve tabCarte(i) ' Augmentation de la taille du tableau de 1
    	set tabCarte(i) = new C_CarteReseau ' On instancie un nouvel objet C_CarteReseau et on l'affecte dans le tableau
    	tabCarte(i).setMac = m.MACAddress ' On sauvegarde l'adresse MAC de la carte réseau
    	on error resume next ' Cas où la clef IPAddress ou SubnetMask n'existerait pas
    	ip = objShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\" & m.GUID & "\IPAddress") ' Liste des adresses IP
    	subnet = objShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\" & m.GUID & "\SubnetMask") ' Liste des masques
    	for j = 0 to ubound(ip) step 1  ' Alors on parcours les deux tableaux et on sauvegarde les adresses IP et leur masque réseau
    		tabCarte(i).addIP ip(j), subnet(j)
    	next
    next
     
    function tableauVide(testTab) ' Fonction qui permet de vérifier qu'un tableau n'est pas vide
    	dim a
    	on error resume next
    	a = ubound(testTab)
    	tableauVide = CBool(a = 0)
    end function
     
    class C_AdresseIP ' Classe Adresse IP
    	' Attributs
    	private attIp ' adresse IP
    	private AttMasque ' masque de sous réseau
     
    	' Méthodes
    	sub Class_Initialize() ' Initialisation
    	end sub
     
    	sub Class_Terminate() ' Terminaison (affectation de Nothing à l'objet)
    	end sub
     
    	public property let SetIP(adresseIP)
    		attIp = adresseIP
    	end property
     
    	public property let SetMasque(masque)
    		attMasque = masque
    	end property
     
    	public property get GetIP()
    		GetIP = attIp
    	end property
     
    	public property get GetMasque()
    		GetMasque = attMasque
    	end property
    end class
     
    class C_CarteReseau ' Classe Carte réseau
    	' Attributs
    	private attIp() ' Tableau des adresses IP/Masque (tableau d'objet C_AdresseIP)
     
    	' Méthodes
    	sub Class_Initialize() ' Initialisation
    	end sub
     
    	sub Class_Terminate() ' Terminaison (affectation de Nothing à l'objet)
    	end sub
     
    	public sub addIp(adresseIp, masque) ' Récupération de la liste des adresses IP
    		dim i1
    		if(tableauVide(attIp)) then i1 = ubound(attIp) else i1 = 0
    		redim preserve attIp(i1)
    		set attIp(i1) = new C_AdresseIP
    		attIp(i1).SetIP(adresseIp) ' <==== Cela coince ici
    		attIp(i1).SetMasque(masque) ' <==== Cela coince ici
    	end sub
    end class

  2. #2
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    février 2006
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 1 146
    Points : 3 044
    Points
    3 044

    Par défaut

    bonjour,

    ça coince (à la fin du source)
    ce "coincement" se traduit comment ? (msg d'erreur ?)
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 4
    Points : 2
    Points
    2

    Par défaut

    Bonjour Omen999
    Voilà le message d'erreur :
    Microsoft VBScript runtime error: Object doesn't support this property or method: 'SetIP'
    Quand je la place en commentaire, c'est la méthode suivante qui a le même symptôme.

    Pourtant j'ai suivi la même schématique que dans la partie principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set tabCarte(i) = new C_CarteReseau
    Et j'accède bien aux méthodes que j'y avais placé.

    Une petite idée ?
    Merci d'avance

  4. #4
    Membre émérite

    Homme Profil pro
    Responsable déploiement (SCCM, AirWatch, AMP)
    Inscrit en
    juillet 2014
    Messages
    1 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, AirWatch, AMP)
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2014
    Messages : 1 308
    Points : 2 449
    Points
    2 449

    Par défaut

    Y a t'il une raison particulière à ne s'appuyer qu'a moitié sur le WMI ?

    Attention, il peux y avoir plusieurs AdresseIP ... pour une carte réseau.
    Vérifier les types de données possibles : https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

    Code vbs : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
     
    for each NetworkAdapter in objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter WHERE PhysicalAdapter=TRUE AND ConfigManagerErrorCode=0")
     
    	MACAddress = NetworkAdapter.MACAddress
     
    	for each NetworkAdapterConfiguration in objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE Index= " & NetworkAdapter.Index)
    		Description = NetworkAdapterConfiguration.Description
     
    		If IsNull(NetworkAdapterConfiguration.IPAddress) then
    			IPAddress = ""
    		else
    			IPAddress = Join(NetworkAdapterConfiguration.IPAddress, ", ")
    		end if
     
    		If IsNull(NetworkAdapterConfiguration.IPSubnet) then
    			IPSubnet = ""
    		else
    			IPSubnet = Join(NetworkAdapterConfiguration.IPSubnet, ", ")
    		end if
     
    	next
     
    	wscript.echo "Nom : " & Description & vbcrlf & _
    				"MAC address : " & MACAddress & vbcrlf & _
    				"IP Address : " & IPAddress & vbcrlf & _
    				"IP Subnet  : " & IPSubnet & vbcrlf
     
    next

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 4
    Points : 2
    Points
    2

    Par défaut

    Oui, car quand le câble réseau est débranché, les adresses IP sont masquées, alors qu'elles apparaissent toujours dans la BDR... Par contre le GUID me permet bien de récupérer ces éléments dans la base de registre. Le type retourné est un tableau de chaîne de caractères.
    Quand je fais un wscript.echo dans la méthode AddIP(monAdresse, mon masque) dans la classe C_CarteReseau, j'ai bien mes valeurs chaine qui s'affichent.
    Est ce que ce serait le fait que je veuille faire un tableau dynamique d'objet comme attribut d'un autre objet qui coince ? Car c'est là que réside le problème : un tableau dynamique d'objet dans un objet...

  6. #6
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    février 2006
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 1 146
    Points : 3 044
    Points
    3 044

    Par défaut

    je trouve ton code inutilement compliqué et étrangement ta classe C_CarteReseau n'expose pas de propriété publique pour en extraire les infos stockées

    quoi qu'il en soit, définir des propriétés dans l'interface de ta classe en dissociant la lecture
    de l'écriture n'a de sens que lorsqu'on souhaite leur faire subir un traitement distinct ce qui n'est pas le cas de ton problème

    par ailleurs, il est préférable de privilégier les variants de tableau plutôt que les tableaux de variant
    la distinction est subtile et la doc officielle assez cryptique sur le sujet mais si tu lis l'anglais il existe une page bien faite à cet égard

    un exemple plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    class C_AdresseIP ' Classe Adresse IP
    	Public AdIP
    	Public Mask
    end class
     
    class C_CarteReseau ' Classe Carte réseau
    	' Attributs
    	public attIp ' Tableau des adresses IP/Masque (tableau d'objet C_AdresseIP)
    	sub Class_Initialize() ' Initialisation variant de tableau
    		attIp=Array()
    	end sub
    	public sub addIp(adresseIp, masque) ' Récupération de la liste des adresses IP
    		dim i1
    		i1 = ubound(attIp) + 1
    		redim preserve attIp(i1)
    		set attIp(i1) = new C_AdresseIP
    		attIp(i1).adIP = adresseIp
    		attIp(i1).Mask= masque
    	end sub
    end class
     
    set AZ = new C_carteReseau
     
    AZ.addIp "111.111.111.111","255.255.0.0"
    AZ.addIp "250.111.111.111","255.255.255.0"
     
    msgbox AZ.attIp(0).AdIP
    msgbox AZ.attIp(1).AdIP
    msgbox AZ.attIp(0).Mask
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 4
    Points : 2
    Points
    2

    Par défaut

    Bonsoir Omen999

    C'est à dire que je m'obstinais désespérément à passer par des accesseurs setters/getters pour accéder à mes attributs privés que je voulais absolument privés.
    Mais finalement, tu as raison, je me compliques beaucoup la vie pour le résultat que je veux en faire.
    J'avais épuré le code fortement pour ne mettre en évidence que la partie bloquante, c'est pour cela que je n'avais pas placé mes accesseurs "lecture" dans mes classes...
    Encore merci, ton exemple me va très bien, je l'adopte et ton lien est génial.

    A bientôt

  8. #8
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    février 2006
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 1 146
    Points : 3 044
    Points
    3 044

    Par défaut

    ton lien est génial.
    j'attendais une occasion pour le glisser dans un message
    bonne continuation
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Tableau dynamique d'objets
    Par Virtuelfred dans le forum C#
    Réponses: 2
    Dernier message: 17/12/2009, 17h52
  2. Problème de tableau dynamique d'objets
    Par markfish55 dans le forum C++
    Réponses: 2
    Dernier message: 07/06/2008, 13h07
  3. Transmission de tableau dynamique d'objets
    Par laulaurent dans le forum C++
    Réponses: 7
    Dernier message: 17/11/2007, 22h59
  4. Réponses: 11
    Dernier message: 26/09/2007, 21h24
  5. tableau dynamique d'objets
    Par logarithme1984 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/03/2007, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo