Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Je ne sais pas si le sujet a déjà été abordé. J'ai une fenêtre parente w_main et plein de descendantes dont w_fiche_produit.
J'aurais besoin de lancer ue_mon_evenement qui est programmé dans w_main juste avant l'open de w_fiche_produit, à partir de w_fiche_produit (pour que le constructor soit fait et que les objets existent).
Je ne peux pas faire un postevent parce que j'ai des GetChild dans l'open de w_fiche_produit qui sont invalidés par les Modify de ue_mon_evenement. Il faut donc absolument que ue_mon_evenement soit lancé juste avant l'open.
J'espère avoir été claire dans ma demande, et que vous aurez des idées pour me sortir de là (des pépites en récompense pour chaque réponse, ça vous motive ? ).
Merci d'avance.
Dernière modification par abdelta (31-12-2012 08:36:36)
Hors ligne
tu crée un ue_before_open dans w_main
tu codes l'appel de ue_before_open au tout début de l'open de w_main
tu codes dans w_fiche_produit.ue_before_open le code qui doit s'exécuter avant le code dans l'open
problem solved
Hors ligne
Le soucis, avec ta solution, c'est que je vais devoir passer dans toutes mes fenêtres filles pour coder le ue_before_open ... !
Hors ligne
Et bien non, car il sera hérité automatiquement.
Par défaut, ce sera juste un événement qui ne fait rien dans les fenêtres filles, sauf si tu code dedans.
Beaucoup de framework sont codés ainsi (souvent, avec un pre-open et un post-open d'ailleurs)
Hors ligne
comme l'a bien expliqué foon, non, c'est justement l'avantage de l'héritage.
Hors ligne
foon a écrit:
Et bien non, car il sera hérité automatiquement.
Dans ce cas, c'est w_main qui lancera l’évènement pre-open, et non les fenêtres filles. Ce qui fait que ma fenêtre fille ne sera pas encore instanciée, quand l'évènement sera appelé, non ?
Hors ligne
Oufti, j'en connais une qui ferait bien de se replonger dans l'étude de la programmation orienté objet et spécialement du fonctionnement de l'héritage...
bonne chance pour la suite.
Hors ligne
rincevent a écrit:
tu codes dans w_fiche_produit.ue_before_open le code qui doit s'exécuter avant le code dans l'open
Tu me disais bien de coder le ue_before_open dans w_fiche_produit, ou j'ai pas compris ce qui est écrit ?
Or, je ne veux pas passer dans toutes mes fenêtres filles (dont w_fiche_produit) pour coder cet évènement.
Si je mets dans w_main.open un TriggerEvent("ue_mon_evenement") et que je code tout ce que je veux exécuter avant l'open de w_fiche_produit dans le ue_mon_evenement de w_main, ça ne fonctionne pas parce qu'il faudrait que ce soit la fenêtre fille qui appelle ue_mon_evenement.
En gros, ce que je veux, c'est l'inverse d'un call SUPER::ue_mon_evenement pour pouvoir, à partir de la fenêtre w_main, appeler l’évènement de la fenêtre courante.
Hors ligne
Pourquoi veux-tu coder cet évènement dans toutes les fenêtre filles?
Si tu n'en a besoin que dans w_fiche_produit, tu le codes dans cette fenêtre. Dans les fenêtres filles et dans w_main,
le ue_before_open reste vide, et donc n'exécutera pas l'appel à ton fameux ue_mon_evenement, qui ne semble exister que dans w_fiche_produit, si j'ai bien compris.
ou alors, il faut que tu nous expliques mieux ta problématique, parceque ça ne semble pas très clair.
Pour résumer:
Dans w_main, tu créés l'événement "ue_before_open", dans lequel tu ne mets rien.
Toujours dans w_main, tu codes au début de l'événement open le triggerevent de "ue_before_open"
Tu compiles...
Et dans w_fiche_produit (qui hérites de w_main), tu codes dans l'événement ue_before_open le triggerevent de "ue_mon_evenement"
Et voilà, c'est tout.
Hors ligne
j'ai l'impression que w_main est la MDI et non pas la sheet ancêtre... ou bien ?
Hors ligne
foon a écrit:
il faut que tu nous expliques mieux ta problématique, parceque ça ne semble pas très clair.
Effectivement, je n'ai pas dû bien m'expliquer. Il faut que ue_mon_evenement soit lancé dans toutes les fenêtres filles au début de l'open.
Hors ligne
abdelta a écrit:
foon a écrit:
il faut que tu nous expliques mieux ta problématique, parceque ça ne semble pas très clair.
Effectivement, je n'ai pas dû bien m'expliquer. Il faut que ue_mon_evenement soit lancé dans toutes les fenêtres filles au début de l'open.
erasorz a écrit:
j'ai l'impression que w_main est la MDI et non pas la sheet ancêtre... ou bien ?
Comme erasorz, je me demande si il existe une fenêtre ancêtre à toutes les fenêtres pour lesquelles tu voudrais avoir un évènement commun avant l'ouverture, ou si tu nous parle de la fenêtre parent de ton application.
Si il n'existe pas d'ancêtre, il est encore possible de le créer après coup et de modifier le code des descendants pour se rattacher à cet ancêtre (remplacer le "from window" en "from mon_ancetre" à 2 endroit au début du code source des fenêtres).
Hors ligne
Dans ton ue_mon_evenement, tu dois bien avoir des tâches à effectuer communes à toutes tes fenêtres, et d'autres spécifiques?
L'idéal, c'est de coder dans le ue_mon_evenement de w_main tout ce qui est commun à tes fenêtres descendantes, et tu étends le script
de l'évenement dans les fenêtres filles pour ce qui est du spécifique.
Ca implique de repasser dans certaines fenêtres filles, mais pas dans toutes,
si tu te débrouilles bien.
Hors ligne
seki a écrit:
Comme erasorz, je me demande si il existe une fenêtre ancêtre à toutes les fenêtres pour lesquelles tu voudrais avoir un évènement commun avant l'ouverture, ou si tu nous parle de la fenêtre parent de ton application.
Oui, ma fenêtre w_main est bien l'ancêtre de toutes mes fenêtres filles. J'ai aussi une fenêtre MDI, mais elle ne m'intéresse pas dans mon problème, c'est pourquoi je n'y ai pas fait allusion.
Hors ligne
foon a écrit:
Dans ton ue_mon_evenement, tu dois bien avoir des tâches à effectuer communes à toutes tes fenêtres, et d'autres spécifiques?
L'idéal, c'est de coder dans le ue_mon_evenement de w_main tout ce qui est commun à tes fenêtres descendantes, et tu étends le script
de l'évenement dans les fenêtres filles pour ce qui est du spécifique. ca implique de repasser dans certaines fenêtres filles, mais pas dans toutes,
si tu te débrouilles bien.
Tout est commun, puisque tout est dynamique. Je récupère les colonnes des datawindows de la fenêtre fille, et je fais des Modify dessus, d'où l'intérêt de le faire dans l'ancêtre.
Hors ligne
Tu n'aurais pas object ancêtre pour tes datawindows, genre uo_dw?
Parcequ'à mon avis, ce serait plus simple de coder dans l'événement constructor tes modifys.
Hors ligne
abdelta a écrit:
Je ne peux pas faire un postevent parce que j'ai des GetChild dans l'open de w_fiche_produit qui sont invalidés par les Modify de ue_mon_evenement. Il faut donc absolument que ue_mon_evenement soit lancé juste avant l'open.
Tu fais des GetChild() à l'ouverture que tu stockes en variable d'instance ?
Si c'est le cas, xlat me faisait remarquer que c'est mal : il vaut mieux toujours faire le GetChild au moment où tu as besoin d'accéder au child.
Confirmé par la doc de GetChild : la référence retournée par GetChild peut devenir invalide par la suite.
F1 a écrit:
Changing property values with the Modify method can cause the reference returned by GetChild to become invalid. After setting such a property, call GetChild again. If a property causes this behavior, it is noted in its description in Chapter 3, "DataWindow Object Properties".
Hors ligne
seki a écrit:
Tu fais des GetChild() à l'ouverture que tu stockes en variable d'instance ?
Si c'est le cas, xlat me faisait remarquer que c'est mal : il vaut mieux toujours faire le GetChild au moment où tu as besoin d'accéder au child.
Oui, je fais des getchild que je mets dans des variables d'instance ; enfin, le client a fait ça il y a longtemps et je ne me vois pas tout reconcevoir. J'essaie justement de ne pas modifier toutes les fenêtres, c'est pour ça que j'essaie de passer mon évènement dans le w_main.
Je suis sur une piste pour arriver à mes fins, je vous tiendrai au courant dès que ce sera fait.
Hors ligne
abdelta a écrit:
je ne me vois pas tout reconcevoir. J'essaie justement de ne pas modifier toutes les fenêtres, c'est pour ça que j'essaie de passer mon évènement dans le w_main.
Finalement, le client préfère suivre les préconisations de PowerBuilder, je repasse donc sur toutes les fenêtres descendantes de ma w_main pour ne plus enregistrer les GetChild dans des variables d'instance.
Merci à tous.
Hors ligne