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]

Répondre à