|
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 curseur sur 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 envoie ensuite 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]
|
- [prog] Caractère NULL inattendu. Adrien Delcour
- Re: [prog] Caractère NULL inattendu. Bernard Marcelly
- Re: [prog] Caractère NULL inattendu. Alex Thurgood
- [prog] Caractère NULL inattendu. Adrien Delcour
