OVH Cloud OVH Cloud

Est-il possible de créer des tableaux d'objets en vbs

7 réponses
Avatar
Machine
Bonjour,

Je cherche actuellement à créer un tableau qui contiendrait des objets. Ces
objets provenant d'une classe que j'ai moi même créée. Cependant, il m'est
impossible en vbs de faire ceci :
Dim tab(1)
set monobj=new maclasse
tab(0)=monobj

Apparement un tableau ne peut prendre qu'un type variant mais à ce moment là
est-il possible de faire une collection (un peu comme ce que l'on retrouve
quand on fait des interrogations wmi) ?

Je vous remercie par avance

7 réponses

Avatar
Jean-Claude BELLAMY
Dans le message news: ,
Machine s'est ainsi exprimé:

Bonjour,

Je cherche actuellement à créer un tableau qui contiendrait des
objets. Ces objets provenant d'une classe que j'ai moi même créée.
Cependant, il m'est impossible en vbs de faire ceci :
Dim tab(1)
set monobj=new maclasse
tab(0)=monobj

Apparement un tableau ne peut prendre qu'un type variant mais à ce
moment là est-il possible de faire une collection (un peu comme ce
que l'on retrouve quand on fait des interrogations wmi) ?



Si, on peut parfaitement créer des tableaux d'objets.
As-tu essayé directement la syntaxe "set tab(0)=new maclasse" ?
Car l'affectation directe "tab(0)=monobj" me choque un peu pour un objet.
(mais je me trompe peut-être, je n'ai pas approfondi)

Je le pratique abondamment dans mon script "SHOWADM"'
http://www.bellamyjc.org/fr/vbsdownload.html#showadm
http://www.bellamyjc.org/fr/strategie.html#SHOWADM

Tu peux t'en inspirer si tu veux..

P.ex. à la ligne 1210 du script :
je définis une classe "Policy", qui a parmi ses propriétés un tableau
d'objets "Public TabPart()" (de classe "Part")

et une méthode "AddPart" permet d'ajouter des objets à ce tableau :

Public Function AddPart(CurLib,CurType)
nPart=nPart+1
redim Preserve TabPart(nPart)
set TabPart(nPart-1)=new Part
TabPart(nPart-1).LibPart=CurLib
TabPart(nPart-1).TypePart=CurType
Set AddPart=TabPart(nPart-1)
End Function

(NB: et çà marche !!! ;-) )

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*

Avatar
Machine
Merci Jean Claude, avec ta lumière j'ai pu faire exactement ce que je voulais.


Dans le message news: ,
Machine s'est ainsi exprimé:

Bonjour,

Je cherche actuellement à créer un tableau qui contiendrait des
objets. Ces objets provenant d'une classe que j'ai moi même créée.
Cependant, il m'est impossible en vbs de faire ceci :
Dim tab(1)
set monobj=new maclasse
tab(0)=monobj

Apparement un tableau ne peut prendre qu'un type variant mais à ce
moment là est-il possible de faire une collection (un peu comme ce
que l'on retrouve quand on fait des interrogations wmi) ?



Si, on peut parfaitement créer des tableaux d'objets.
As-tu essayé directement la syntaxe "set tab(0)=new maclasse" ?
Car l'affectation directe "tab(0)=monobj" me choque un peu pour un objet.
(mais je me trompe peut-être, je n'ai pas approfondi)

Je le pratique abondamment dans mon script "SHOWADM"'
http://www.bellamyjc.org/fr/vbsdownload.html#showadm
http://www.bellamyjc.org/fr/strategie.html#SHOWADM

Tu peux t'en inspirer si tu veux..

P.ex. à la ligne 1210 du script :
je définis une classe "Policy", qui a parmi ses propriétés un tableau
d'objets "Public TabPart()" (de classe "Part")

et une méthode "AddPart" permet d'ajouter des objets à ce tableau :

Public Function AddPart(CurLib,CurType)
nPart=nPart+1
redim Preserve TabPart(nPart)
set TabPart(nPart-1)=new Part
TabPart(nPart-1).LibPart=CurLib
TabPart(nPart-1).TypePart=CurType
Set AddPart=TabPart(nPart-1)
End Function

(NB: et çà marche !!! ;-) )

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*






Avatar
Lord Mathius
Merci jean claude. cette reponse corespond tout a fait a ce que je cherche a
faire,
par hazard tu aurais pas une doc assez bien faite sur les class car je
maitrise bien le vbs mais il me reste les class a maitriser.

merci

"Jean-Claude BELLAMY" wrote:

Dans le message news: ,
Machine s'est ainsi exprimé:

Bonjour,

Je cherche actuellement à créer un tableau qui contiendrait des
objets. Ces objets provenant d'une classe que j'ai moi même créée.
Cependant, il m'est impossible en vbs de faire ceci :
Dim tab(1)
set monobj=new maclasse
tab(0)=monobj

Apparement un tableau ne peut prendre qu'un type variant mais à ce
moment là est-il possible de faire une collection (un peu comme ce
que l'on retrouve quand on fait des interrogations wmi) ?



Si, on peut parfaitement créer des tableaux d'objets.
As-tu essayé directement la syntaxe "set tab(0)=new maclasse" ?
Car l'affectation directe "tab(0)=monobj" me choque un peu pour un objet.
(mais je me trompe peut-être, je n'ai pas approfondi)

Je le pratique abondamment dans mon script "SHOWADM"'
http://www.bellamyjc.org/fr/vbsdownload.html#showadm
http://www.bellamyjc.org/fr/strategie.html#SHOWADM

Tu peux t'en inspirer si tu veux..

P.ex. à la ligne 1210 du script :
je définis une classe "Policy", qui a parmi ses propriétés un tableau
d'objets "Public TabPart()" (de classe "Part")

et une méthode "AddPart" permet d'ajouter des objets à ce tableau :

Public Function AddPart(CurLib,CurType)
nPart=nPart+1
redim Preserve TabPart(nPart)
set TabPart(nPart-1)=new Part
TabPart(nPart-1).LibPart=CurLib
TabPart(nPart-1).TypePart=CurType
Set AddPart=TabPart(nPart-1)
End Function

(NB: et çà marche !!! ;-) )

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*






Avatar
Jean-Claude BELLAMY
Dans le message news: ,
Lord Mathius s'est ainsi exprimé:

Merci jean claude. cette reponse corespond tout a fait a ce que je
cherche a faire,
par hazard tu aurais pas une doc assez bien faite sur les class car je
maitrise bien le vbs mais il me reste les class a maitriser.


Il n'y a pas grand chose à en dire !

class Nom_de_la_classe
Public une_propriété_publique
Public une_autre_propriété_publique
...
Private une_propriété_privée
Private une_autre_propriété_privée
...
Public Sub un_sous_programme_publique(p,q,r)
...
End Sub

Public Function une_fonction_publique(m,n)
...
End Function
...
Private Sub un_sous_programme_privé (a,b,c,d,e)
...
End Sub
...
Private Function une_fonction_privée(z)
...
End Function
...

end class


Et pour utiliser cette classe :
(les propriétés et méthodes privées ne sont utilisables qu'à l'intérieur
même de la classe)
....
Set un_objet = new(Nom_de_la_classe)
un_objet.une_propriété_publique = "Glützenbaum"
un_objet.une_autre_propriété_publique89
...
toto=un_objet.une_fonction_publique(1515,"Marcel Grouchard")
...

Il n'y a rien de sorcier, magique ou insurmontable là dedans.
Il suffit d'être familiarisé un quart de pouïème de poil avec la
programmation orientée objet, c'est tout. ;-)

cf.:
http://www.bellamyjc.org/fr/vbsinstructions/vsstmclass.html
http://www.bellamyjc.org/fr/vbs/vtglossary.html



--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*

Avatar
Lord Mathius
Merci de tes info precieuse,
en fait j'ai reussi a pas mal maitriser les class mais il y a encore un
point que je comprend pas,
c'est quoi les
property get
property set
property let ?
ca j'arrive pas a le comprendre.
merci

"Jean-Claude BELLAMY" wrote:

Dans le message news: ,
Lord Mathius s'est ainsi exprimé:

Merci jean claude. cette reponse corespond tout a fait a ce que je
cherche a faire,
par hazard tu aurais pas une doc assez bien faite sur les class car je
maitrise bien le vbs mais il me reste les class a maitriser.


Il n'y a pas grand chose à en dire !

class Nom_de_la_classe
Public une_propriété_publique
Public une_autre_propriété_publique
...
Private une_propriété_privée
Private une_autre_propriété_privée
...
Public Sub un_sous_programme_publique(p,q,r)
...
End Sub

Public Function une_fonction_publique(m,n)
...
End Function
...
Private Sub un_sous_programme_privé (a,b,c,d,e)
...
End Sub
...
Private Function une_fonction_privée(z)
...
End Function
...

end class


Et pour utiliser cette classe :
(les propriétés et méthodes privées ne sont utilisables qu'à l'intérieur
même de la classe)
.....
Set un_objet = new(Nom_de_la_classe)
un_objet.une_propriété_publique = "Glützenbaum"
un_objet.une_autre_propriété_publique89
....
toto=un_objet.une_fonction_publique(1515,"Marcel Grouchard")
....

Il n'y a rien de sorcier, magique ou insurmontable là dedans.
Il suffit d'être familiarisé un quart de pouïème de poil avec la
programmation orientée objet, c'est tout. ;-)

cf.:
http://www.bellamyjc.org/fr/vbsinstructions/vsstmclass.html
http://www.bellamyjc.org/fr/vbs/vtglossary.html



--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*






Avatar
Jean-Claude BELLAMY
Dans le message news: ,
Lord Mathius s'est ainsi exprimé:

Merci de tes info precieuse,
en fait j'ai reussi a pas mal maitriser les class mais il y a encore
un point que je comprend pas,
c'est quoi les
property get
property set
property let ?
ca j'arrive pas a le comprendre.



Les procedures "property xxxx" permettent d'accéder indirectement aux
propriétés privées d'une classe.
On peut certes utiliser des propriétés publiques (je le fais!), mais l'usage
de "property xxx" est "plus propre".
(valable aussi dans les autres langages de POO : Delphi, C++, ...)

Cela a l'avantage, également, :
- de "découpler" le nom externe (public)
du nom interne( privé) de la propriété concernée.
- de permettre des traitements internes des
valeurs affectées ou lues des propriétés.

property let
======== sert à DÉFINIR la valeur d'une propriété SCALAIRE (= non objet)
Elle est appelée implicitement de l'extérieur par une
instruction d'affectation traditionnelle :

myobject.myproperty= xxxxx

Exemple :

class supertruc
private secret

public property Let DefineSecret(chaine)
if len(chaine)=0 then
err.raise vbObjetError+1,"Chaine vide affectée à
Secret","Erreur de classe"
end if
secret = chaine
end property
...
end class


On utilisera cette classe ainsi :

bidule=new(supertruc)
bidule.DefineSecret "007"
...


property set
======== la même chose que "property let", mais
sert à DÉFINIR la valeur d'une propriété OBJET
Elle est appelée implicitement de l'extérieur par une
instruction d'affectation d'objet :

set myobject.myproperty= xxxxx

property get
======== sert à OBTENIR la valeur d'une propriété SCALAIRE ou OBJET



Exemple récapitulatif (opérationnel, testé!) :

'--------------------------------------------
class supertruc
private secret
public property Let DefineSecret(chaine)
if len(chaine)=0 then
err.raise vbObjectError,"Erreur de classe","Chaine vide affectée à
Secret"
end if
secret = chaine
end property

public property Get LitSecret()
LitSecret=secret
end property

end class
'--------------------------------------------
class supermachin
private truc
public property Set init(objtruc)
set truc = objtruc
end property

public property Get LitTruc()
Set LitTruc=truc
end property

end class
'--------------------------------------------
set bidule=new supertruc
bidule.DefineSecret ="007"

set machin=new supermachin
set machin.init = bidule
wscript.echo machin.LitTruc.LitSecret
'--------------------------------------------

NB: dans mon exemple, afin de bien distinguer les opérations, j'ai choisit
des noms différents de procédures dans LET et GET , ou dans SET et GET .
Mais on peut très bien prendre le MÊME nom (c'est souvent le cas) pour la
lecture (GET) et pour l'écriture (LET ou SET)

P.ex. :
class supermachin
private truc
public property Set Letruc(objtruc)
set truc = objtruc
end property
public property Get LeTruc()
Set LeTruc=truc
end property
end class


le préfixe "public" ou "private" placé devant le mot-clef "property" sert,
comme on peut s'y attendre, à publier ou masquer la propriété en lecture
(GET) et/ou en écriture (LET/SET).

class supermachin
private truc
private property Set Letruc(objtruc)
set truc = objtruc
end property
public property Get LeTruc()
Set LeTruc=truc
end property
end class

ici , "LeTruc" est en lecture seule

class supermachin
private truc
public property Set Letruc(objtruc)
set truc = objtruc
end property
private property Get LeTruc()
Set LeTruc=truc
end property
end class

ici , "LeTruc" est en écriture seule

Une procédure "private property" à l'intérieur d'une classe ne peut donc
être utilisée qu'à l'intérieur de la classe.


NB: tout cela est beaucoup plus long à expliquer qu'à pratiquer !


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*

Avatar
Lord Mathius
He bien je te remercie grandement de ton aide, tout ce que tu vient d'ecrire
ma permis de comprendre plus en details ce point obscure de la force.
effectivement ne comprenant pas ce point de details, je me suis atteler a
utiliser donc la vielle methode barbare de l'affection et de la lecture
direct.
en fait j'avait besoin d'un dictionary a X colone et comme dictionary n'a
que 2 colones je me retrouver embeter. donc j'ai reinventer le dictionary a X
colones.
mais l'idée des get, let et set pouras surment me servir au final pour
paufiné ma classe et la rendre plus propre et sur. Si tu veut une fois fini
je te la donnerais pour la metre sur ton site. elle peut etre utile je pense
lorsque lon veut plus de colone comme moi dans un dico




"Jean-Claude BELLAMY" wrote:

Dans le message news: ,
Lord Mathius s'est ainsi exprimé:

Merci de tes info precieuse,
en fait j'ai reussi a pas mal maitriser les class mais il y a encore
un point que je comprend pas,
c'est quoi les
property get
property set
property let ?
ca j'arrive pas a le comprendre.



Les procedures "property xxxx" permettent d'accéder indirectement aux
propriétés privées d'une classe.
On peut certes utiliser des propriétés publiques (je le fais!), mais l'usage
de "property xxx" est "plus propre".
(valable aussi dans les autres langages de POO : Delphi, C++, ...)

Cela a l'avantage, également, :
- de "découpler" le nom externe (public)
du nom interne( privé) de la propriété concernée.
- de permettre des traitements internes des
valeurs affectées ou lues des propriétés.

property let
======== > sert à DÉFINIR la valeur d'une propriété SCALAIRE (= non objet)
Elle est appelée implicitement de l'extérieur par une
instruction d'affectation traditionnelle :

myobject.myproperty= xxxxx

Exemple :

class supertruc
private secret

public property Let DefineSecret(chaine)
if len(chaine)=0 then
err.raise vbObjetError+1,"Chaine vide affectée à
Secret","Erreur de classe"
end if
secret = chaine
end property
...
end class


On utilisera cette classe ainsi :

bidule=new(supertruc)
bidule.DefineSecret "007"
....


property set
======== > la même chose que "property let", mais
sert à DÉFINIR la valeur d'une propriété OBJET
Elle est appelée implicitement de l'extérieur par une
instruction d'affectation d'objet :

set myobject.myproperty= xxxxx

property get
======== > sert à OBTENIR la valeur d'une propriété SCALAIRE ou OBJET



Exemple récapitulatif (opérationnel, testé!) :

'--------------------------------------------
class supertruc
private secret
public property Let DefineSecret(chaine)
if len(chaine)=0 then
err.raise vbObjectError,"Erreur de classe","Chaine vide affectée à
Secret"
end if
secret = chaine
end property

public property Get LitSecret()
LitSecret=secret
end property

end class
'--------------------------------------------
class supermachin
private truc
public property Set init(objtruc)
set truc = objtruc
end property

public property Get LitTruc()
Set LitTruc=truc
end property

end class
'--------------------------------------------
set bidule=new supertruc
bidule.DefineSecret ="007"

set machin=new supermachin
set machin.init = bidule
wscript.echo machin.LitTruc.LitSecret
'--------------------------------------------

NB: dans mon exemple, afin de bien distinguer les opérations, j'ai choisit
des noms différents de procédures dans LET et GET , ou dans SET et GET .
Mais on peut très bien prendre le MÊME nom (c'est souvent le cas) pour la
lecture (GET) et pour l'écriture (LET ou SET)

P.ex. :
class supermachin
private truc
public property Set Letruc(objtruc)
set truc = objtruc
end property
public property Get LeTruc()
Set LeTruc=truc
end property
end class


le préfixe "public" ou "private" placé devant le mot-clef "property" sert,
comme on peut s'y attendre, à publier ou masquer la propriété en lecture
(GET) et/ou en écriture (LET/SET).

class supermachin
private truc
private property Set Letruc(objtruc)
set truc = objtruc
end property
public property Get LeTruc()
Set LeTruc=truc
end property
end class

ici , "LeTruc" est en lecture seule

class supermachin
private truc
public property Set Letruc(objtruc)
set truc = objtruc
end property
private property Get LeTruc()
Set LeTruc=truc
end property
end class

ici , "LeTruc" est en écriture seule

Une procédure "private property" à l'intérieur d'une classe ne peut donc
être utilisée qu'à l'intérieur de la classe.


NB: tout cela est beaucoup plus long à expliquer qu'à pratiquer !


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*