[Base] Capture/gestion événement fermeture de formulaire

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
pseon
NOOuvel adepte
NOOuvel adepte
Messages : 15
Inscription : 22 févr. 2010 16:19

[Base] Capture/gestion événement fermeture de formulaire

Message par pseon »

Bonjour,

J'utilise oooBase avec qlq macro BASIC.

Je voudrais capturer et gérer la fermeture d'un formulaire via le X de la fenêtre. J'ai fais pas mal de rechercher mais je ne suis pas encore assez calé pour produire mon propre code, j'ai bien compris qu'il était possible de capturer et de consommer un évènement mais je bloque sur l'écriture de la procédure.

Est-ce que qlq'un peut m'aider.

Merci d'avance
Dernière modification par Oukcha le 23 févr. 2010 08:49, modifié 1 fois.
OpenOffice 3.2 sous Windows XP

PS : Allez voter pour ce très, très ancien BUG N°54019 ! dans Impress.
pseon
NOOuvel adepte
NOOuvel adepte
Messages : 15
Inscription : 22 févr. 2010 16:19

Re: [Base] Capture/gestion dévènement fermeture de formulaire

Message par pseon »

D'après mes recherches il faudrais que j'utilise 'removeTerminateListener' mais je n'arrive pas à savoir comment !

Si quelqu'un pouvait me donner le code...

Ps : voila ce que j'ai essayé :

Code : Tout sélectionner

Sub StopListening()
'      ThisComponent.removeTerminateListener( oEventListener )
    oEventListener = CreateUnoListener( "DocCloseListener_", "com.sun.star.frame.XTerminateListener" ) 
       ThisComponent.addTerminateListener( oEventListener ) 
       ThisComponent.removeTerminateListener( oEventListener )

   If Not IsNull( oEventListener ) Then 
      ThisComponent.removeTerminateListener( ( oEventListener )   
      if MsgBox ("Voulez-vous réellement fermer l'application ?", 1+256+48) = 1 then 
    EndIf
   EndIf
End Sub 
Le modérateur a écrit : :alerte: Merci de ne pas poster plusieurs messages à la suite !
Si vous devez ajouter un complément d'information, le bouton "Editer" à la droite du message permet d'y remédier.

En attendant une prochaine réponse, vous pouvez participer également en répondant à d'autres questions sur notre forum.
OpenOffice 3.2 sous Windows XP

PS : Allez voter pour ce très, très ancien BUG N°54019 ! dans Impress.
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26122
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Capture/gestion évènement fermeture de formulaire

Message par Dude »

Salut,
pseon a écrit :Je voudrais capturer et gérer la fermeture d'un formulaire via le X de la fenêtre.
Pourquoi ne pas passer par la gestion des évènements (menu Outils > Personnaliser) ?
event_form.jpg
http://user.services.openoffice.org/fr/ ... 41#p100281

:idea:
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
pseon
NOOuvel adepte
NOOuvel adepte
Messages : 15
Inscription : 22 févr. 2010 16:19

Re: [Base] Capture/gestion évènement fermeture de formulaire

Message par pseon »

Le modérateur a écrit : Merci de ne pas poster plusieurs messages à la suite !
Si vous devez ajouter un complément d'information, le bouton "Editer" à la droite du message permet d'y remédier.

En attendant une prochaine réponse, vous pouvez participer également en répondant à d'autres questions sur notre forum.
:oops: OK désolé, c'est juré je ne recommencerais plus


Dude a écrit :Pourquoi ne pas passer par la gestion des évènements (menu Outils > Personnaliser) ?
Non je me suis mal fait comprendre...

Pour être précis, j'ai un formulaire principal (il s'appel "menus") qui appel d'autres formulaires avec un bouton pour fermer chaque formulaires (+ 1 pour fermer l'appli ds le formulaire "menus" avec une msgbox qui demande de confirmer l'arrêt). Jusque là tout va bien je gére (à peu près :? ).

Mais ce que je cherche, c'est à gérer le/les cas où l'utilisateur ferme les fenêtres par la croix 'X' (principalement dans "menus"). J'ai bien compris que cela déclenchait un évènement 'Le document va être fermer'. Mais ce que je veux c'est afficher une msgbox demandant une confirmation :
  • si c'est OK fermer l'appli,
  • si c'est négatif annuler l'évènement de fermeture de la fenêtre (j'ai trouvé removeTerminateListener mais je n'arrive pas à trouver comment l'utiliser)
Le code que j'ai posté ci-dessus ne marche pas du tout. Donc si une bête en oooBAISC tombait (mais sans se faire mal) sur mon appel à l'aide (parce que là je galère depuis + de 2 semaines :fou: )...


Modif du 26/02/10 :

Puisque que personne ne semblent inspirés par mon pbm, voici qlq résultats des mes très longues et fastidieuses recherches. Je sais maintenant qu'il faut que j'utilise le service handler : com.sun.star.awt.XEventHandler. J'ai intégré un appel à ce service tel que :

Code : Tout sélectionner

Sub Demarrage(evt As Object)
.
.
.
	oEventHandler = CreateUnoListener( "EventHandler_","com.sun.star.awt.XEventHandler" )
.
.
.
End Sub
et

Code : Tout sélectionner

sub EventHandler_handleEvent(e as Object) as boolean
Msgbox "Yes EventHandler"
end sub
Mais si cela ne plante pas rien ne se passe !

Je sais donc ce que je dois utiliser. Maintenant mon pbm, c'est d'avoir une explication (voir un tutoriel et dans l'idéal un bout de code) sur l'utilisation et le paramétrage de ce service mais vu le manque cruel (voir l'absence totale) d'info (la description de l'API ne suffit pas), j'implore les grands manitous de la programmation oooBASIC !

Le Modérateur a écrit : :alerte: En plus du code, fournissez avec un fichier complet. Cela augmentera vos chances de réponse en évitant d'avoir à recréer quelque chose qui au final, pourrait ne pas convenir.
OpenOffice 3.2 sous Windows XP

PS : Allez voter pour ce très, très ancien BUG N°54019 ! dans Impress.
pseon
NOOuvel adepte
NOOuvel adepte
Messages : 15
Inscription : 22 févr. 2010 16:19

Re: [Base] Capture/gestion évènement fermeture de formulaire

Message par pseon »

Le Modérateur a écrit : :alerte: En plus du code, fournissez avec un fichier complet. Cela augmentera vos chances de réponse en évitant d'avoir à recréer quelque chose qui au final, pourrait ne pas convenir.
Voici donc comme vous me l'avez demandé l'ensemble de la base. Attention du fait que je suis en phase de développement certaines parties du code (en plus de celui en commentaire) ne sont pas utilisées.

En espérant que cela déclenche une avalanche de solutions...
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
OpenOffice 3.2 sous Windows XP

PS : Allez voter pour ce très, très ancien BUG N°54019 ! dans Impress.
Adrien Schiehle
Membre OOrganisé
Membre OOrganisé
Messages : 80
Inscription : 01 juil. 2009 07:24

Re: [Base] Capture/gestion évènement fermeture de formulaire

Message par Adrien Schiehle »

Bonjour,

J'ai un peu regardé votre code. Voici une poste à explorer :

Code : Tout sélectionner

REM  *****  BASIC  *****
Option Explicit

rem~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'OuvertureDocument : Se Lance à l'ouverture de l'Appli
rem~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub OuvertureDocument( )

	Dim oDoc				As Object
	oDoc = ThisComponent
	
	'Ajout d'un nouveau listener
	Dim oEventListener		As Object
	oEventListener = CreateUnoListener( "monListener_", "com.sun.star.util.XCloseListener" ) 
	oDoc.addCloseListener( oEventListener )
	
End Sub
rem~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



rem~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'monListener_queryClosing : Se Lance à la fermeture de l'Appli - Pas besoin de le mettre dans l'interface
rem~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub monListener_queryClosing( )

	Dim oDoc				As Object
	oDoc = ThisComponent
	
	Dim iIndex			As Integer
	iIndex 			= MsgBox( "Voulez vous fermer l'appli?", 256 + 32 + 4, "Demande de confirmation")
	If iIndex <> 6 Then
		'Insérer ici un renvoi d'exception de type com.sun.star.util.CloseVetoException
	End If
End Sub
rem~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Par contre le hic est le suivant : Je ne sais pas comment faire un throw en basic :shock:

Sinon, juste un petit brin d'explication sur comment fonctionne les listeners en StarBasic :

La fonction

Code : Tout sélectionner

CreateUnoListener( "<prefix>", "<classe de listener>" ) 
Définit un listener ainsi que des noms de procédure réservé pour cette dernière.
Les noms de ces dernières dépendent du listener utilisé : <prefix><methode plublic de la classe>


Exemple :
CreateUnoListener( "monListener_", "com.sun.star.util.XCloseListener" )

Si on regarde la classe Java "com.sun.star.util.XCloseListener", on remarque que cette derniere à deux méthodes publiques :
- queryClosing( ... ) : Est appelé avant la fermeture de l'object écouté
- notifyClosing( ... ) : est appelé une fois que l'objet est fermé

En Starbasic la surcharge de ces deux méthode se fait en créant les procedure suivantes :

Code : Tout sélectionner

Sub monListener_queryClosing( )
[...]
End Sub


Sub monListener_notifyClosing( )
[...]
End Sub
Je ne sais pas si tout ca peut t'aider, mais on sait jamais ^^
OpenOffice 3.2 sous Redhat 4.6
OpenOffice 3.2 sous Windows XP
pseon
NOOuvel adepte
NOOuvel adepte
Messages : 15
Inscription : 22 févr. 2010 16:19

Re: [Base] Capture/gestion évènement fermeture de formulaire

Message par pseon »

Le modérateur a écrit :Pour répondre à un message, utilisez le bouton RÉPONDRE en bas de page à gauche, et non le bouton CITER ce qui évite de citer l'ensemble du message précédent rendant la lecture très difficile.

Pour citer la phrase à laquelle vous voulez répondre il suffit de la copier, la coller et la sélectionner dans votre message puis de cliquer sur le bouton Quote ; les balises [ quote] et [ /quote] encadrent alors la phrase citée.
Je ne crois pas que ce soit la solution car com.sun.star.util.XCloseListener ne fait QUE écouter un évènement et (d'après mes tout petites connaissances...), com.sun.star.util.CloseVetoException est un retour et donc ne peut pas être modifié pour être mis à true ou false.

C'est pour cela que je m'intéresse à com.sun.star.awt.XEventHandler. Car ce service permettrai (d'après la doc API) de consommer (ou pas) l'évènement. mais là je cale et cela me gave de plus en plus :fou: :marto:

Sinon il y aurait un contournement, a savoir : cacher la croix 'X' de la fenetre mais là aussi je ne sais pas comment faire.

Merci quand même pour ta réponse.
Dernière modification par Oukcha le 01 avr. 2010 10:15, modifié 1 fois.
Raison : Suppression citation intégrale du précédent message.
OpenOffice 3.2 sous Windows XP

PS : Allez voter pour ce très, très ancien BUG N°54019 ! dans Impress.
Avatar de l’utilisateur
Clarion14
Membre hOOnoraire
Membre hOOnoraire
Messages : 100
Inscription : 09 oct. 2009 16:53

Re: [Base] Capture/gestion évènement fermeture de formulaire

Message par Clarion14 »

Bonjour,
C'est pour cela que je m'intéresse à com.sun.star.awt.XEventHandler.
J'ai déjà beaucoup cherché et j'en ai conclu que c'était la seule piste, sauf que je ne sais pas quoi faire avec la proposition Java AWT (Abstract Windowing Toolkit ), que c'est dans le SDK. Mais c'est tout pour l'instant.

J'essaie de comprendre le lien suivant : http://java.sun.com/javase/6/docs/api/j ... sSpec.html

A bientôt
LbreOffice 3.3.4.1 SRB 1.2.0 & Windows XP SP3
Avatar de l’utilisateur
Loopingss
InconditiOOnnel
InconditiOOnnel
Messages : 783
Inscription : 17 déc. 2008 01:50

Re: [Base] Capture/gestion évènement fermeture de formulaire

Message par Loopingss »

Bonjour,
Je pense que Dude a raison pour votre problème. Une macro simple pour demander une confirmation de fermeture d'un formulaire est votre besoin. Déclenchez cette macro de contrôle dès l'appel de fermeture, cela fonctionnera, en principe quelque soit la méthode de déclenchement : "click sur la croix" ou bouton personnalisé.
COOordialement.
bm92
ManitOOu
ManitOOu
Messages : 2562
Inscription : 26 nov. 2005 13:42

Re: [Base] Capture/gestion évènement fermeture de formulaire

Message par bm92 »

Bonjour,
pseon a écrit :Je voudrais capturer et gérer la fermeture d'un formulaire via le X de la fenêtre.
(...)
MsgBox ("Voulez-vous réellement fermer l'application ?", 1+256+48)
Un formulaire dans Base n'est rien d'autre qu'un document Writer.
Essayez donc de faire cela sur un simple document Writer : interdire la fermeture du document par le X de la fenêtre. Je n'y suis pas encore arrivé.
D'autre part, l'utilisateur peut décider de fermer le document Base, ce qui ferme d'abord le formulaire! Alors dans ce cas, que peut-on faire si l'utilisateur se ravise ? Bien compliqué, tout ça...

Avant d'aborder l'état des recherches, une remarque : pourquoi donc demander une confirmation quand l'utilisateur ferme la fenêtre ? L'utilisateur a ses raisons, ce n'est pas une erreur. C'est au programmeur de s'y plier, éventuellement effectuer un traitement avant la fermeture. Je veux dire que la possibilité d'annuler une fermeture n'est sans doute pas indispensable.

Le Developer's Guide dit qu'il faut déclencher une exception CloseVetoException sur l'événement traité par un XCloseListener.
L'événement queryClosing n'est pas une routine d'approbation, à laquelle il suffirait de renvoyer True ou False, puisque sa définition indique qu'il ne renvoie rien (void). Il faut déclencher une exception CloseVetoException.

Mais Basic ne peut pas déclencher une exception. Il faut Java ou C++. C'est confirmé par un développeur expert d'OpenOffice dans ce message.

Dans le fil de notre forum [Calc] Empêcher la fermeture d'un classeur, Pierre-Yves Samyn a vu la solution : le service Instancelocker.

Le service com.sun.star.embed.Instancelocker a été créé pour permettre de contrôler la fermeture depuis (par exemple) Basic. Ce message en anglais brosse le principe. Mais après plusieurs années aucun exemple Basic n'existe à ma connaissance.

J'ai essayé d'utiliser ce service pour empêcher la fermeture d'un simple document Writer, sans succès.
Je pense qu'il est seulement nécessaire d'initialiser le service, sans avoir besoin d'un Listener. Mais la difficulté est l'initialisation.
C'est un service "nouveau style" utilisant des constructeurs, peut-être faut-il l'invocation introduite par la 3.2.
Ce qui donnerait (je n'ai pas pu le tester):

Code : Tout sélectionner

Global sv As Object
' ....
' empêcher la fermeture
sv = com.sun.star.embed.InstanceLocker.InstanceLockerCtor1( ThisComponent, com.sun.star.embed.Actions.PREVENT_CLOSE)

' rétablir l'état normal
sv.dispose
Je ne suis même pas sûr que ThisComponent soit un objet acceptable pour le premier argument.
Bernard

OpenOffice.org 1.1.5 fr / Apache OpenOffice 4.1.1 / LibreOffice 5.0.5.2 (X64)
MS-Windows 7 SP1 64bits Familial