L.O Basic : 3 classes importantes
La plupart des objets LibreOffice Basic que j'utilise, dispose des propriétés de débogage dbg_properties et dbg_methods :
dbg_properties liste toutes les propriétés de l'objet ;
dbg_methods liste toutes les méthodes applicables sur l'objet.
L'image ci-dessus présente, dans deux boites de dialogue (msgBox) les propriétés et méthodes d'un objet de la classe ScTableColumnsObj (les colonnes d'une feuille de calcul) que l'on obtient par une macro-commande semblable à celle-ci :
sub etude()
Dim leClasseur as object
Dim laFeuilleActive as object
Dim lesColonnes as object
leClasseur = thisComponent
laFeuilleActive = leClasseur.currentController.activeSheet
lesColonnes = laFeuilleActive.columns
' affichage des méthodes de l'objet lesColonnes
msgBox lesColonnes.dbg_methods
' affichage des propriétés de l'objet lesColonnes
msgBox lesColonnes.dbg_properties
end sub
Une version compactée (et plus efficace) du code :
sub etude()
Dim crlf as string
Dim lesColonnes as object
crlf = chr(13) + chr(10) ' retour à la ligne
lesColonnes = thisComponent.currentController.activeSheet.columns
with lesColonnes
msgBox .dbg_methods + crlf + .dbg_properties
end with
end sub
La documentation officielle disponible ICI montre quelques exemples d'utilisation des propriétés d'un objet de la classe ScTableColumnsObj et des méthodes insertByIndex et removeByIndex.
La classe " ScTableSheetObj" - les feuilles de calcul
L'objet "laFeuilleActive" déclaré dans la macro-commande décrite ci-dessous est une instance de la classe "ScTableSheetObj". Cette macro affiche dans une boite de dialogue :
le nom de l'objet "laFeuilleActive" grâce à sa propriété "name" ;
la liste de ses propriétés grâce à sa propriété "dbg_properties" ;
NB : en remplaçant dbg_properties par dbg_methods, les méthodes de l'objet ScTableSheetObj seront listées.
sub etude()
Dim laFeuilleActive as object
Dim crlf as string
crlf = chr(13) + chr(10) ' retour à la ligne
laFeuilleActive = thisComponent.currentController.activeSheet
with laFeuilleActive
msgBox "nom de la feuille active : " + .name + crlf + .dbg_properties
end with
end sub
La classe "ScCellObj" - les cellules
Ci-dessous une macro-commande qui affiche le nom (absolu) d'une cellule ainsi que les propriétés et méthodes d'un objet, instance de la classe ScCellObj (une cellule) en utilisant les propriétés absoluteName, dbg_properties et dbg_methods des objets ScCellObj.
Elle utilise la méthode getCellRangeByName de l'objet feuille de calcul ScTableSheetObj (cf $ précédent) instancié par le code "thisComponent.currentController.activeSheet" (la feuille active).
sub etude2()
Dim laCellule as Object
Dim crlf as string
crlf = chr(13) + chr(10)
laCellule = thisComponent.currentController.activeSheet.getCellRangeByName("B1")
with laCellule
msgBox "cellule : " + .absoluteName + crlf +.dbg_properties + crlf + .dbg_method
end with
end sub
La classe "ODatabaseForm" - les formulaires
Dans Libre Office, les formulaires (objet ODatabaseForm) sont organisés en collections (objet OFormsCollection) qui peuvent être liées indifféremment à un classeur (calc) ou à un texte (writer). C'est pourquoi, une entité spéciale, la "couche dessin" (objet ScPageObj) doit être utilisée pour les manipuler.
Une feuille de calcul (objet ScTableSheetObj) dont laFeuilleActive du code ci-après est une instance, dispose de la méthode getDrawPage (cf. : dbg_methods) qui donne accès à cette "couche dessin" par l'instruction "laCoucheDessin = laFeuilleActive.getDrawpage", raccourcie en laCoucheDession = laFeuilleActive.Drawpage
Par la méthode getForms (cf. image ci-joint) de l'objet laCoucheDessin (objet ScPageObj), nous accédons à la collection des formulaires de la feuille de calcul (objet OFormsCollection). C'est le rôle de l'instruction "laCollectiondesFormulaires = laCoucheDessin.getForms", raccourcie en laCollectionDesFormulaire = laCoucheDessin.Forms.
Enfin par la méthode getByName de cette collection, nous accédons au formulaire "monFormulaire" (objet ODatabaseForm) dessiné sur la feuille active avec l'instruction "leFormulaire = laCollectionDesFormulaires. getByName ("monFormulaire)"
La macro-commande ci-dessous, accède au formulaire de la page active pour afficher son nom et ses propriétés.
sub etude()
dim leClasseur as object
dim laFeuilleActive as object
dim laCoucheDessin as object
dim laCollectiondesFormulaires as object
dim leFormulaire as object
dim crlf as string
leClasseur = thisComponent
laFeuilleActive = leClasseur.currentController.activeSheet
rem ---- 1 : instanciation d'un objet ScPageObj
laCoucheDessin = laFeuilleActive.drawpage
rem ---- 2 : instanciation d'un objet OFormsCollection
laCollectiondesFormulaires = laCoucheDessin.Forms
rem ---- 3 : instanciation d'un objet ODataBaseForms
leFormulaire = lesFormulaires.getByName("monFormulaire")
crlf = chr(13) + chr(10)
with leFormulaire
msgBox "nom du formulaire : " + .name + crlf + .dbg_properties
end with
end sub
La version condensée du code :
dim leFormulaire as object
dil crlf as string
crlf = chr(13) + chr(10)
leFormulaire = thisComponent.currentController.activeSheet.Drawpage.Forms.getByName ("monFormulaire")
with leFormulaire
msgBox "nom du formulaire : " + .name + crlf + .dbg_properties
end with
l
qui évite la multiplication des déclarations, allège le code et améliore les performances.
Nous aurions utilisé la méthode getByIndex au lieu de getByName si le nom du formulaire n'était pas connu.
NB : Attention les noms des objets sont sensibles à la casse.
L'image ci-dessous montre, pour une feuille de calcul en mode édition, le formulaire (ici nommé "monFormulaire") de la feuille. Il est visible par un clic droit sur un des boutons du formulaire. L'image montre aussi la boite de dialogue produite par la macro-commande ci-dessus.
La propriété "count" (encadrée dans l'image ci-dessus) d'un formulaire (objet ODatabaseForms) rend le nombre d'éléments composant le formulaire (bouton, case à cocher, zone de texte..). En association avec la méthode getByIndex (disponible également sur ces objets), nous accédons par exemple aux boutons de contrôle du formulaire comme le montre la macro-commande dont le code figure ci-dessous :
sub etude()
Dim leFormulaire as Object
Dim btn as object
Dim msg as string
Dim etat as string
Dim crlf as string
Dim i as integer
crlf = chr(13) + chr(10)
leFormulaire = thisComponent.currentController.activeSheet.Drawpage.Forms.getByName ("monFormulaire")
msg =""
with leFormulaire
for i = 1 to .count
etat =" : etat "
if .getByIndex(i-1).enabled then
etat = etat + "actif"
else
etat = etat + "désactivé"
end if
msg = msg + " bouton n° " + i + etat +" ; nom : " + .getByIndex(i-1).name + " ; label : " + .getByIndex(i-1).label + chr(13) + chr(10)
next i
end with
msgBox msg
end sub
L'image ci-dessus illustre l'exécution de cette macro-commande sur une feuille de calcul contenant un formulaire avec 4 boutons de contrôle.
Une instruction telle que btn0 = leFormulaire.getByIndex(0) permet d'accéder aux propriétés et aux méthodes du 1er contrôle du formulaire. Par exemple :
btn0.enabled (encadré 1 de l'image ci-contre) rend true si le contrôle est actif, false sinon ;
btn0.name (encadré 2) rend le nom du contrôle ;
btn0.label (encadré 3) rend le label du contrôle.