Passage de parametre objet en sortie de méthode?

Je n’y arrive pas, comment on fait :?: j’ai un trou… :oops:

<code 4D>
C_OBJET($O_Param)
$O_Param:=Créer objet

mamethode($O_Param)

$O_Param <=mon objet et vide ?!

</code 4D>

<code 4D>
//mamethode
C_OBJET($1)

C_OBJET($O_Param)
$O_Param:=Créer objet //je crée un nouvel objet

$1:= $O_Param //je veux resortir mon nouvel objet de ma methode ? ça marche pas

</code 4D>
:cry:

Bonjour;

Il faut passer un pointeur en $1

mamethode(->$O_Param)

$O_Param:=Créer objet//je crée un nouvel objet
$1->:=$O_Param //je veux resortir mon nouvel objet de ma methode? ça marche pas

Une autre option est de renvoyer l’objet en $0

Y a des jours comme ça où le cerveau se met en grève :slight_smile:

Merci Olivier cela fonctionne parfaitement. C’était trop simple… :mrgreen:

Bonjour,

Lorsqu’on écrit :
$objet:=Creer objet
MaMethode($objet)
$objet représente la référence à l’objet et non l’objet lui même

Lorsqu’on fait
MaMethode(->$objet)
On passe un pointeur sur la référence, pas un pointeur sur l’objet. En fait il ne faut pas faire cela car c’est une mauvaise habitude contraire à l’usage des objets.

Voici ce qui marche bien :

<code 4D>
C_OBJET($objet)
$objet:=Créer objet
MaMethode ($objet)

</code 4D>

Avec le code de MaMethode

<code 4D>
C_OBJET($1)
$objet:=$1
$objet.test:=Vrai
</code 4D>

Après l’exécution de MaMethode, l’objet référencé par $objet contient bien la propriété test.

Dans le soucis initial de Manuel, le soucis est la ligne $O_Param:=Créer objet car on change la référence et donc la méthode appelante n’a plus la bonne référence …
Ce que vous cherchez ici à faire est de vider l’objet. Il faut alors procéder ainsi dans la méthode MaMethode :

<code 4D>
C_OBJET($1)
$objet:=$1
Si ($objet#Null)
OB LIRE NOMS PROPRIÉTÉS($objet;$_propriete)
Boucle ($p;1;Taille tableau($_propriete);1)
OB SUPPRIMER($objet;$_propriete{$p})
Fin de boucle
fin de si
$objet.test:=Vrai
</code 4D>

Ici on prend soin de vider une par une les propriétés, pour préserver la référence de l’objet contenue dans $objet.

Cordialement,

Ah, ça devient interessant :slight_smile:

Plutôt que de vider l’objet, il n’existe pas une commande qui copie le contenu d’un objet en gardant la reference inititiale de l’objet cible :?:

Bonjour,

: Manuel PIQUET

Ah, ça devient interessant :slight_smile:

Plutôt que de vider l’objet, il n’existe pas une commande qui copie
le contenu d’un objet en gardant la reference inititiale de l’objet
cible :?:

Non. Ce n’est pas souhaitable.
Dans votre cas, il faut réviser l’approche dans votre développement en l’utilisant l’objet de manière optimale et contrôlée. Une fois que cela sera fait, vous n’aurez plus besoin de ce que vous demandez. Je suis farouchement contre les demandes qui permettent de continuer à travailler de manière incorrecte au lieu de revoir la façon de travailler.

Cordialement,

: Olivier DESCHANELS

Voici ce qui marche bien :
<code 4D>
C_OBJET($objet)
$objet:=Créer objet
MaMethode ($objet)

</code 4D>
Avec le code de MaMethode
<code 4D>
C_OBJET($1)
$objet:=$1
$objet.test:=Vrai
</code 4D>

Petite astuce pour les distraits comme moi, quand j’utilise ces objets “entré sortie” :
<code 4D>
C_OBJET($1)
$objet:=$1
ASSERT($objet#Null;"$1 Null (not referenced by caller method)")
</code 4D>
Même topo avec une collection E/S.
(Assert pas à rien…)

Bon, effectivement cela fonctionne simplement en ne recréant pas un nouvel objet dans la méthode.

Par contre, je ne vois pas ce qui vous derange dans ma demande ?
On pourrait imaginer une commande toute faite qui vide un objet.
Ou une commande qui copie un objet dans un autre sans changer ça reference initiale.

ex:

j’ai un objet A
je le passe en paramètre de ma méthode en entrée
dans ma méthode je crée un nouvel objet B
je souhaite qu’en sortie de ma méthode l’objet A reflète ce que contient l’objet B.

Quelle est la solution ?

: Manuel PIQUET

je souhaite qu’en sortie de ma méthode l’objet A reflète ce que
contient l’objet B.
Peux-tu préciser ce que tu entends par “refléter” ?
Soit tu ajoutes B à A, soit tu remplaces A par B, soit à la pince à épiler propriété par propriété, etc.

Je veux qu’en sortie de ma méthode A=B à la référence de l’objet prêt puisque sinon en sortie A=A toujours…

D’où mon interrogation, oui on peut taper du code, mais, ne pourrait-on pas avoir une commande qui face ce travail pour nous (surement plus efficacement/optimisé que les boucles qu’on serait obligé de faire) :?:

: Olivier DESCHANELS

Je suis farouchement contre les demandes qui permettent de continuer
à travailler de manière incorrecte au lieu de revoir la façon de
travailler.

A ce détail prêt, c’est qu’actuellement, on peut utiliser les pointeurs, et que cela fonctionne :-? et que malgré tous, cela n’est pas ce que vous voulez qu’on utilise… :roll:

Donc, si on suit votre raisonnement, 4D devrait interdire les pointeurs sur des objets…

En fait la méthode avec pointeur date d’avant la v17/ORDA, elle ne peut pas être interdite, mais Olivier propose à juste titre de suivre la nouvelle tendance

Je ne m’y oppose pas, je souhaiterais simplement qu’on m’aide à utiliser cette nouvelle tendance en ayant des commandes adaptées qui simplifies la gestion des objets de cette façon.

Pour vider un objet, il n’y a pas plus efficace que de boucler sur l’ensemble de ces propriétés :?:

Pour copier(=remplacer le contenu d’un objet dans un autre) un objet dans un autre existant, il n’y a pas plus efficace que de boucler sur l’ensemble de ces propriétés :?:

Je peux me tromper, mais 4D ferait certainement beaucoup plus rapidement ces 2 actions avec des commandes adaptées non ?

Si le but est de copier un objet, il existe la commande OB Copier quand même.

C’est pour cela que j’ai précisé copier dans un objet existant !
OB copier créer un nouvel objet (avec une nouvelle référence) ce qui n’est pas compatible dans la façon de passer l’objet resultant en sortie de paramètre de la méthode…

S’il s’agit juste de copier un objet, pourquoi appeler une méthode pour le faire alors qu’une commande existe ?
Même en passant un pointeur, ça va modifier la référence de l’objet pointé. Ce n’est pas forcément souhaitable non plus selon le contexte.

Quel est le but de la manœuvre ?

Il faut relire le titre de ce fil. :twisted:

Il s’agit de ressortir un paramètre objet d’une méthode !

Le but n’est pas simplement de copier un objet c’est de ressortir des infos dans un objet passé en paramètre d’une méthode.

On est là dans un cas bien précis. Mais, qui sera de plus en plus courant puisque c’est comme cela qu’il est préconisé de faire (cf. OD).

Pour pouvoir faire ce que je veux, j’ai besoin de copier un objet B dans un objet A préexistant sans modifier sa référence.

J’ai bien noté qu’en vidant l’objet A de départ, puis en recopiant l’objet B, je pouvais le faire.
Ce que je demande, c’est: ne faudrait-il pas avoir des commandes NATIVES 4D qui fassent ces opérations plus efficacement que par des boucles sur les propriétés des objets. :?:

Dans mon esprit, il est plus simple de dupliquer l’objet B et de lui réattribuer la reference de l’objet A, que de le vider puis reconstruire. J’ai peut-être tord…

Bonjour,

: Manuel PIQUET

Pour pouvoir faire ce que je veux, j’ai besoin de copier un objet B
dans un objet A préexistant sans modifier sa référence.
Non.
Il ne faut pas répondre à cela par une commande supplémentaire qui ne va rien apporter de plus. Il faut raisonner différemment.
Il n’y a aucune raison de faire cela. Je viens de chercher dans mon code où j’ai des milliers de manipulations d’objet et je n’ai jamais besoin de cela.
Soit je retourne l’objet dans $0
Soit l’objet que je modifie, n’est en fait qu’un sous objet de mon objet passé en paramètre via sa référence. Et dans ce cas Creer objet me convient parfaitement.

Bref, ne chercher pas à adapter le langage 4D à de vieille approche, mais réviser la façon de coder pour tirer les bénéfices des possibilités de 4D. Sans cela vous êtes en train de construire des barrières que vous n’arriveraient pas à sauter et vous aller demander des commandes pour sauter ou détruire ces barrières. Mais cela s’appelle traiter les conséquences (sauter les barrières) au lieu d’essayer de traiter les causes (qui génèrent les barrières).

Cordialement,

Je suis pas hyper convaincu :-(; Que vous n’ayez rien de tel dans votre code, c’est normal puisque ces commandes n’existent pas; vous avez donc fait ce que vous préconisez: c’est de faire autrement. Mais, les solutions de contournement ne donnent pas le même résultat.

Créer un sous objet, oui, pourquoi pas, mais du coup on rajoute un niveau.

A défaut, je ferais contre mauvaise fortune bon coeur, je ferais autrement mais je ne suis pas convaincu. (surtout quand on voit la simplicité de la mise en oeuvre par passage en pointeur, contre la lourdeur des boucles pour pouvoir obtenir un même résultat :-?)

Bonjour,

Il faut en être convaincu.
Il faut bien se rendre compte que le temps gagné en restant en l’état quitte à utiliser des solutions de contournement peut se payer très cher par la suite …

Cordialement,