Page 1 sur 1

[Résolu][Calc]fermeture document erreur CloseVetoException

Publié : 02 août 2008 17:15
par quark22
Bonjour,

J'ai un petit soucis pour fermer un document
je lance mon fichier "fichier.ods", une boite de dialogue s'ouvre au démarrage;
cette dernière contient un bouton "quitter"

quand je suis sous openoffice 2.2.1
si je ferme cette boite de dialogue et que je lance cette même boite de dialogue depuis l'éditeur de macro et que je clique sur le bouton "quitter" cela ferme le document normalement
du moins, il reste une fenêtre de l'éditeur de macro vierge mais openoffice lui se ferme normalement ?
si je ne ferme pas cette boite de dialogue au démarrage et que je clique sur le bouton "quitter" cela provoque l'ereur suivante

Runtime Error Basic
Exception
Type : sun.com.star.util.CloseVetoException
Message : Controller disagree ....

quand je suis sous openoffice 2.4.1
si je ferme cette boite de dialogue et que je lance cette même boite de dialogue depuis l'éditeur de macro et que je clique sur le bouton "quitter" cela ferme le document normalement
du moins, il reste une fenêtre de l'éditeur de macro vierge mais openoffice lui se ferme normalement ?
si je ne ferme pas cette boite de dialogue au démarrage et que je clique sur le bouton "quitter" cela ne provoque pas l'erreur suivante

Runtime Error Basic
Exception
Type : sun.com.star.util.CloseVetoException
Message : Controller disagree ....

mais openoffice me dit qu'une erreur inattendue est intervenue et il me demande si je veux envoyer le rapport d'erreur, puis il lance la restauration du fichier "fichier.ods" ce que je ne veux pas. je veux qu'il se ferme.

Code : Tout sélectionner


REM  *****  BASIC  *****

Dim document as Object
Dim feuille as Object
Dim plage as Object
Dim cellule as Object

Public Const NOMBRE_INFORMATION_SERVICE = 13

Dim boite_principale as Object
Dim boite_creation_service as Object
Dim boite_statistique as Object
Dim boite_statistique_accueil as Object
Dim boite_statistique_courrier as Object





								REM boite de dialogue principale





Public Sub procedure_boite_principale
	
	Call procedure_affiche_page_accueil
	
	' protéger toutes les feuilles
	document = ThisComponent		
	
	For p = 0 To document.Sheets.Count()-1
		feuille = document.Sheets(p)		
		feuille.Protect("feuille")
	Next p
	
	' masquer toutes les feuilles
			
	For m = 1 To document.Sheets.Count()-1
		feuille = document.Sheets(m)
		feuille.IsVisible = FALSE
	Next m
	
	DialogLibraries.LoadLibrary("Standard")
	boite_principale = CreateUnoDialog(DialogLibraries.Standard.boite_principale)
	boite_principale.getControl("DateField1").Text = Date	
	boite_principale.getControl("OptionButton2").State = TRUE
	Call procedure_boite_principale_liste_civilite	
	Call procedure_boite_principale_liste_objet			
	Call procedure_boite_principale_liste_destinataire
	Call procedure_boite_principale_liste_signataire		
	boite_principale.getControl("TextField7").Text = "DURAND DUPONT"
	
	boite_principale.getControl("DateField1").setFocus	
	
	boite_principale.Execute()
	
End Sub

Public Sub procedure_boite_principale_quitter
		
	boite_principale.endExecute()
	
	' sélectionner le document actif 	 	
 	document = ThisComponent
	
	If (HasUnoInterfaces(document,"com.sun.star.util.XCloseable") = TRUE) Then		
		document.Store()
		Wait 1000							
		document.close(TRUE)	
	end if
	 	
End Sub

document.Store() j'ai mis ceci à la place d'un dispatcher, je l'ai vu dans un réponse de dude dans un autre post sur le même sujet.

moi la boite de dialogue "boite_principale" s'ouvre, les boites combinées se remplissent de leurs données, les champs se mettent à jour tout va bien, j'attends un peu puis je clique sur le bouton "quitter"
et là, problème que ce soit sous openoffice 2.2.1 ou 2.4.1
1) mais le fait de cliquer sur le bouton "quitter" de cette boite de dialogue qui a été lancée depuis l'éditeur de macro
ne provoque pas la même erreur que

2) de cliquer sur le bouton "quitter" directement âprès l'ouverture de la boite de dialogue qui s'ouvre au démarrage du document
éditeur de Calc OUTILS PUIS PERSONNALISER PUIS EVENEMENT PUIS OUVERTURE DE DOCUMENT
méthode que je souhaite utiliser

merci d'avance

Re: [Calc]fermeture document erreur CloseVetoException

Publié : 02 août 2008 18:42
par bm92
Bonsoir,
Le fait d'avoir appelé endExecute dans une Sub ne termine pas pour autant la macro qui a lancé l'execute (procedure_boite_principale).

Je pense que ça marchera mieux en déplaçant la fermeture du document après le boite_principale.Execute().

Re: [Calc]fermeture document erreur CloseVetoException

Publié : 02 août 2008 21:34
par quark22
Merci bm92

J'ai fait ceci mais l'erreur est toujours présente

Code : Tout sélectionner


Sub procedure_boite_principale
	
	If (quitter = FALSE) Then	
		Call procedure_affiche_page_accueil
		
		' protéger toutes les feuilles
		document = ThisComponent		
		
		For p = 0 To document.Sheets.Count()-1
			feuille = document.Sheets(p)		
			feuille.Protect("feuille")
		Next p
		
		' masquer toutes les feuilles
				
		For m = 1 To document.Sheets.Count()-1
			feuille = document.Sheets(m)
			feuille.IsVisible = FALSE
		Next m
		
		DialogLibraries.LoadLibrary("Standard")
		boite_principale = CreateUnoDialog(DialogLibraries.Standard.boite_principale)
		boite_principale.getControl("DateField1").Text = Date	
		boite_principale.getControl("OptionButton2").State = TRUE
		Call procedure_boite_principale_liste_civilite	
		Call procedure_boite_principale_liste_objet			
		Call procedure_boite_principale_liste_destinataire
		Call procedure_boite_principale_liste_signataire		
		boite_principale.getControl("TextField7").Text = ""
		
		boite_principale.getControl("DateField1").setFocus	
		
		boite_principale.Execute()
	Else
		boite_principale.endExecute()
	
		' sélectionner le document actif 	 	
	 	document = ThisComponent
		
		If (HasUnoInterfaces(document,"com.sun.star.util.XCloseable") = TRUE) Then		
			document.Store()
			Wait 1000							
			document.Close(TRUE)		
		End If
	End If
	
End Sub

Sub procedure_boite_principale_quitter
	
	quitter = TRUE
	
	Call procedure_boite_principale
		 	
End Sub



j'ai essayé ceci

Code : Tout sélectionner


Else
	boite_principale.Dispose()                  ' rem j'ai rajouté cette ligne

	   boite_principale.endExecute()
	

		' sélectionner le document actif 	 	
	 	document = ThisComponent
		
		If (HasUnoInterfaces(document,"com.sun.star.util.XCloseable") = TRUE) Then		
			document.Store()
			Wait 1000							
			document.Close(TRUE)		
		End If
	End If


boite_principale.Dispose() ' rem j'ai rajouté cette ligne
et bien openoffice aime mieux avec cette ligne en plus, tout se ferme comme je veux
mais lorsque je réouvre mon fichier il lance une restauration, donc il n'aime pas encore totalement

pour les plus doués j'ai ce lien mais je ne comprends pas tout ou plutôt pas grand chose...

http://wiki.services.openoffice.org/wi ... ocuments

Re: [Calc]fermeture document erreur CloseVetoException

Publié : 03 août 2008 06:03
par bm92
Bonjour,
Tes modifications sont plus complexes que nécessaire.
Tu devrais avoir une structure comme ceci

Code : Tout sélectionner

Sub procedure_boite_principale
' ouvrir la boite de dialogue
' ....
boite_principale.execute()
' on revient ici à la fermeture du dialogue
boite_principale.dispose()
document.store()
document.close(True)
End Sub


Sub procedure_boite_principale_quitter
boite_principale.endExecute()          
End Sub
Ceci doit suffire pour fermer proprement la boîte et le document.
quark22 a écrit :tout se ferme comme je veux mais lorsque je réouvre mon fichier il lance une restauration, donc il n'aime pas encore totalement
Cherche ailleurs dans ton codage un traitement non terminé.

Re: [Calc]fermeture document erreur CloseVetoException

Publié : 03 août 2008 06:28
par Pierre-Yves Samyn
Bonjour

Une alternative serait d'utiliser la méthode SetVisible au lieu de la méthode Execute

Ci-dessous un exemple :

Code : Tout sélectionner

Option Explicit

Dim PysDlg As Object
Dim PysFermerDoc as boolean, PysContinuer as boolean

Sub PysLancerDlg()

Dim PysBibli As Object, PysDialogue As Object

DialogLibraries.LoadLibrary("Standard")
PysBibli = DialogLibraries.GetByName("Standard")
PysDialogue = PysBibli.GetByName("Dialog1")
PysDlg = CreateUnoDialog(PysDialogue)

PysFermerDoc = false
PysContinuer = True

' Tant que la variable PysContinuer = True on affiche le dialogue
' Donc ATTENTION a prevoir l'appel a une procedure permettant de
' modifier la valeur de cette variable qui doit par ailleurs 
' avoir une portee ad hoc

while PysContinuer
	PysDlg.setVisible(true)

'	Donne la main au systeme (en millisec)
	wait 20
wend

' On continue le traitement quand la variable PysContinuer = false

if PysFermerDoc = true then
	ThisComponent.close(true)
end if
  
End Sub
 

Sub PysArreter
'	Procedure appelee par clic sur le bouton OK qui ne doit 
'	donc plus etre defini comme un bouton OK mais comme 
'	un bouton "par defaut"
	PysContinuer = False
end sub

sub PysFermer
'	Procedure appelee par clic sur le bouton Fermer

'	On pourrait ne pas mettre PysContinuer = false ici
'	si on souhaite desynchroniser les deux operations
'	par exemple pour faire autre chose. Dans ce cas
'	le document ne sera ferme qu'apres clic sur le bouton OK

	PysContinuer = False
	PysFermerDoc = true
end sub


Re: [Calc]fermeture document erreur CloseVetoException

Publié : 03 août 2008 13:44
par quark22
merci pour vos réponses,

Ta solution Pierre Yves ne m'arrange pas car de ma boite de dialogue principale j'appelle d'autre boite de dialogue secondaire, et gérer l'ffichage ou le non affichage à l'aide d'un while wend est plus dur

j'ai mis en pratique la solution de bm92

et là cela marche à moité

mon code

Code : Tout sélectionner


Sub procedure_boite_principale
	
	Call procedure_affiche_page_accueil
	
	' protéger toutes les feuilles
	document = ThisComponent		
	
	For p = 0 To document.Sheets.Count()-1
		feuille = document.Sheets(p)		
		feuille.Protect("feuille")
	Next p
	
	' masquer toutes les feuilles
			
	For m = 1 To document.Sheets.Count()-1
		feuille = document.Sheets(m)
		feuille.IsVisible = FALSE
	Next m
	
	DialogLibraries.LoadLibrary("Standard")
	boite_principale = CreateUnoDialog(DialogLibraries.Standard.boite_principale)
	boite_principale.getControl("DateField1").Text = Date	
	boite_principale.getControl("OptionButton2").State = TRUE
	Call procedure_boite_principale_liste_civilite	
	Call procedure_boite_principale_liste_objet			
	Call procedure_boite_principale_liste_destinataire
	Call procedure_boite_principale_liste_signataire		
	boite_principale.getControl("TextField7").Text = ""
	
	boite_principale.getControl("DateField1").setFocus	
	
	boite_principale.Execute()
			
	If (quitter = TRUE) Then		
		' sélectionner le document actif 
		document = ThisComponent
		
		If (HasUnoInterfaces(document,"com.sun.star.util.XCloseable") = TRUE) Then		
			document.Store()										
			document.Close(TRUE)					
		End If	
	End If	
	
End Sub

Sub procedure_boite_principale_quitter
	
	quitter = TRUE
	
	boite_principale.endExecute()	
	 	
End Sub

le "boite_principale.Dispose()" devient inutile, j'ai fait des essais avec et sans cela fonctionne de la même façon.
Si je lance mon fichier "fichier.ods" la boite de dialogue principale s'affiche et lorsque que j'appuie sur le bouton "QUITTER" tout se ferme normalement et la réouverture se fait normalement sans erreur, donc dans ce cas cela fonctionne.

Mais...

quand je veux des statistiques j'appuie sur le bouton "STATISTIQUE"
et je fais

Code : Tout sélectionner


Sub procedure_boite_principale_statistique
		
	boite_principale.endExecute()
	
	Call procedure_boite_statistique

End Sub

Sub procedure_boite_statistique
	
	' sélectionner la feuille des objets
	document = ThisComponent
	feuille = document.Sheets.getByName("page_objet")
	feuille.IsVisible = FALSE
	
	Call procedure_affiche_page_accueil

	DialogLibraries.LoadLibrary("Standard")
	boite_statistique = CreateUnoDialog(DialogLibraries.Standard.boite_statistique)

	boite_statistique.getControl("DateField1").Text = Date
	boite_statistique.getControl("DateField2").Text = Date
	boite_statistique.getControl("NumericField1").Enable = FALSE

	boite_statistique.getControl("DateField1").setFocus	
	
	boite_statistique.Execute()
		
End Sub

la boite de dialogue se ferme donc elle la boite de dialogue statistique s'ouvre

sur la boite de dialogue statistique il y a un bouton "RETOUR"

Code : Tout sélectionner


Sub procedure_boite_statistique_retour
		
	boite_statistique.endExecute()
	
	Call procedure_boite_principale	

End Sub

voici le "mais..."

donc si je lance le fichier "fichier.ods", ma boite dialogue principale s'ouvre si j'appuie sur le bouton "QUITTER" de ma boite de dialogue principale tout se ferme et s'ouvre normalement.

mais si je lance le fichier "fichier.ods", ma boite dialogue principale s'ouvre si j'appuie sur le bouton "STATISTIQUE" de ma boite principale, ma boite de dialogue principale se ferme et ma boite de dialogue statistique s'ouvre.
jusque là tout fonctionne...
et si j'appuie sur le bouton "RETOUR" de ma boite de dialogue statistique, cette dernière se ferme et ma boite de dialogue principale s'ouvre
et là si j'appuie sur le bouton "QUITTER" de ma boite dialogue principale
erreur restauration suite à erreur inattendue.

seulement dans le cas où j'ouvre une autre boite de dialogue que je ferme de la même manière que ma boite principale de dialogue " boite_dialogue.endExecute()"
l'erreur apparaît, comme si le fait de fermer la boite de dialogue statistique ne suffit pas....
faudrait il vider la mémoire utilisée par la session ouverte ou vider les boite de dialogue qui ont été ouverte.
car dans la boite statistique il y a deux champs "date" préremplis, un bouton valider et un bouton retour

Re: [Calc]fermeture document erreur CloseVetoException

Publié : 03 août 2008 13:51
par Grenouille
Bonjour,
quark22 a écrit :Ta solution Pierre Yves ne m'arrange pas car de ma boite de dialogue principale j'appelle d'autre boite de dialogue secondaire, et gérer l'ffichage ou le non affichage à l'aide d'un while wend est plus dur
Je n'ai pas la solution mais pour moi, il y a un problème d'ergonomie car une boîte de dialogue est un élément final d'affichage. Si tu as à lancer des dialogues, le mieux serait d'avoir une feuille comme formulaire de lancement (un peu ce que fait FactOOor).

Re: [Calc]fermeture document erreur CloseVetoException

Publié : 03 août 2008 14:28
par quark22
Grenouille je ne comprends ce que tu veux dire par une boite ddialogue est un affichage final ?

par contre je comprends bien ce que veux dire quand tu dis

"Si tu as à lancer des dialogues, le mieux serait d'avoir une feuille comme formulaire de lancement"

en fait mettre des boutons de formulaire sur ma page de départ
et ces boutons lanceraient les boites de dialogues que je veux

donc j'ai mis un bouton "Quitter" sur ma feuille "Feuille1"
donc quand j'appuie sur le bouton "QUITTER" de ma boite de dialogue principale, cette dernière se ferme.
derrière il y a le bouton quitter de la feuille "Feuille1" et lorsque je clique dessus, tout se ferme quelque soit le cas
et sans erreur, ni à la fermeture, ni à la réouverture.

mais bon pas top d'appuyer sur 2 boutons "QUITTER", un de la boite de dialogue principale et un autre bouton "QUITTER" sur la feuille derrière cette boite de dialogue principale

j'aimerais pouvoir garder lorsque je clique sur le bouton "QUITTER" de la boite de dialogue princiaple tout se ferme
ou alors au moins que lorsque je clique sur le bouton "QUITTER" de la boite de dialogue principale
celui ci simule un clic sur le bouton "QUITTER" de la feuille "Feuille1".
Mais comment manipuler un bouton sur une feuille, à partir d'une macro...

Re: [Calc]fermeture document erreur CloseVetoException

Publié : 07 août 2008 16:26
par quark22
Bonjour,

Personne n'a de réponse à ce problème.
D'où peux venir l'erreur ?
ou Comment simuler l'appui sur le bouton du formulaire à partir d'un bouton d'une boite de dialogue ?
J'ai regardé les "listener" etc..., mais je ne comprends pas tout et les sites, où je vais, sont en anglais.