[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

[Base] Rendre autonome son application

Messagepar Dude » 07 Jan 2015 11:12

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.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20400
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Re: [Base] Masquer Base par macro

Messagepar Piaf » 08 Jan 2015 18:49

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   AgrandirRéduire
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   AgrandirRéduire
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   AgrandirRéduire
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   AgrandirRéduire
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   AgrandirRéduire
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é 191 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   AgrandirRéduire
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   AgrandirRéduire
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é 200 fois
Testé sous AOO 4.1.1 et LibO 4.3
Toutes remarques et/ou corrections seront les bienvenues.
A+
Dernière édition par Piaf le 02 Sep 2017 19:33, édité 3 fois.
Libre Office Version: 6.0.7 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Avatar de l’utilisateur
Piaf
GourOOu
GourOOu
 
Message(s) : 5508
Inscrit le : 25 Nov 2011 19:07
Localisation : Guyane

Re: [Base] Rendre autonome son application

Messagepar Dude » 14 Jan 2015 16:18

: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.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20400
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Re: [Base] Masquer fenêtre

Messagepar Piaf » 02 Sep 2017 19:29

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   AgrandirRéduire
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   AgrandirRéduire
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é 82 fois
Libre Office Version: 6.0.7 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Avatar de l’utilisateur
Piaf
GourOOu
GourOOu
 
Message(s) : 5508
Inscrit le : 25 Nov 2011 19:07
Localisation : Guyane


Retour vers Enrichissez la documentation

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité