Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Je pensais que j'allais réussir à m'en sortir seul aujourd'hui mais c'est raté
J'ai juste une question concernant un script qui permet de remonter un objet jusqu'a la fenêtre dans lequel il est contenu pour pouvoir fermer cette fenêtre.
Voila mon script :
/********************************************************************** * * Auteur : David DIAS * * Date : 06/07/2007 * * Commentaires : * Fonction recursive qui va partir d'une instance fille et remonter * jusqu'a la première fenêtre pour la fermer * Permet aussi de femer l'objet courant si c'est une fenêtre **********************************************************************/ /**********************************************************************/ // //// Debut du script // /**********************************************************************/ if this.TypeOf() <> Window! then // Appel recursif de la fonction of_femer_fenetre_parent(Parent) else // Femerture de la fenêtre close(this) return 1 end if
Et l'erreur que j'obtiens est la suivante :
(0023): Error C0082: Reference argument must be a non-constant and non-readonly variable reference.
(0026): Error C0052: Bad argument list for function: Close
La première erreur pointe sur la ligne "of_fermer_parent(Parent)"
La deuxième ligne pointe evidemment sur la ligne "close(this)"
Quels changements faut t'il faire pour que le code soit valide?
Merci de vos reponses
Dernière modification par Nephtis (09-07-2007 15:08:52)
Hors ligne
Nephtis a écrit:
Bonjour,
Je pensais que j'allais réussir à m'en sortir seul aujourd'hui mais c'est raté
J'ai juste une question concernant un script qui permet de remonter un objet jusqu'a la fenêtre dans lequel il est contenu pour pouvoir fermer cette fenêtre.
Voila mon script :Code: pb
/********************************************************************** * * Auteur : David DIAS * * Date : 06/07/2007 * * Commentaires : * Fonction recursive qui va partir d'une instance fille et remonter * jusqu'a la première fenêtre pour la fermer * Permet aussi de femer l'objet courant si c'est une fenêtre **********************************************************************/ /**********************************************************************/ // //// Debut du script // /**********************************************************************/ if this.TypeOf() <> Window! then // Appel recursif de la fonction of_femer_fenetre_parent(Parent) else // Femerture de la fenêtre close(this) return 1 end if
Et l'erreur que j'obtiens est la suivante :(0023): Error C0082: Reference argument must be a non-constant and non-readonly variable reference.
(0026): Error C0052: Bad argument list for function: CloseLa première erreur pointe sur la ligne "of_fermer_parent(Parent)"
La deuxième ligne pointe evidemment sur la ligne "close(this)"
Quels changements faut t'il faire pour que le code soit valide?
Merci de vos reponses
Ta fonction of_fermer_parent attent un argument passé par référence (un pointeur sur l'objet => une variable en PB) or tu lui passes l'objet parent directement (pour les puristes : je fais un raccourci )_
Si tu regardes dans ta fonction il doit y avoir un endroit où tu affectes une valeur à l'argument en entrée ou à une de ses propriétés...
Pour la deuxième erreur, regardes au debug, le this serait pas NULL des fois ?
Hors ligne
D'accord mais en ce qui concerne l'erreur sur le "close"? (je peut pas regarder en debug puisque la fonction ne veut pas s'enregistrer )
Moi je vois pas pourquoi il y a un mauvais nombre d'argument
Mon nouveau script :
/********************************************************************** * * Auteur : David DIAS * * Date : 06/07/2007 * * Commentaires : * Fonction recursive qui va partir d'une instance fille et remonter * jusqu'a la première fenêtre pour la fermer * Permet aussi de femer l'objet courant si c'est une fenêtre **********************************************************************/ PowerObject fen_par /**********************************************************************/ // //// Debut du script // /**********************************************************************/ fen_par = Parent if this.TypeOf() <> Window! then // Appel recursif de la fonction of_femer_fenetre_parent(fen_par) else // Femerture de la fenêtre close(this) return 1 end if
Dernière modification par Nephtis (06-07-2007 11:46:54)
Hors ligne
Nephtis a écrit:
D'accord mais en ce qui concerne l'erreur sur le "close"? (je peut pas regarder en debug puisque la fonction ne veut pas s'enregistrer
)
Moi je vois pas pourquoi il y a un mauvais nombre d'argument
Mon nouveau script :Code: pb
/********************************************************************** * * Auteur : David DIAS * * Date : 06/07/2007 * * Commentaires : * Fonction recursive qui va partir d'une instance fille et remonter * jusqu'a la première fenêtre pour la fermer * Permet aussi de femer l'objet courant si c'est une fenêtre **********************************************************************/ PowerObject fen_par /**********************************************************************/ // //// Debut du script // /**********************************************************************/ fen_par = Parent if this.TypeOf() <> Window! then // Appel recursif de la fonction of_femer_fenetre_parent(fen_par) else // Femerture de la fenêtre close(this) return 1 end if
Oups autant pour moi !
Ben oui, this est un userobject pas une fenêtre
Déclares une variable de type window, dans le else affectes this et fais le close de la variable
Hors ligne
Voila a nouveau le script :
/********************************************************************** * * Auteur : David DIAS * * Date : 06/07/2007 * * Commentaires : * Fonction recursive qui va partir d'une instance fille et remonter * jusqu'a la première fenêtre pour la fermer * Permet aussi de femer l'objet courant si c'est une fenêtre **********************************************************************/ PowerObject fen_par Window fen_close /**********************************************************************/ // //// Debut du script // /**********************************************************************/ fen_par = Parent if this.TypeOf() <> Window! then // Appel recursif de la fonction of_femer_fenetre_parent(fen_par) else // Femerture de la fenêtre fen_close = this close(fen_close) return 1 end if
Sur l'affectation "fen_close = this" j'ai le message d'erreur suivant :
Incompatible types in assignement: window, of_fermer_fenetre_parent
Qu'elle est la propriété de "this" qui référence l'objet qui à appelé la fonction of_fermer_fenetre_parent?
Hors ligne
Bonjour,
pour faire ça récursivement ça serait une fonction globale du genre f_fermer_fenetre_parent( PowerObject as_object )
if as_object.TypeOf() <> Window! then // Appel recursif sur le parent de l'objet f_fermer_fenetre_parent( as_object.Parent ) else // Fermeture de la fenêtre close( as_object ) end if
Et quelquepart dans ton contrôle sur la page :
f_fermer_fenetre_parent( This )
Hors ligne
Nephtis a écrit:
Voila a nouveau le script :
Code: pb
/********************************************************************** * * Auteur : David DIAS * * Date : 06/07/2007 * * Commentaires : * Fonction recursive qui va partir d'une instance fille et remonter * jusqu'a la première fenêtre pour la fermer * Permet aussi de femer l'objet courant si c'est une fenêtre **********************************************************************/ PowerObject fen_par Window fen_close /**********************************************************************/ // //// Debut du script // /**********************************************************************/ fen_par = Parent if this.TypeOf() <> Window! then // Appel recursif de la fonction of_femer_fenetre_parent(fen_par) else // Femerture de la fenêtre fen_close = this close(fen_close) return 1 end if
Sur l'affectation "fen_close = this" j'ai le message d'erreur suivant :Incompatible types in assignement: window, of_fermer_fenetre_parent
Qu'elle est la propriété de "this" qui référence l'objet qui à appelé la fonction of_fermer_fenetre_parent?
Argl, of_fermer_fenetre_parent est une fonction globale ???? Si oui, alors effectivement il y a un gros prob de conception...
Pour info, une fonction globale c'est f_ pas of_ qui est plustôt réservé pour les fonctions d'objet => d'où ma confusion. Désolé !
Hors ligne
Pas tout à fait raison eRaSorZ car dans ce cas y a le message d'erreur "Incompatible property parent for type powerobject"
Pour ce qui est du nommage des fonction et autres variables je suis désolé car je fait encore de grosses erreurs sur les prefixes
Dernière modification par Nephtis (06-07-2007 12:00:57)
Hors ligne
Nephtis a écrit:
Pas tout à fait raison eRaSorZ car dans ce cas y a le message d'erreur "Incompatible property parent for type powerobject"
Pour ce qui est du nommage des fonction et autres variables je suis désolé car je fait encore de grosses erreurs sur les prefixes
Ca peut marcher... A voir....
if as_object.TypeOf() <> Window! then // Appel recursif sur le parent de l'objet f_fermer_fenetre_parent(as_object.dynamic parent ) else // Fermeture de la fenêtre close( as_object ) end if
Hors ligne
L'ajout du dynamic ne résoud pas mon problême
Hors ligne
Nephtis a écrit:
Pas tout à fait raison eRaSorZ car dans ce cas y a le message d'erreur "Incompatible property parent for type powerobject"
oups utilise plutot object.GetParent()
Nephtis a écrit:
Pour ce qui est du nommage des fonction et autres variables je suis désolé car je fait encore de grosses erreurs sur les prefixes
d'ailleurs je me suis bien trompé aussi sur le suffixe : as_ c'est pour une chaine
utilise apo_object
pour les conventions de nommage un petit coup d'oeil ici
Hors ligne
Arghhh, je me suis fait devancer par erasorz
Bon j'ai cherché un peu (eh oui ça m'arrive ) et donc il faut appeler la fonction "getParent" du PowerObject
Je poste le code, ça peut toujours servir à un autre petit débutant comme moi
/********************************************************************** * * Auteur : David DIAS * * Date : 06/07/2007 * * Commentaires : * Fonction recursive qui va partir d'une instance fille et remonter * jusqu'a la première fenêtre pour la fermer * Permet aussi de femer l'objet courant si c'est une fenêtre **********************************************************************/ /**********************************************************************/ // //// Déclaration des paramètres // /**********************************************************************/ PowerObject lpo_parent /**********************************************************************/ // //// Debut du script // /**********************************************************************/ lpo_parent = this.getParent() if apo_objet.TypeOf() <> Window! then // Appel recursif de la fonction f_fermer_fenetre_parent(lpo_parent) else // Femerture de la fenêtre close(apo_objet) end if
Dernière modification par Nephtis (06-07-2007 12:24:58)
Hors ligne
eRaSorZ a écrit:
d'ailleurs je me suis bien trompé aussi sur le suffixe : as_ c'est pour une chaine
utilise apo_object
J'ai pas voulu relever
Hors ligne
Nephtis a écrit:
L'ajout du dynamic ne résoud pas mon problême
Normal, l'idée était naze. Désolé.
Bon, il va falloir que je parte en week-end moi, parce que là ça devient n'importe quoi
Hors ligne
Juste une question : quand le probleme est résolu est ce que ce qu'il y a une case à cocher pour quon passe le sujet en résolu (si elle existe je l'ai pas trouvée) ou est ce que c'est les modéros qui s'en occupent?
Hors ligne
Nephtis a écrit:
Juste une question : quand le probleme est résolu est ce que ce qu'il y a une case à cocher pour quon passe le sujet en résolu (si elle existe je l'ai pas trouvée) ou est ce que c'est les modéros qui s'en occupent?
tu peux le faire toi meme, en y allant sur ton premier post, et tu changes au niveau du titre
Hors ligne
Ben en fait pas tout à fait résolu
Quand j'execute la fonction il n'arrive même pas à retrouver le premier parent (reference to NULL object)
Voici le code que j'ai placé sur un bouton "quitter" :
/********************************************************************** * * Auteur : David DIAS * * Date : 06/07/2007 * * Commentaires : * Appel de la fonction f_fermer_fenetre_parent() * pour fermer la fenetre d'onglets * **********************************************************************/ /**********************************************************************/ // //// Debut du script // /**********************************************************************/ PowerObject lpo_parent lpo_parent = Parent f_fermer_fenetre_parent(lpo_parent)
Ce bouton est lui même placé sur un UserObject : cst_titres
... qui est placé sur tab_pense-bete
... qui est placé sur w_pense-bete
J'ai l'impression que dans ma fonction le "this" ne pointe pas sur l'objet qui l'a appelé (comment voit t'on le contenu de la variable "this" en mode debug?)
En effet j'ai de gros doutes concernant le "this" dans la fonction car dans le code de l'evenement "clicked" de mon bouton, Parent me renvoie le bon objet et en modifiant le script et en appelant la fonction directement à partir de this je n'arrive plus à récupérer le parent (je sais pas si c'est très clais ce que je dit )
Dernière modification par Nephtis (06-07-2007 12:54:04)
Hors ligne
normal du fais deux fois parent sur le bouton (une fois dans le bouton et une fois dans la fonction)
bouton -> fenêtre -> null
dans ton bouton il faut faire un f_fermer_fenetre_parent(This)
d'ailleurs attention dans ta fonction il faut faire le getparent dans le Then (tu peux te passer de ta variable locale lpo_parent)
if apo_objet.TypeOf() <> Window! then // Appel recursif de la fonction f_fermer_fenetre_parent(apo_objet.getParent()) else // Femerture de la fenêtre close(apo_objet) end if
Hors ligne
J'ai fait le test juste apres avec this mais le résultat est le même.
Au moment de l'appel de la ligne de code lpo_parent = this.getParent() de la fonction f_fermer_fenetre_parent je reçoit le message d'erreur "Reference à un objet NULL"
Si je fait le getParent dans l'appel recursif j'obtient l'erreur :
C0082: Reference argument must be a non-constant and non-readonly variable reference.
Dernière modification par Nephtis (06-07-2007 12:58:59)
Hors ligne
Nephtis a écrit:
J'ai fait le test juste apres avec this mais le résultat est le même.
Au moment de l'appel de la ligne de code lpo_parent = this.getParent() de la fonction f_fermer_fenetre_parent je reçoit le message d'erreur "Reference à un objet NULL"
normal il faut aussi mettre le getparent dans le then (j'ai édité mon post entretemps )
Hors ligne
Double edit lol
Je peut pas mettre le getParent dans l'appel de la fonction
Le paramètre de ma fonction je le passe par "value" ou par "reference"? (je me rappele plus lequel correspond à la copie et lequel correspond à un pointeur)
Dernière modification par Nephtis (06-07-2007 13:04:10)
Hors ligne
Nephtis a écrit:
Je peut pas mettre le getParent dans l'appel de la fonction
alors quand même un lpo_parent à mettre mais dans le then
Nephtis a écrit:
Le paramètre de ma fonction je le passe par "value" ou par "reference"? (je me rappele plus lequel correspond à la copie et lequel correspond à un pointeur)
si c'est un objet c'est de toute façon passé par référence
Hors ligne
eRaSorZ a écrit:
Nephtis a écrit:
Je peut pas mettre le getParent dans l'appel de la fonction
alors quand même un lpo_parent à mettre mais dans le then
Nephtis a écrit:
Le paramètre de ma fonction je le passe par "value" ou par "reference"? (je me rappele plus lequel correspond à la copie et lequel correspond à un pointeur)
si c'est un objet c'est de toute façon passé par référence
Exact.
Petit moyen mnémonique : un pointeur fait référence à une valeur
Hors ligne
Je suis bloqué sur un problême un peu plus urgent, je retesterais tout quand j'aurais résolu l'autre probleme (pour l'instant ma fenetre je peut toujours la fermer grace à la croix sur la barre de titre)
Hors ligne
C'est bon j'ai réussi à débugger mon script (à tête reposée c'est beaucoup plus clair)
Je donne le source du script, ça peut toujours servir :
/********************************************************************** * * Auteur : David DIAS * * Date : 06/07/2007 * * Commentaires : * Fonction recursive qui va partir d'une instance fille et remonter * jusqu'a la première fenêtre pour la fermer * Permet aussi de femer l'objet courant si c'est une fenêtre **********************************************************************/ /**********************************************************************/ // //// Déclaration des paramètres // /**********************************************************************/ PowerObject lpo_parent /**********************************************************************/ // //// Debut du script // /**********************************************************************/ lpo_parent = apo_objet.getParent() if apo_objet.TypeOf() <> Window! then // Appel recursif de la fonction f_fermer_fenetre_parent(lpo_parent) else // Femerture de la fenêtre close(apo_objet) end if
Hors ligne