[Base] Rendre autonome son application

Venez ici afin d'enrichir la documentation de nos suites bureautiques préférées. Déposez une demande ou y répondre par la création ou la traduction d'un tutoriel.

Modérateur : Vilains modOOs

Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25143
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

[Base] Rendre autonome son application

Message par Dude »

De nombreuses personnes passent régulièrement sur ce forum pour cette question.
Il s'agit de pouvoir masquer l'interface de Base pour ne laisser qu'un formulaire visible.

La création d'un tutoriel sur le sujet serait donc le bienvenu en s'inspirant des fils existants : Certains fils peuvent emmener vers d'autres ressources, à vous de les suivre.
D'autres réponses peuvent aussi exister en faisant une recherche dans ce forum.
Si vous en trouvez, n'hésitez pas à en donner les liens à la suite de ce fil.

Votre participation à cet effort de documentation permettra d'aider tous les autres membres de la communauté confrontés à ce même problème.
Vous aurez aussi la satisfaction de dire que vous n'êtes pas un simple spectateur et que vous avez contribué activement à un projet libre.
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 19:07
Localisation : Guyane

Re: [Base] Masquer Base par macro

Message par Piaf »

Bonjour
Ce tutoriel fait suite au message de Dude [Base] Rendre autonome son application
et à la question du fil Verrouiller l'accès aux tables, formulaires ...

Il ne traite que du masquage de l’interface principale de Base.

La solution la plus employée consiste à masquer la fenêtre au démarrage de l’application avec la commande

Code : Tout sélectionner

ThisDatabaseDocument.CurrentController.ApplicationMainWindow.setVisible(false)
La fenêtre étant masquée, il faut naturellement afficher un formulaire, type menu, permettant d’utiliser l’application.
C’est-ce que fait la macro Démarrage.
Elle est déclenchée par l’événement « Ouvrir le document » dans le menu Outils > Personnaliser de la fenêtre principale.

Code : Tout sélectionner

Sub Demarrage()
Dim oConnexion AS Object, oFrame as Object
	ThisDatabaseDocument.CurrentController.connect("","")
	oConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
	ThisDatabaseDocument.FormDocuments.getByName( "fMenu" ).open
	oFrame = thisDatabaseDocument.FormDocuments.getByName("fMenu").Component.CurrentController.Frame
	oFrame.Title = "Menu"	
	ThisDatabaseDocument.CurrentController.ApplicationMainWindow.setVisible(False)
End Sub
Ce formulaire doit aussi gérer la fermeture de la base.
La solution est simple à partir d’un bouton du formulaire.
La macro Quitter ferme le formulaire puis la base de données.
Elle est déclenchée par l’événement Exécuter l’action du bouton Quitter la base.

Code : Tout sélectionner

Sub Quitter
	ThisDatabaseDocument.FormDocuments.getByName("fMenu").Close
	ThisDatabaseDocument.close(True)
End Sub
Cependant si l’utilisateur ferme le formulaire en utilisant la croix de la fenêtre, le formulaire est fermé mais pas la base.

Dans ce fil, Re: [Base] Fermeture de base avec interface cachée spYre donne une solution qui fonctionne en l’adaptant un peu à l’évolution du logiciel.
C’est le rôle de la macro FermetureMenu.
Elle est déclenchée par l'événement Sous-composant fermé dans le menu Outils > Personnaliser de la fenêtre principale.

Code : Tout sélectionner

Sub FermetureMenu(oEv as Object)
Dim database as Object,menu as Object
	database = oEv.source
	menu = database.getFormDocuments.getByName("fMenu")
	If isNull(menu.getComponent() ) Then
		ThisDatabaseDocument.close(True)
	End If
End Sub
Cette solution présente un inconvénient, si plusieurs documents Office sont ouverts, la fermeture du dernier document fermera l’application.Voir Masquer fenêtre pour un éventuel contournement
La seule solution trouvée pour que l’application ne soit pas fermée est d’afficher sa fenêtre par une macro dans le container mes macros et assignée à l’événement Le document va être fermé d’Office.

Code : Tout sélectionner

Sub AfficherMasquee
Dim maFenetre as Object
	If StarDesktop.Frames.getCount() = 2 Then
	For i = 0 to StarDesktop.Frames.getCount() - 1
		maFenetre = StarDesktop.Frames.getByIndex(i)
		If maFenetre.IsHidden = True Then
			maFenetre.getController().ApplicationMainWindow.Visible = True
		End If
	Next i	
	End If	
End Sub
C’est évidemment loin d’être satisfaisant.
MasquerFenêtre.odb
(31.05 Kio) Téléchargé 583 fois
Une autre solution consiste à ne masquer que les éléments de la fenêtre.
Cette solution est inspirée des suprêmes de Pierre-Yves Samyn [Base] Sélectionner les objets (tables, requêtes, etc.) et de Loopingss [Basic] Gestion des barres d'outils personnelles (BOP)
La macro MasquerObjets masque les éléments de la fenêtre principale et permet de masquer les barres d’outils intégrées tout en affichant les barres d’outils personnelles.
Elle ne traite pas les barres d'outils ajoutées par une extension. La seule barre d'outils d'extension que j'ai étant celle de la sauvegarde incrémentée d'Alain de la Chaume ça me convient parfaitement :lol:
Elle permet aussi de masquer ou pas la barre de menu selon que vous ayez ou pas prévu des menus personnalisés.
Elle est assignée à l’événement « Ouvrir le document » dans le menu Outils > Personnaliser

Code : Tout sélectionner

Sub MasquerObjets
Dim oFrame as Object,oElements as Object,oElement as Object,maConnexion as Object
	oFrame = thisDatabaseDocument.currentController.Frame
    oElements = oFrame.LayoutManager.Elements
	For Each oElement In oElements()
		If InStr(oElement.ResourceURL,"Custom") Then
			oFrame.LayoutManager.ShowElement(oElement.ResourceURL)
		ElseIf oElement.ResourceURL = "private:resource/menubar/menubar" Then
			oFrame.LayoutManager.ShowElement(oElement.ResourceURL)
		Else
			oFrame.LayoutManager.HideElement(oElement.ResourceURL)
		End If	
	Next oElement
	oFrame.ComponentWindow.Visible = False
	oFrame.getContainerWindow().IsMaximized = True
	oFrame.Title = "Mon Application"
	ThisDatabaseDocument.CurrentController.connect("","")
	maConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
	ThisDatabaseDocument.FormDocuments.getByName( "fMenu" ).open
End Sub
Pour la gestion des barres de menus par macros voir le suprême d'Alain de la Chaume [Basic] Barre de menus : ajout, suppression
Cette solution permet de ne pas avoir à s’occuper de la gestion de la fenêtre.
les autres macros sont pratiquement les mêmes que dans l'autre base.

La macro toggleToolbars qui masque les barres d’outils et le menu des formulaires est de spYre dans ce fil Re: [Basic] Masquer barres d'outils
Il est possible de l’utiliser dans MasquerObjets, elle peut traiter les barres d’outils des extensions.
Elle est assignée à l’événement Lors du chargement des propriétés du formulaire quand celui-ci est lié à une table, et à l’événement Ouvrir le document dans menu Outils > Personnaliser du formulaire quand il n’est pas lié.

Code : Tout sélectionner

Sub toggleToolbars(nomForm as String)
Dim component
Dim LM as Object, toolbars(), toolbar$, u%
	component = ThisDatabaseDocument.FormDocuments.getByname(nomForm).Component
	toolbars = createUnoService("com.sun.star.ui.WindowStateConfiguration").getByName(component.identifier).getElementNames()
	u = uBound(toolbars)+1
	Redim Preserve toolbars(u)
	toolbars(u) = "private:resource/menubar/menubar"
	LM = component.currentController.frame.layoutManager
	For Each toolbar In toolbars
		LM.hideElement(toolbar)
	Next
End Sub
MasquerObjets.odb
(31.92 Kio) Téléchargé 579 fois
Testé sous AOO 4.1.1 et LibO 4.3
Toutes remarques et/ou corrections seront les bienvenues.
A+
Dernière modification par Piaf le 02 sept. 2017 20:33, modifié 3 fois.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25143
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

Re: [Base] Rendre autonome son application

Message par Dude »

:bravo:
Il serait bien de transférer ces écrits vers le Wiki (page dédiée)
Peut être agrémenter le tuto avec des copies d'écran pour montrer où placer chaque macro.
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 19:07
Localisation : Guyane

Re: [Base] Masquer fenêtre

Message par Piaf »

Bonjour
Suite à ce fil [Résolu]Sortie systématique de base à fermeture d'un rapport
Pour éviter qu'à la fermeture du dernier document affiché, AOO ou LibO se ferme en entraînant la fermeture de l'application.
Une petite modification de la macro AfficheMasquee.

Code : Tout sélectionner

Sub AfficherMasquee
Dim maFenetre as Object
	If StarDesktop.Frames.getCount() = 2 Then
		For i = 0 to StarDesktop.Frames.getCount() - 1
			maFenetre = StarDesktop.Frames.getByIndex(i)
			If maFenetre.IsHidden = True Then
				maFenetre.getController().ApplicationMainWindow.Visible = True
				mafenetre.Frames.getByIndex(0).ContainerWindow.toFront
			End If
		Next i
   End If
End Sub
Rappel : cette procédure doit être dans le container mes macros et assignée à l’événement Le document va être fermé d’Office.
AffMasq.png
Ajouter la procédure suivante

Code : Tout sélectionner

Sub ActiverMenu(oEv as Object)
	oEv.Source.Parent.CurrentController.ApplicationMainWindow.Visible = False
End Sub
a l'événement Activer le document du formulaire Menu.
ActiverMenu.png
L'application devrait rester ouverte, la fenêtre principale masquée.
La base exemple avec l'ajout d'un rapport pour les tests.
A+
Pièces jointes
MasquerFenêtre.odb
(47.87 Kio) Téléchargé 494 fois
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Répondre