Errata

Programmation OpenOffice.org – Macros OOoBasic et API

Nous avons pris le plus grand soin à relire le livre plusieurs fois et desirions fournir au lecteur un ouvrage comportant le moins de coquilles possible. Néanmoins, plus que tout autre, nous sommes faillibles et il reste forcément quelques erreurs minimes. Cette section liste page par page les quelques imperfections que nous découvrons au fur et à mesure. N'hésitez pas à nous transmettre les coquilles que vous pourriez trouver. Cherchez bien, il y en a !

Les errata de la version 2 sont signalés en vert.

Page 31

Arguments d'appels de la macro.
Évitez de transmettre en argument de macros une chaîne de caractères comportant des espaces ou guillemets, il faudrait alors multiplier les guillemets à l'appel.
précision
Une chaîne de caractères est transmise telle quelle, sans rajouter de guillemets, sous Windows XP. Sous d'autres versions de MS-Windows il peut être nécessaire de rajouter des guillemets. Il n'est pas possible de transmettre chaîne de caractères comportant un guillemet ou une virgule, et les lettres accentuées sont modifiées.

Page 51

Déclaration Private (encadré)
précision
Depuis la version 1.1.1 la déclaration Private fonctionne, à condition d'exécuter en début de programme l'instruction suivante : CompatibilityMode(true). On peut aussi désactiver ce mode en cours d'exécution : CompatibilityMode(false) mais il n'est pas possible de le tester.

Page 60 – Tableau 5-4

(Opérateur équivalence) True si A vaut True et B vaut False.
lire
(Opérateur équivalence) True si A vaut True et B vaut True.

Page 66

If IsNull(bb) then print "aa est Null"
lire
if IsNull(aa) then print "aa est Null"

Page 70

Le nombre total d'éléments du vecteur ne doit pas dépasser 16 368, et les valeurs extrêmes de l'index sont -32 768 et 32 767.
lire
Les indications sur le nombre total d'éléments du vecteur et les valeurs extrêmes d'index sont inexactes. En réalité il semble que la seule limite soit la mémoire. Nous avons ainsi rempli et vérifié un tableau d'entiers Long dont les index extrêmes étaient -500000 et 500000, soit plus d'un million d'éléments.

Page 126-127 – Tableaux 8-2 et 8-5

Ces tableaux étaient corrects à la mise sous presse. Mais depuis la version 1.1.4 (peut-être 1.1.3) le comportement de MsgBox a été modifié :

Tableau 8-2 Choix de l'ensemble des boutons
ValeurBoutonsFermeture boîte
2Interrompre – Réessayer – IgnorerDésactivée
5Réessayer – AnnulerAnnuler
Tableau 8-5 Résultat renvoyé par MsgBox
ValeurSignification
3Interrompre
5Ignorer

Page 126

Le résultat de la fonction (tableau 8-5) permet de déterminer quel bouton a été actionné. Le tableau indique aussi l'action résultant de la fermeture de la boîte de dialogue (case X dans le coin de la fenêtre).
lire
Le résultat de la fonction (tableau 8-5) permet de déterminer quel bouton a été actionné. Le tableau 8-2 indique aussi l'action résultant de la fermeture de la boîte de dialogue (case X dans le coin de la fenêtre).

Page 129 – Gestion de fichier

FileExist renvoie True...
lire
FileExists renvoie True...

Pages 173-174

Propriété d'une imprimante
lire
La propriété PaperSize est toujours significative. Mais les dimensions de la feuille d'impression ne sont pas en 1/100 de mm mais en twips, contrairement à ce que dit la documentation API.
Un twip represente 1/20 de point qui represente lui même 1/72 de pouce. 1 Pouce représentant environ 25,4 mm, cela amène à 1 twip = 1,76 centième de millimètre.

rem CD-Rom : Code10-01.sxw   bibli : Imprimer Module1
Option Explicit

Sub LirePropImprimante() ' correction : 17/10/2004
Dim monDocument As Object, imprimante As Variant
Dim papVal As Integer, papTaille As Object
Dim liste As String, cr As String
Const twipsParMm = 56.7

cr = chr(13) ' caractère de fin de ligne
monDocument = ThisComponent
imprimante = monDocument.Printer
printProps(imprimante) ' lister les noms de propriété

liste = "Nom : " & getPropVal(imprimante, "Name") & cr & _
  "Occupée : " & getPropVal(imprimante, "IsBusy") & cr & _
  "Orientation de papier modifiable : " & _
    getPropVal(imprimante, "CanSetPaperOrientation") & cr & _
  "Format de papier modifiable : " & _
    getPropVal(imprimante, "CanSetPaperFormat") & cr & _
  "Taille de papier modifiable : " & _
    getPropVal(imprimante, "CanSetPaperSize") & cr

papVal = getPropVal(imprimante, "PaperOrientation")
if papVal = com.sun.star.view.PaperOrientation.PORTRAIT then
  liste = liste & "Orientation Portrait" & cr
else
  liste = liste &  "Orientation Paysage" & cr
  end if

papTaille = getPropVal(imprimante, "PaperSize")
papVal = getPropVal(imprimante, "PaperFormat")
Select Case papVal
Case com.sun.star.view.PaperFormat.A4
  liste = liste & "Format A4"
Case com.sun.star.view.PaperFormat.LETTER
  liste = liste & "Format Letter"
Case com.sun.star.view.PaperFormat.USER
  liste = liste & "Format inconnu : "
Case Else
  liste = liste & "Autre format connu"
end Select
  liste = liste & cr & _
  "Hauteur : " & Format(papTaille.Height/twipsParMm, "0.#") & " mm" & cr & _
  "Largeur : " & Format(papTaille.Width/twipsParMm,  "##0.#") & " mm"
MsgBox(liste, 0, "Capacité de l'imprimante")
End Sub

Page 192

Insérer un saut de page ou de colonne
lire
Dans le cas d'un document vierge ne contenant pas de paragraphe, il est nécessaire d'insérer un saut de paragraphe avant le saut de page pour visualiser le résultat.

Sub InsererSautPage()

Dim Moncurseur as object
Dim MonTexte as object
Dim saut as integer
Mondocument = ThisComponent
MonTexte = Mondocument.Text
MonCurseur = MonTexte.createTextCursor
MonTexte.insertString(Moncurseur, "Ceci est un test ", False)
MonCurseur.gotoNextParagraph(False)
er
saut = com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK
monTexte.insertControlCharacter(MonCurseur,saut, false)

'Insère le saut de page
saut = com.sun.star.style.BreakType.PAGE_BEFORE
MonCurseur.BreakType = saut
MonTexte.insertString(MonCurseur, "de saut de page", false)

end sub

Page 223

Bordures de tableau - Tableau 11-18
précision
Signification des Is...LineValid
  - en lecture, true indique que toutes les lignes de ce type ont les mêmes valeurs
  - en écriture, true indique que les lignes de ce types doivent être modifiées
exemple : supprimer tout le quadrillage d'un tableau, quelles que soient les valeurs actuelles :

oDoc = ThisComponent
oTable = odoc.getTextTables().GetByIndex(0)
oBorders = oTable.TableBorder
noBorder = oBorders.TopLine
noBorder.OuterLineWidth = 0
oBorders.TopLine = noBorder
oBorders.BottomLine = noBorder
oBorders.LeftLine = noBorderer
oBorders.RightLine = noBorder
oBorders.HorizontalLine = noBorder
oBorders.VerticalLine = noBorder
oBorders.IsTopLineValid = true
oBorders.IsBottomLineValid = true
oBorders.IsLeftLineValid = true
oBorders.IsRightLineValid = true
oBorders.IsHorizontalLineValid = true
oBorders.IsVerticalLineValid = true
oTable.TableBorder = oBorders

Page 259

Il existe une bogue concernant les styles de caracterères qui plante OpenOffice.org si on modifie la propriété ParentStyle avant l'insertion du nouveau style dans sa famille.
Nous avons modifié l'ordre des instructions de l'exemple page 259 afin qu'il puisse aussi fonctionner avec des styles de caractères.

rem CD-Rom : Code11-07.sxw   bibli : ModifStyles Module3
Option Explicit

Sub HeriterStyle()
Dim monDocument As Object
Dim lesFamilles As Object, uneFamille As Object
Dim nouvStyle As Object
monDocument = ThisComponent
lesFamilles = monDocument.StyleFamilies
uneFamille = lesFamilles.getByName("ParagraphStyles")
nouvStyle = monDocument.CreateInstance(_
                        "com.sun.star.style.ParagraphStyle")
uneFamille.insertByName ("Signature colorée", nouvStyle)
nouvStyle.ParentStyle = "Signature" ' hériter d'un style
nouvStyle.CharColor = RGB(0,100,255) ' changer la couleur
End Sub

Page 325-328

Ces pages peuvent être manquantes dans quelques rares exemplaires.
Eyrolles remplace le livre sur simple envoi de l'exemplaire incomplet. L'adresse se trouve en page IV du livre, juste avant l'avant propos.
Nous mettons ici à disposition le fichier PDF contenant ces pages.

Page 336 ou Page 375   —   Code12-06.sxc

Pour la ligne .ShowObjects = MsgBox("ShowObjects ?", 4) = 6
Avec une réponse "Oui", les images les objets disparaissent au lieu d'apparaître.

Le tableau 12-19 décrit incorrectement ShowObjects, ShowCharts, ShowDrawing.

Tableau 12-19
ShowObjectsShowChartsShowDrawing
IntegerIntegerInteger
0 : afficher
1 : cacher
2 : substituer
0 : afficher
1 : cacher
2 : substituer
0 : afficher
1 : cacher
2 : substituer

Le service concerné est com.sun.star.sheet.SpreadsheetViewWsettings. Mais l'IDL se contente de dire que les propriétés ShowObjects, ShowCharts, ShowDrawing, sont des entiers (short), et non des booléens comme implémenté par la double égalité, et ne précise pas les valeurs. L'IDL renvoie au Developer's Guide 8.5.3 qui indique : 0 = show, 1 = hide et 2 = placeholder display.
Il faut donc développer un peu la ligne avec :

reponse = MsgBox("ShowObjects ?", 4) if reponse = 6 then .ShowObjects = 0 'show #texte .errat2:before {content:url(../images/errat2.png);} else .ShowObjects = 1 'hide endif

Remarque : on pourrait utiliser (reponse = 6) mais cette écriture n'est pas très claire à la relecture.

Page 460

Accéder aux bibliothèques de dialogues
lire
Dans l'exemple PremierDialogue il n'est pas nécessaire de charger la bibliothèque dialogue parce que la macro est lancée depuis l'EDI. Dans ce cas, la bibliothèque des macros et la bibliothèque soeur des dialogues sont chargées par OOo à l'ouverture de l'EDI. Il en est de même si on lance la macro directement par le menu Outils > Macros, qui charge aussi la bibliothèque.
Par contre, si on ouvre le document mais pas l'EDI, les bibliothèques ne sont pas encore chargées. Si la macro est lancée par un bouton, OOo charge bien la bibliothèque de macros mais pas la bibliothèque des dialogues. Il faut alors la charger par programmation.

Page 564

L'argument tableau Args() de la méthode permet de gérer le synchronisme du processus.
lire
L'argument tableau MyProps() de la méthode permet de gérer le synchronisme du processus.