Bonsoir.
Comme je l'ai déjà dit, j'apprends les macros
d'OpenOffice Writer sous Windows et
(je ne sais pas si c'est une particularité de
Windows) les marques de paragraphe
y comptent pour un caractère dans les
déplacements de curseur mais pour deux
dans les chaînes couvertes par ces
curseurs.
La macro qui suit ouvre un nouveau document vierge
et y insère 2048 lignes identiques,
chaque ligne étant formée des quinze
premières lignes minuscules (a à o) et d'une
marque de paragraphe.
Cela fait donc 2048 x 16 = 32768 caractères, en
comptant une marque de paragraphe
pour un caractère.
Ensuite, la macro étend un curseursur 32767
positions à partir du début du texte.
(Une marque de paragraphe correspond à une
position.)
La macro envoie alors un MsgBox indiquant le Asc du
dernier caractère (Right(..., 1) ) de la chaîne
couverte par ce curseur (propriété String du
curseur).
Résultat inattendu : ce Asc est zéro.
La macro envoieensuite un MsgBox indiquant la
longueur (Len) de la chaîne en question.
Puisqu'il y a 2047 marques de paragraphe dans la
zone couverte par le curseur
et que les marques de paragraphe comptent
double, on s'attendrait à ce que cette
longueur soit 32767 + 2047 = 34814, mais
le message indique 34815.
(On dirait donc que le caractère NULL est en
sus.)
Quelqu'un peut-il m'expliquer ces deux résultats
?
Merci d'avance.
A.
[code]
Sub DebugUnicodeString
Dim monDocument As Object Dim
CurseurVisible As Object Dim i As Long Dim carSpecial As
Integer Dim ourText As Object Dim auxCursor As
Object Dim ourString As String Dim propFich()
monDocument =
StarDesktop.LoadComponentFromURL("private:factory/swriter", "_blank", 0,
propFich)' Je suppose que monDocument est maintenant identique à
ThisComponent. CurseurVisible =
ThisComponent.CurrentController.getViewCursor() ourText =
CurseurVisible.getText() ' Je suppose que ourText = monDocument.getText()
reviendrait au même.
carSpecial =
com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK For i = 1 To
2048 ourText.insertString(CurseurVisible,
"abcdefghijklmno", False)
ourText.insertControlCharacter(CurseurVisible, carSpecial, False) Next
' Le document comporte donc 2048 X 16 = 32768
caractères,' en comptant une marque de paragraphe pour un seul
caractère.
auxCursor = ourText.createTextCursor() ' Est
au début du texte. auxCursor.goRight(32767, True) ' La
ligne qui suit sert à vérifier que auxCursor s'arrête juste avant le dernier
caractère' (marque de paragraphe) inséré par la macro.
CurseurVisible.goToRange(auxCursor.getEnd(), False)' OK.
' Même s'il arrive qu'une différence d'une seule position corresponde' à
deux caractères de chaîne (Chr(13) Chr(10)), 32767 positions font au
plus' 65534 caractères de chaîne, donc auxCursor.getString() ne pose pas
de' problèmes.
ourString = auxCursor.getString()
'' MsgBox "Le dernier caractère de ourString,
donné par Right(..., 1) a pour Asc : " Asc(Right(ourString, 1))' Avec
un document formé de 2024 lignes dont chacune est formée des 15 lettres
minuscules allant de a à o' et d'une marque de paragraphe, le MsgBox qui
précède affiche que le Asc est 0. ???
MsgBox "La longueur de ourString est "
Len(ourString)' Avec un document formé de 2024 lignes dont chacune est
formée des 15 lettres minuscules allant de a à o' et d'une marque de
paragraphe, le MsgBox qui précède affiche 34815 (il me semble que cela devrait
être' 34814).
End Sub
[/code]