Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
J'ai un bouton générique 'sauver'. Ce bouton est posé dans environ 200 fenetres avec du code spécifique pour chaque fenetre.
Je voudrais appeler une fonction avant et une autre après le script du bouton sauver.
J'ai bien essayé dans le bouton générique de faire un triggerevent("Avant) et juste après un PostEvent("Après")
L'evenement "avant" est toujours bien appelé mais après PEU de pas etre appelé APRES le script sauver.
Ca ne marche pas dans le cas d'un message box au millieu du script sauver de la fenetre qui va me passer tous les evenements de la pile avant la fin du script.
Si vous avez une solution qui m'éviterais de reprendre tous mes script "sauver" de mes 200 fenetres pour les mettre dans des fonctions...
merci d'avance
Hors ligne
jplikepb a écrit:
L'evenement "avant" est toujours bien appelé mais après PEU de pas etre appelé APRES le script sauver.
Ca ne marche pas dans le cas d'un message box au millieu du script sauver de la fenetre qui va me passer tous les evenements de la pile avant la fin du script.
Desole, mais je comprends pas bien...
Resumons:
Dans l'event clicked du bouton sauver des 200 descendants de ta fenetre, tu as du code specifique. Et tu voulais appeller une methode (disons "A()") avant ce code specifique et une apres (disons "B()").
Donc, comme tout ces clicked sont en "extend ancestor script" de maniere sure ()_ naturellement tu as ecrit dans le clicked de l'ancetre un truc du genre
parent.A() parent.post B()
Et la, tu dis que B() ne se fait pas tjs parce que...
jplikepb a écrit:
Ca ne marche pas dans le cas d'un message box au millieu du script sauver de la fenetre qui va me passer tous les evenements de la pile avant la fin du script.
...tu veux dire quoi par la?
Quand t'as un messagebox il vide d'abord les event de la pile, avant de poursuivre l'execution entre le messagebox et la fin du script specifique? C'est ca?
Je viens de tester, et si c'est bien ca, alors ben... c'est pas ca paske chez moi ca marche...
C'est bien un simple appel de messagebox? Pas un messagebox via du script dans systemerror et que tu serais sur une version PB > 9?
Bref, je comprends pas bien ta question... mais j'essaie...
Hors ligne
Merci de creuser Cortex !
Tu a bien compris ce que je veux dire pour les 3/4, je vais détailler ma dernière phrase :
Imagine que l'utilisateur a saisie dans une DW un code en double : Après le Update de ma DW ca va me déclencher un DBError genre "duplicate key" que je catch et que j'affiche NON pas dans un messagebox (je me suis trompé) mais dans une belle fenetre de type "response" ouverte avec OpenWithParm ou je lui passe en paramètre le message d'erreur traduit dans la langue de l'utilisateur.
Le "parent.post B()" que j'ai fait en amont va se jouer dès l'affichage de ma fenetre !
J'imagine que PB quand il affiche la fenetre il commence a attendre que quelqu'un click sur OK et pendant ce temps il vide 1 à 1 tous les evenement de la pile pendant qu'il a le temps.
Et oui je suis en PB 10.5.2
Dernière modification par jplikepb (27-03-2008 13:07:15)
Hors ligne
la fenetre de message est declenchée dans le meme evenement ?
Hors ligne
jplikepb a écrit:
NON pas dans un messagebox (je me suis trompé) mais dans une belle fenetre de type "response" ouverte avec OpenWithParm ou je lui passe en paramètre le message d'erreur traduit dans la langue de l'utilisateur.
Ha oui, la je vois beaucoup mieux...
Malheureusement, c'est un ééénorme probleme que je rencontre parfois...
Les response ont ce defaut de, bien que modales et que theoriquement devant bloquer tout traitement, elles ne bloquent pas les traitements asynchrones... (aka les script appelles en post) Lesquels evidemment se produissent inopinement pendant que la fenetre response est ouverte...
Tu n'aurais pas eu ce probleme avec un messagebox par contre, c est bete!
...En meme temps, entre nous et comme je dis toujours, il ne peut exister de bonne solution pour réaliser une correction douteuse... Desole, mais je crois que de toute facon, il vaut mieux pour ton appli que tu "te tappe" tes 200 descendants, au moins, ce sera propre...
Il y a bien des outils de search/replace pour PB... (je me rapelle plus d'exemple par contre)
Hors ligne
Cortex, je pense que ton analyse est bonne, je m'étais doucement fait a l'idée de toute facon.
Effectivement j'ai fait un exemple minimum avec un messagebox pas de probleme et une fenetre en response et la tout bascule ! c'est le drame.
Merci en tout cas de ton aide. Je vais programmer un passage sur toutes les fenetre dès que possible.
Hors ligne
bon, c'est possible de voir le script de ton bouton sauver ?
Hors ligne
Si tu veux j'ai fait une appli minimum pour tester:
2 fenetres : w_main et w_response
dans le open de l'appli tu fait open(w_main)
dans w_main tu fait 2 evenements :
ue_avant avec messageBox("w_main", "AVANT")
ue_apres avec messageBox("w_main", "APRES")
w_response est une simplissime fenetre response avec un bouton : close(parent)
dans le open de w_main tu fait
this.triggerevent("ue_avant")
this.Postevent("ue_apres")
Messagebox("w_main", "traitement 1")
Messagebox("w_main", "traitement 2")
et tu test : La pas de problème tu obtiends : AVANT->traitement1->traitement2->APRES
si maintenant tu fait ceci dans le open:
this.triggerevent("ue_avant")
this.Postevent("ue_apres")
//Messagebox("w_main", "traitement 1")
Open(w_response)
Messagebox("w_main", "traitement 2")
et tu test : La c'est le drame : AVANT->fenetre response->APRES(!!!)->traitement2(!!!)
c'est plus clair ainsi ?
Hors ligne
en fait il faudrait lancer le ue_apres dans le close de w_response...
Hors ligne
ErAsORz a écrit:
en fait il faudrait lancer le ue_apres dans le close de w_response...
voila
Hors ligne
pick ouic a écrit:
ErAsORz a écrit:
en fait il faudrait lancer le ue_apres dans le close de w_response...
voila
...pour son appli minimum, oui...
Mais pour la vraie, ou l'equivalent de "w_response" n'arrive qu'en cas de dberror, parmi plein d'autre trucs possible et a travers 200 fenetres differentes et Dieu sait quelle autre joyeusete, je doute que ca fasse avancer le bigniou...
Hors ligne
Peut-être en utilisant la fonction Yield?
Hors ligne
Cortex a écrit:
pick ouic a écrit:
ErAsORz a écrit:
en fait il faudrait lancer le ue_apres dans le close de w_response...
voila
...pour son appli minimum, oui...
Mais pour la vraie, ou l'equivalent de "w_response" n'arrive qu'en cas de dberror, parmi plein d'autre trucs possible et a travers 200 fenetres differentes et Dieu sait quelle autre joyeusete, je doute que ca fasse avancer le bigniou...
bah il pourra toujours hériter de w_response dans une w_response_db avec le traitement spécifique...
Hors ligne