OVH Cloud OVH Cloud

[WinDev 10] Construire dynamiquement un nom d'objet

11 réponses
Avatar
Jean-Luc Baptiste
Bonjour,

Je souhaite créer des noms objets dynamiquement, j'ai essayé les
indirections mais sans succés. Hors, il y a quelques temps j'y étais
arrivé (alzheimer surement ;-))

Si quelqu'un a la solution...

Exemple

i est un entier

pour i=1 à 10
Nomobjet+i est un objet maclasse
fin pour

10 réponses

1 2
Avatar
Jean Passe
Salut,

Exemple

i est un entier

pour i=1 à 10
Nomobjet+i est un objet maclasse
fin pour



Pour i=1 à 10
{"nomobjet"+NumeriqueVersChaine(i)}est un objet maclasse
Fin

non ?

a+
Avatar
Jean-Luc Baptiste
Jean Passe a écrit :
Salut,


Exemple

i est un entier

pour i=1 à 10
Nomobjet+i est un objet maclasse
fin pour




Pour i=1 à 10
{"nomobjet"+NumeriqueVersChaine(i)}est un objet maclasse
Fin

non ?

a+




Ben non ;-))
Avatar
Jean-Luc Baptiste
Gilles Guédikian a écrit :
Jean-Luc Baptiste a pensé très fort :

Jean Passe a écrit :

Salut,

pour i=1 à 10
Nomobjet+i est un objet maclasse
fin pour



Pour i=1 à 10
{"nomobjet"+NumeriqueVersChaine(i)}est un objet maclasse
Fin



Ben non ;-))




De mémoire il me semble que ça ne marche pas avec des classes, ni des
structures.




Il faut passer par la compilation dynamique mais j'ai des soucis pour
construire la chaine :
Si je mets le code dans un champ libelle ca marche (en suivant l'exemple
fourni en V9 ), mais si je construit la chaine dans une variable
chaine (meme en doublant les "") j'ai des erreurs d'execution.

ex :
Lasource est une chaîne="i est une chaine=""Lecompte"" i=i+numducompte
renvoyer i "

numducompte est un champ de saisie avec ou sans " " ca coince

-----******** Tout le code du bouton *************-----------

sResultat est une chaîne
sResultatCompile est une chaîne
Lasource est une chaîne="i est une chaine=""Lecompte"" i=i+numducompte
renvoyer i "

sResultatCompile = Compile("Proc_dynamique", Lasource )

SELON sResultatCompile
CAS "" : sResultat = ExécuteTraitement("Proc_dynamique", trtProcédure)
CAS "ERR" : sResultat = "Compilation impossible. "+RC+ErreurInfo()
AUTRE CAS : sResultat = sResultatCompile
FIN

Info (sResultat)



-------------------------------------------------------------
Avatar
Pierre BOUSQUET
Lasource est une chaîne="i est une chaine="+""""+"Lecompte : "+""""+";
i=i+"+""""+numducompte+""""+"; renvoyer i "

"Jean-Luc Baptiste" a écrit dans le message de
news: 43b906fb$0$29200$
Gilles Guédikian a écrit :
Jean-Luc Baptiste a pensé très fort :

Jean Passe a écrit :

Salut,

pour i=1 à 10
Nomobjet+i est un objet maclasse
fin pour



Pour i=1 à 10
{"nomobjet"+NumeriqueVersChaine(i)}est un objet maclasse
Fin



Ben non ;-))




De mémoire il me semble que ça ne marche pas avec des classes, ni des
structures.




Il faut passer par la compilation dynamique mais j'ai des soucis pour
construire la chaine :
Si je mets le code dans un champ libelle ca marche (en suivant l'exemple
fourni en V9 ), mais si je construit la chaine dans une variable chaine
(meme en doublant les "") j'ai des erreurs d'execution.

ex :
Lasource est une chaîne="i est une chaine=""Lecompte"" i=i+numducompte
renvoyer i "

numducompte est un champ de saisie avec ou sans " " ca coince

-----******** Tout le code du bouton *************-----------

sResultat est une chaîne
sResultatCompile est une chaîne
Lasource est une chaîne="i est une chaine=""Lecompte"" i=i+numducompte
renvoyer i "

sResultatCompile = Compile("Proc_dynamique", Lasource )

SELON sResultatCompile
CAS "" : sResultat = ExécuteTraitement("Proc_dynamique", trtProcédure)
CAS "ERR" : sResultat = "Compilation impossible. "+RC+ErreurInfo()
AUTRE CAS : sResultat = sResultatCompile
FIN

Info (sResultat)



-------------------------------------------------------------


Avatar
Jean-Luc Baptiste
Pierre BOUSQUET a écrit :
Lasource est une chaîne="i est une chaine="+""""+"Lecompte : "+""""+";
i=i+"+""""+numducompte+""""+"; renvoyer i "




Effectivement construite comme ça la chaine est interprétée merci !
Avatar
Jean-Luc Baptiste
Jean-Luc Baptiste a écrit :
Pierre BOUSQUET a écrit :

Lasource est une chaîne="i est une chaine="+""""+"Lecompte : "+""""+";
i=i+"+""""+numducompte+""""+"; renvoyer i "




Effectivement construite comme ça la chaine est interprétée merci !




Mon souci est toujours là, je n'arrive pas à instancier un objet dont le
nom est connu a posteriori :

J'ai un nom dynamique mais :
{monnom} est un objet compte
c'est refusé !
Avatar
Pierre BOUSQUET
il faut que l'objet compte soit déclaré dans le même code que la procédure
dynamique (ou alors moncompte est global au projet ou à la fenêtre)

MaVariable est une chaîne = "test"

Trace(Compile("Proc", "MaStruct est une structure"+RC+...

" MonEntier est entier = 56"+RC+...

"FIN"+RC+...

MaVariable+" est une MaStruct"+RC+...

MaVariable+":MonEntierR"+RC+...

"trace("+MaVariable+":MonEntier)"))

ExécuteTraitement("Proc",trtProcédure)

tu ne pourras pas récupérer la valeur de l'objet dynamique puisqu'il est
dynamique, tu pourras seulement faire une RENVOYER dans ta procédure
dynamique pour récupérer sa valeur



Que veux-tu faire au juste, il y a peut-être un moyen plus simple


"Jean-Luc Baptiste" a écrit dans le message de
news: 43b936b1$0$29203$
Jean-Luc Baptiste a écrit :
Pierre BOUSQUET a écrit :

Lasource est une chaîne="i est une chaine="+""""+"Lecompte : "+""""+";
i=i+"+""""+numducompte+""""+"; renvoyer i "




Effectivement construite comme ça la chaine est interprétée merci !




Mon souci est toujours là, je n'arrive pas à instancier un objet dont le
nom est connu a posteriori :

J'ai un nom dynamique mais :
{monnom} est un objet compte
c'est refusé !


Avatar
Jean-Luc Baptiste
Pierre BOUSQUET a écrit :
il faut que l'objet compte soit déclaré dans le même code que la procédure
dynamique (ou alors moncompte est global au projet ou à la fenêtre)

MaVariable est une chaîne = "test"

Trace(Compile("Proc", "MaStruct est une structure"+RC+...

" MonEntier est entier = 56"+RC+...

"FIN"+RC+...

MaVariable+" est une MaStruct"+RC+...

MaVariable+":MonEntierR"+RC+...

"trace("+MaVariable+":MonEntier)"))

ExécuteTraitement("Proc",trtProcédure)

tu ne pourras pas récupérer la valeur de l'objet dynamique puisqu'il est
dynamique, tu pourras seulement faire une RENVOYER dans ta procédure
dynamique pour récupérer sa valeur



Que veux-tu faire au juste, il y a peut-être un moyen plus simple





En fait je souhaite illustrer la creation dynamique d'objet comme on
peut le faire en java ou c# par exemple (illustration pédago et non un
cas réel )

une agence bancaire gère plusieurs comptes qui seront mis dans un
tableau d'objet de la classe agence. Les objets comptes sont crées les
un aprés les autres et leurs nom d'objet est le numéro de compte. De
cette facon je peux faire une boucle quelconque qui tant que l'on entre
des numéro de compte crée des objets. ça m'evite de faire

cpt1 est un objet compte
cpt2 est un objet compte
cptn ................

Là je pars du principe que je connais le nombre d'objet compte

Ceux que je désire serait :

tantque vrai
{cpt+NumeroDeCompte} est un objet compte // le pb est que si j'arrive a
créer le nom de la variable dynamiquement WinDev n'accepte plus le "est..."
fin tq

Voilà ce que je désire faire si tu as une idée je suis preneur,
l'exemple est a but didactique donc peut-être éloigné de la réalité mais
j'illustre 2 concepts interressants en objet ( tableau d'objets et
creation dynamique d'objets)

A bientôt
Avatar
Pascal ROY
Bonjour,

Perso, je déclarerais un tableau dynamique global à l'appli.

gMesObjets est un tableau dynamique = Null
gnNbObjets est un entier = 0 //Ca sert a connaitre le nombre d'objets


Ensuite
Si tu connais le nb de compte tu peux directement allouer le bon nombre
Ex : gMesObjets = Allouer tableau de kNbCompte ObjetCompte


tantque gNbObjets < kNbCompte
Si t'as choisi la 1ere Solution tu ecrit directement
gnNbObjets ++
gMesObjets[ gnNbObjets] = Allouer un est un ObjetCompte( )
Sinon
gnNbObjets ++
Si gnNbObjets = 1 alors
gMesObjets = Allouer un Tableau de 1 ObjetCompte
Sinon
Dimension( gMesObjets, gnNbObjets)
Fin
gMesObjets[ gnNbObjets] = allouer un ObjetCompte( )
Fin
fin tq

Dans ce cas, il faut faire, en fin de projet

Si gMesObjets <> NULL alors
pour i = 1 à gnNbObjets
liberer( gMesObjets[ i])
fin
Liberer( gMesObjets)
fin

Voila !

Personnellement, comme je suis un peu fainéant, je me
suis créé une classe "Collection" qui contient un tableau
d'objets d'un type CollectionItem.

Je dérive mes objets à mettre en liste d'une classe virtuelle
CollectionItem, et hop ! En route vers la gloire :-)

Pascal

Jean-Luc Baptiste a écrit :
Pierre BOUSQUET a écrit :

il faut que l'objet compte soit déclaré dans le même code que la
procédure dynamique (ou alors moncompte est global au projet ou à la
fenêtre)

MaVariable est une chaîne = "test"

Trace(Compile("Proc", "MaStruct est une structure"+RC+...

" MonEntier est entier = 56"+RC+...

"FIN"+RC+...

MaVariable+" est une MaStruct"+RC+...

MaVariable+":MonEntierR"+RC+...

"trace("+MaVariable+":MonEntier)"))

ExécuteTraitement("Proc",trtProcédure)

tu ne pourras pas récupérer la valeur de l'objet dynamique puisqu'il
est dynamique, tu pourras seulement faire une RENVOYER dans ta
procédure dynamique pour récupérer sa valeur



Que veux-tu faire au juste, il y a peut-être un moyen plus simple





En fait je souhaite illustrer la creation dynamique d'objet comme on
peut le faire en java ou c# par exemple (illustration pédago et non un
cas réel )

une agence bancaire gère plusieurs comptes qui seront mis dans un
tableau d'objet de la classe agence. Les objets comptes sont crées les
un aprés les autres et leurs nom d'objet est le numéro de compte. De
cette facon je peux faire une boucle quelconque qui tant que l'on entre
des numéro de compte crée des objets. ça m'evite de faire

cpt1 est un objet compte
cpt2 est un objet compte
cptn ................

Là je pars du principe que je connais le nombre d'objet compte

Ceux que je désire serait :

tantque vrai
{cpt+NumeroDeCompte} est un objet compte // le pb est que si j'arrive a
créer le nom de la variable dynamiquement WinDev n'accepte plus le "est..."
fin tq

Voilà ce que je désire faire si tu as une idée je suis preneur,
l'exemple est a but didactique donc peut-être éloigné de la réalité mais
j'illustre 2 concepts interressants en objet ( tableau d'objets et
creation dynamique d'objets)

A bientôt



Avatar
Jean-Luc Baptiste
Pascal ROY a écrit :
Bonjour,

Perso, je déclarerais un tableau dynamique global à l'appli.

gMesObjets est un tableau dynamique = Null
gnNbObjets est un entier = 0 //Ca sert a connaitre le nombre d'objets


Ensuite
Si tu connais le nb de compte tu peux directement allouer le bon nombre
Ex : gMesObjets = Allouer tableau de kNbCompte ObjetCompte


tantque gNbObjets < kNbCompte
Si t'as choisi la 1ere Solution tu ecrit directement
gnNbObjets ++
gMesObjets[ gnNbObjets] = Allouer un est un ObjetCompte( )
Sinon
gnNbObjets ++
Si gnNbObjets = 1 alors
gMesObjets = Allouer un Tableau de 1 ObjetCompte
Sinon
Dimension( gMesObjets, gnNbObjets)
Fin
gMesObjets[ gnNbObjets] = allouer un ObjetCompte( )
Fin
fin tq

Dans ce cas, il faut faire, en fin de projet

Si gMesObjets <> NULL alors
pour i = 1 à gnNbObjets
liberer( gMesObjets[ i])
fin
Liberer( gMesObjets)
fin

Voila !

Personnellement, comme je suis un peu fainéant, je me
suis créé une classe "Collection" qui contient un tableau
d'objets d'un type CollectionItem.

Je dérive mes objets à mettre en liste d'une classe virtuelle
CollectionItem, et hop ! En route vers la gloire :-)

Pascal



C'est sympa comme solution ! Je teste au plus tot.

Peux-tu m'en dire plus au sujet de ta classe collection ? Les méthodes
majeures ?

Merci
1 2