Macros

From The Document Foundation Wiki
Jump to: navigation, search

Comment ouvrir un document dans son application par défaut ?

On gére des Url [1]et on souhaite ouvrir les objets correspondants (documents, dossier, page Web, etc.) dans leur application par défaut (LibreOffice, lecteur PDF, explorateur, navigateur, etc.).


Depuis un formulaire

Les contrôles Bouton disposent d'une propriété Action que l'on peut définir à Ouvrir la page web. Si l'interface de l'application utilise un formulaire on peut :

  • inclure un tel bouton,
  • définir sa propriété Action à Ouvrir la page web,
  • et "récupérer" l'Url à ouvrir dans un autre contrôle, une zone de texte par exemple comme ci-dessous :
copie d'écran formulaire
Ouverture du document dans son application (ici page Web)

Dans ce formulaire le contrôle zone de texte affichant l'Url est nommé txtUrl. Il suffit d'associer à l'événement Accepter l'action du bouton une procédure du type :

Sub LibOModifierBtn(LibOEvent)

with LibOEvent.Source.Model
        .TargetURL = convertToUrl(.Parent.getByName("txtUrl").Text)
end with

End Sub
  • L'événement LibOEvent, passé lors de l'exécution, permet de "remonter" à l'élément parent (le formulaire) et ainsi d'accéder à la propriété Text du contrôle zone de texte txtUrl.
  • La fonction convertToUrl convertit le texte au format Url
  • Le résultat est assigné comme cible (TargetURL) à l'action Ouvrir la page web du bouton.

Hors formulaire

Si l'ouverture du document n'est pas déclenchée par un bouton, on peut utiliser le service SystemShellExecute[2] qui attend trois paramètres :

  • Command : la commande à exécuter (l'Url par exemple)
  • Parameter : paramètre(s) facultatif(s) utilisé(s) par la commande
  • Flags : "drapeau" permettant de contrôler l'exécution de la commande, notamment pour éviter d'afficher un message d'erreur dans certains cas.


Exemple d'ouverture d'une page Web :

Sub LibOSystemShellDefaut

dim LibOUrl as string
dim LibOFlags as long
dim LibOService as object

LibOUrl = convertToUrl("http://api.libreoffice.org/common/ref/com/sun/star/system/XSystemShellExecute.html")
LibOFlags = com.sun.star.system.SystemShellExecuteFlags.DEFAULTS

LibOService = CreateUnoService("com.sun.star.system.SystemShellExecute")
LibOService.execute(LibOUrl, "", LibOFlags)

End sub


Exemple de mise en œuvre de la gestion d'erreur :

Sub LibOSystemShellGererErreur

dim LibOUrl as string
dim LibOFlags as long
dim LibOService as object

on error goto LibOSystemShell_Err

LibOUrl = convertToUrl("c:\classeur.ods")

LibOFlags = com.sun.star.system.SystemShellExecuteFlags.NO_SYSTEM_ERROR_MESSAGE

LibOService = CreateUnoService("com.sun.star.system.SystemShellExecute")
LibOService.execute(LibOUrl, "", LibOFlags)

' Autres exemples d'utilisation (Windows)
'LibOService.execute("notepad", "c:\liste.txt", LibOFlags)     '<= Ouvre le fichier dans notepad
'LibOService.execute("c:\", "", LibOFlags)                                     '<= Ouvre l'explorateur sur le dossier indiqué

LibOSystemShell_Exit:
exit sub

LibOSystemShell_Err:
select case err
        case 1
                msgbox "Exécution impossible (Url non valide par exemple)", 16, "Shell"
        case else
                msgbox "Erreur non prévue", 16, "Shell"   
end select               
resume LibOSystemShell_Exit
End sub

Utiliser le "drapeau" NO_SYSTEM_ERROR_MESSAGE empêche le système d'afficher son propre message :

  • Avec le paramètre DEFAULTS Windows, par exemple, afficherait Windows ne trouve pas 'classeur.ods'...
  • Avec le paramètre NO_SYSTEM_ERROR_MESSAGE ce message est inhibé et il est possible de créer sa propre routine de gestion d'erreur.


Notes :

  1. Un URL (Uniform Resource Locators) indique l'adresse d'un document ou d'un serveur sur Internet, sur un réseau ou un disque. La structure générale d'un URL varie selon son type et se présente généralement sous la forme : Service://nom_hôte:Port/Chemin/Page#Marque (parfois, certains éléments ne sont pas nécessaires). Un URL peut être une adresse FTP, une adresse Internet (HTTP), une adresse de fichier ou une adresse e-mail.
  2. Voir la documentation de l'API