|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
[POO] affectation par valeur |
Débuté par dany, 26 fév. 2004 18:00 - 4 réponses |
| |
| | | |
|
| |
Posté le 26 février 2004 - 18:00 |
bonjour,
je cherche à passer un objet en paramètre d'une fenetre, et j'aimerai le passer par valeur.
Explication: 1°) je crée un fenetre d'assistant dans lequel je crée un objet A 2°) une fois à la derniere étape de l'assistant, j'ouvre une fenetre soeur à laquelle je donne l'objet A créé en paramètre. (je le réaffecte à un nouvel objet B créé dans cette fenetre soeur en utilisant l'opérateur "=" : objetA = objetB) 3°) je ferme l'assistant
.... sauf que je détruis l'objet créé A (normal) avec la fenetre assistant mais aussi l'objet B car celui ci est passé par référence (et donc est l'objet A finalement) et non par valeur. J'ai trouvé plusieurs parades, entre autres : - ne pas fermer l'assistant et le rendre invisible - créer un nouvel objet dans la deuxieme fenetre et réaffecter attribut par attribut (avec + de 50 attributs, c'est un plaisir) ....mais je ne trouve pas cela très propre.
Est-ce que qqun a une idée ou saurait où je pourrai trouver ces informations ? Merci
Amicalement, |
| |
| |
| | | |
|
| | |
| |
Posté le 26 février 2004 - 18:07 |
Salut !
On 26-Feb-2004, "dany" <dany@hotmail.com> wrote:
je cherche à passer un objet en paramètre d'une fenetre, et j'aimerai le passer par valeur. Explication: 1°) je crée un fenetre d'assistant dans lequel je crée un objet A 2°) une fois à la derniere étape de l'assistant, j'ouvre une fenetre soeur à laquelle je donne l'objet A créé en paramètre. (je le réaffecte à un nouvel objet B créé dans cette fenetre soeur en utilisant l'opérateur "=" : objetA = objetB) 3°) je ferme l'assistant
... sauf que je détruis l'objet créé A (normal) avec la fenetre assistant mais aussi l'objet B car celui ci est passé par référence (et donc est l'objet A finalement) et non par valeur. J'ai trouvé plusieurs parades, entre autres : - ne pas fermer l'assistant et le rendre invisible - créer un nouvel objet dans la deuxieme fenetre et réaffecter attribut par attribut (avec + de 50 attributs, c'est un plaisir) ...mais je ne trouve pas cela très propre.
Ta fenêtreA détruit-elle explicitement l'objetA (libere objetA) ? Si oui, change ton code de manière à ce que ce ne soit plus le cas. Si je me rapelle bien, WD libère automatiquement les objets quand il n'y a plus de pointeur pointant ( euh ... c'est leur rôle non ?) vers ces objets ! Dans ton cas, normalement, à la fermeture de la fenêtreB ... A vérifier car pas testé !
Bien à toi
-- Marcel Berman c/o Managing Business SPRL Allée du Petit Paris, 11 B - 1410 - Waterloo Tel : +32 2 351.60.64 Fax : +32 2 351.45.78 Gsm : +32 475.799.477 |
| |
| |
| | | |
|
| | |
| |
Posté le 26 février 2004 - 18:37 |
la syntaxe pour passer un paramétre par valeur est (monparametre). par exemple : Ouvre(fen2,(monobjeta))
"dany" <dany@hotmail.com> wrote:
bonjour,
je cherche à passer un objet en paramètre d'une fenetre, et j'aimerai le passer par valeur.
Explication: 1°) je crée un fenetre d'assistant dans lequel je crée un objet A 2°) une fois à la derniere étape de l'assistant, j'ouvre une fenetre soeur
à
laquelle je donne l'objet A créé en paramètre. (je le réaffecte à un nouvel objet B créé dans cette fenetre soeur en utilisant l'opérateur "=" : objetA = objetB) 3°) je ferme l'assistant
... sauf que je détruis l'objet créé A (normal) avec la fenetre assistant mais aussi l'objet B car celui ci est passé par référence (et donc est l'objet A finalement) et non par valeur. J'ai trouvé plusieurs parades, entre autres : - ne pas fermer l'assistant et le rendre invisible - créer un nouvel objet dans la deuxieme fenetre et réaffecter attribut par
attribut (avec + de 50 attributs, c'est un plaisir) ...mais je ne trouve pas cela très propre.
Est-ce que qqun a une idée ou saurait où je pourrai trouver ces informations ? Merci
Amicalement,
|
| |
| |
| | | |
|
| | |
| |
Posté le 26 février 2004 - 18:37 |
"dany" <dany@hotmail.com> wrote:
bonjour,
je cherche à passer un objet en paramètre d'une fenetre, et j'aimerai le passer par valeur.
Explication: 1°) je crée un fenetre d'assistant dans lequel je crée un objet A 2°) une fois à la derniere étape de l'assistant, j'ouvre une fenetre soeur
à
laquelle je donne l'objet A créé en paramètre. (je le réaffecte à un nouvel objet B créé dans cette fenetre soeur en utilisant l'opérateur "=" : objetA = objetB) 3°) je ferme l'assistant
... sauf que je détruis l'objet créé A (normal) avec la fenetre assistant mais aussi l'objet B car celui ci est passé par référence (et donc est l'objet A finalement) et non par valeur. J'ai trouvé plusieurs parades, entre autres : - ne pas fermer l'assistant et le rendre invisible - créer un nouvel objet dans la deuxieme fenetre et réaffecter attribut par
attribut (avec + de 50 attributs, c'est un plaisir) ...mais je ne trouve pas cela très propre.
Est-ce que qqun a une idée ou saurait où je pourrai trouver ces informations ? Merci
Amicalement,
Un objet ne peut pas être passé en paramètre par valeur, dans le sens ou tu l'entends ! En effet, un variable objet n'est ni plus ni moins qu'un entier long spécial puisque c'est l'adresse mémoire de l'instance de sa classe. Donc si tu veux deux objet différents il faut dupliquer un à un toutes ses propriétés ! Par contre, pour faire ce que tu souhaites, il faut simplement créer dans ta deuxième fenetre un objet dynamique. Cela permet de ne pas créer une nouvelle instance, et de l'assigner avec celui passé en paramètre :
Procedure Mafenetre(ObjAPasserEnParam) MonObjB est un objet dynamique MaclasseObjA .... MonObjB = ObjAPasserEnParam
Puis à la fermeture de cette fenetre tu ne libère pas l'objet MonObjB. Comme c'est un objet dynamique windev ne le libèrera pas non plus. Et donc ta première fenetre pourra toujours travail avec la même instance, et devra, par contre, le libérer... Voilà, c'est tout. |
| |
| |
| | | |
|
| | |
| |
Posté le 27 février 2004 - 10:21 |
<Marcel.berman@managingbusiness.be> a écrit dans le message de news:403e2c50$1@news.pcsoft.fr...
Salut ! On 26-Feb-2004, "dany" <dany@hotmail.com> wrote: je cherche à passer un objet en paramètre d'une fenetre, et j'aimerai le passer par valeur. Explication: 1°) je crée un fenetre d'assistant dans lequel je crée un objet A 2°) une fois à la derniere étape de l'assistant, j'ouvre une fenetre soeur
à laquelle je donne l'objet A créé en paramètre. (je le réaffecte à un nouvel objet B créé dans cette fenetre soeur en utilisant l'opérateur "=" : objetA = objetB) 3°) je ferme l'assistant
... sauf que je détruis l'objet créé A (normal) avec la fenetre assistant
mais aussi l'objet B car celui ci est passé par référence (et donc est l'objet A finalement) et non par valeur. J'ai trouvé plusieurs parades, entre autres : - ne pas fermer l'assistant et le rendre invisible - créer un nouvel objet dans la deuxieme fenetre et réaffecter attribut par attribut (avec + de 50 attributs, c'est un plaisir) ...mais je ne trouve pas cela très propre.
Ta fenêtreA détruit-elle explicitement l'objetA (libere objetA) ? Si oui, change ton code de manière à ce que ce ne soit plus le cas. Si je me rapelle bien, WD libère automatiquement les objets quand il n'y a plus de pointeur pointant ( euh ... c'est leur rôle non ?) vers ces objets !
Dans ton cas, normalement, à la fermeture de la fenêtreB ... A vérifier car pas testé !
Bien à toi
-- Marcel Berman c/o Managing Business SPRL Allée du Petit Paris, 11 B - 1410 - Waterloo Tel : +32 2 351.60.64 Fax : +32 2 351.45.78 Gsm : +32 475.799.477
J'avais effectivement créé l'objet de manière statique dans l'assistant, ce qui le détruisait systématiquement lors de la fermeture. La création dynamique résout le problème très simplement. Un grand merci à tous ! |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|