Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour à tous,
J'ai des soucis pour fermer mon application que j'ai du créer de toute pièces (d'habitude je dois juste faire joujou avec des applications déjà existantes ).
C'est une application vraiment très basique : un objet application, une fonction et une fenêtre.
Le open de mon application initialise certaines variables globales nécessaires à l'authentification de l'utilisateur puis fait appel à la fenêtre :
[...] //////////////////////////////////////////////// // Ouverture de la frame de l'application //////////////////////////////////////////////// Open (w_init_masse) // YOUR MDI frame window goes here!
Dans ma fenêtre (de type main) j'appelle tout de suite un événement après le open qui réalise le traitement attendu (avec log affiché sur la fenêtre pendant le traitement).
Une fois fini on peut fermer la fenêtre en cliquant sur le bouton fermer ...
Close(Parent)
... ou en cliquant sur la croix de la fenêtre
Mais le problème c'est que je n'accède jamais à l'événement close de mon application :
//////////////////////////////////////////////// // Destroy the global non-visual user objects. //////////////////////////////////////////////// f_destroy_global_variables() /////////////////////////////////// // Rollback any pending updates. /////////////////////////////////// ROLLBACK & USING SQLCA; ///////////////////////////////////////// // Disconnect the current transaction. ///////////////////////////////////////// DISCONNECT & USING SQLCA;
Quelle étape ai je donc loupé dans ma démarche?
Y a t-il une possibilité d'appeler l'événement close de l'application depuis l'événement close de la fenêtre?
Merci d'avance pour vos réponses
Dernière modification par Nephtis (04-12-2008 09:49:14)
Hors ligne
tu as debuggué ?
tu as mis des messagebox un peu partout , pour voir ou ca passe ?
il n'y a pas un halt close, un truc de ce genre ?
Hors ligne
C'est quand j'ai débuggué que je me suis justement aperçu que je ne rentrait pas dans le close de mon application
Je lance "Step Over" pour ce point d'arrêt et puis plus rien : la fenêtre à bien disparue mais le debuggueur tourne toujours et tout est grisé (pas de "Resume" ou de "Step XXXX")
Les "Halt Close" se trouvent dans le open de mon application et dans la fonction (qui elle même est appelée dans le open)
Dernière modification par Nephtis (02-12-2008 10:41:04)
Hors ligne
Tu as du code dans le closequery de ta fenêtre ?
Hors ligne
As tu essayé de mettre un point d'arrêt dans ta fonction f_destroy_global_variables() ?
Hors ligne
shahin a écrit:
Tu as du code dans le closequery de ta fenêtre ?
Ma fenêtre ne possède que les événements 'open' et 'ue_init' (voir capture d'écran ci dessus)
nico a écrit:
As tu essayé de mettre un point d'arrêt dans ta fonction f_destroy_global_variables() ?
J'ai mit un point d'arrêt dedans et tout s'est bien déroulé
Code de la fonction :
string l_s_app_name l_s_app_name = GetApplication().appname ///////////////////////////////////////////////// // Initialisation des variables globales ///////////////////////////////////////////////// // Create the environment services object. This should // be done before either components or msg_manager. g_nv_env = CREATE nv_environment // Create INI manager g_nv_ini = CREATE nv_ini // Create the message manager. g_nv_msg_mgr = CREATE nv_msg_manager // Create fonction de manipulation de données g_nv_fct_data = CREATE nv_fct_data ///////////////////////////////////////////// // Vérification d'unicité de l'application ///////////////////////////////////////////// if a_b_test_unicite then if not g_nv_env.fnv_test_unicite_appl(GetApplication()) then MessageBox (l_s_app_name, "L'application est déjà lancée", StopSign!) halt close end if end if ///////////////////////////////////////////////////////////////// // Initilisation de l'objet de gestion du .INI de l'application ///////////////////////////////////////////////////////////////// // Open the application .INI file. IF NOT g_nv_ini.fnv_check_and_open (l_s_app_name) THEN MessageBox (l_s_app_name, "Impossible d'ouvrir le fichier .INI de l'application", StopSign!) HALT CLOSE END IF
Hors ligne
Nephtis a écrit:
J'ai mit un point d'arrêt dedans et tout s'est bien déroulé
Donc tu es bien passé dans l'événement close de ton application?
Et quand tu debug ta fonction pas à pas ou est ce que ça bloque?
Hors ligne
La fonction se trouve dans l'événement open de l'application, je ne passe jamais dans l'événement close de l'application (malheuresement ).
Je passe dans le open de l'application --> ouverture de la fenêtre --> open de la fenêtre qui appelle ue_init_masse --> (clic sur le bouton fermer) événement close de la fenêtre --> plus rien
Dernière modification par Nephtis (02-12-2008 14:28:30)
Hors ligne
Oups, j'avais cru comprendre que tu rentrais dedans lorsque tu à écrit
Nephtis a écrit:
J'ai mit un point d'arrêt dedans et tout s'est bien déroulé
Par contre, il s'agit bien du code de l'event close de ton appli?
//////////////////////////////////////////////// // Destroy the global non-visual user objects. //////////////////////////////////////////////// f_destroy_global_variables() /////////////////////////////////// // Rollback any pending updates. /////////////////////////////////// ROLLBACK & USING SQLCA; ///////////////////////////////////////// // Disconnect the current transaction. ///////////////////////////////////////// DISCONNECT & USING SQLCA;
Tu as bien mis un point d'arrêt sur ta fonction f_destroy_global_variables(), et lorsque tu clic sur cb_fermer, le debugger ne se déclenche pas?
Hors ligne
nico a écrit:
Par contre, il s'agit bien du code de l'event close de ton appli?
Affirmatif : Ctrl+A, Ctrl+C puis Ctrl+V
nico a écrit:
Tu as bien mis un point d'arrêt sur ta fonction f_destroy_global_variables(), et lorsque tu clic sur cb_fermer, le debugger ne se déclenche pas?
C'est bien la mon problème, je n'accède jamais à cette partie du script (le debugger ne se déclenche pas)
Hors ligne
Je suis un peu désorienté
ta fenêtre a t'elle héritée d'une autre fenêtre?
Sinon, comme l'a dit Pick, je placerai des messagebox() un peu partout
dans l'évent clicked du cb_fermer, dans l'évent close de ta window, dans le close de ton appli, et dans ta fonction f_destroy_global_variables().
Hors ligne
un peu HS, mais ta fonction f_destroy_global_variables() est-elle vraiment utile ?
Le garbage collector est là pour ça...
Hors ligne
erasorz a écrit:
un peu HS, mais ta fonction f_destroy_global_variables() est-elle vraiment utile ?
Le garbage collector est là pour ça...
Le code pour l'ouverture et la fermeture de l'application à été repris d'une application existante, je pars donc sur le fait que même si cela peut être inutile, ça marche habituellement sur l'autre application.
J'm'en vas lancer un bombardement de messagebox
Hors ligne
Bombardement terminé
La vidéo du tournage ici : http://dl.free.fr/oBNXSdnsz
Hors ligne
Nephtis a écrit:
Y a t-il une possibilité d'appeler l'événement close de l'application depuis l'événement close de la fenêtre?
Application app app = GetApplication() app.Event close()
Hors ligne
et si tu pouvais mettre de jolies femmes en fond d'ecran, on y verrait plus claire...
Hors ligne
c'est vrai que des messagebox(), c'est pas très sexy
Et j'avoue que c'est ma première scéance vidéo .............. De debug
Hors ligne
On voit une partie de Misato (Evangelion) sur le coté droit de la vidéo (c'est une jolie femme tout de même)
thefab a écrit:
Code: pb
Application app app = GetApplication() app.Event close()
Ça appelle bien l'événement close mais ça ne force pas l'application à se terminer
Dernière modification par Nephtis (03-12-2008 13:42:12)
Hors ligne
Nephtis a écrit:
Ça appelle bien l'événement close mais ça ne force pas l'application à se terminer
En effet, mais de toute façon, ton appli devrait marcher telle quelle... Pourrait-on voir l'export des objets application et ta window?
Hors ligne
Bonjour,
A mon point de vue, si tu ne passes pas dans l'événement close de l'application c'est que ta fenêtre n'est jamais réellement fermée.
Ta fenêtre se ferme visuellement mais il reste surement un processus en cours de traitement dans le code de la fenêtre qui empêche la fermeture totale (retrait total du processus de la mémoire).
Par exemple, tu n'as pas une requête qui reste en attente de libération d'un lock ou autres ? je dis ça parce que je vois un ROLLBACK dans la fermeture global de ton application.
Vu que ton application ne paraît pas complexe, je la recommencerai en la reconstruisant graduellement jusqu'à voir quelle process empêche le passage dans l'événement close de l'application.
Hors ligne
buck a écrit:
Bonjour,
A mon point de vue, si tu ne passes pas dans l'événement close de l'application c'est que ta fenêtre n'est jamais réellement fermée.
Ta fenêtre se ferme visuellement mais il reste surement un processus en cours de traitement dans le code de la fenêtre qui empêche la fermeture totale (retrait total du processus de la mémoire).
Par exemple, tu n'as pas une requête qui reste en attente de libération d'un lock ou autres ? je dis ça parce que je vois un ROLLBACK dans la fermeture global de ton application.
Vu que ton application ne paraît pas complexe, je la recommencerai en la reconstruisant graduellement jusqu'à voir quelle process empêche le passage dans l'événement close de l'application.
Je lis le contenu d'un fichier, peut être que je passe dans une condition ou j'oublie de fermer le fichier.
Je regarde ça de suite.
J'ai testé de supprimer tout ce qui est identification et habilitation dans le open de mon application et là ça marche tout seul.
Bon va falloir que j'analyse comment ça marche...
Resolu, merci buck (et puis tous les autres aussi )
Dernière modification par Nephtis (04-12-2008 09:48:50)
Hors ligne