1 message in org.openoffice.fr.progZone itérative dans un document (suite)
FromSent OnAttachments
Philippe AllartNov 21, 2006 7:18 am 
Actions with this message:
Paste this link in email or IM:
Paste this link in email or IM:
Atom feed for this thread
Paste this URL into your reader:
Subject:Zone itérative dans un document (suite)Actions...
From:Philippe Allart (pall@cudl-lille.fr)
Date:Nov 21, 2006 7:18:02 am
List:org.openoffice.fr.prog

Bonjour,

Pour faire suite à mon message précédent, voici une méthode qui marche... presque. Je me suis permis de coller les sources dans le message, parce que ça ne me parait pas très volumineux, et je voudrais la soumettre aux experts parce que je me pose des questions sur les spécifications.

L'utilisation est simple: ouvrez un document et où vous voulez dans le texte, créez un paragraphe dans le style "Boucle" et insérez-y une variable utilisateur numérique nommée "N".

Lancez la macro "TestAffectationMultiLignes". le paragraphe est dupliqué 10 fois, avec une valeur différente de N dans chaque occurence. Seul le dernier paragraphe contient réellement la variable, avec sa dernière valeur.

Je me pose les questions suivantes: - le curseur curseurCopier est initialisé une fois pour toute en début de traitement et sélectionne le paragraphe contenant la variable. Cependant du texte est inséré devant ce paragraphe à chaque itération. Tout se passe bien. C'est-à-dire que les pointeurs sont mis à jours dynamiquement. Est-ce conforme aux spécifications? - à chaque itération la variable utilisateur est modifiée, et le contenu de la pseudo variable curseurCopier.String est modifoé en conséquence de manière transparente. Est-ce que cette fonctionalité sera également maintenue? - Enfin, j'ai un problème: si le paragraphe commence pâr une puce ou une numérotation automatique, celle-ci est présente dans la pseudo variable String, si bien que les paragraphes insérés commencent avec deux puces ou deux fois le numéro. Comment éviter celà?

Merci d'avance pour vos réponses,

Ph.

--

'# '# Modifier la valeur d'une VariableNumerique '# '# Sub ChangerVariableNumerique(laVariableNumerique As String, leNombre As Double) Dim monDocument As Object, lesFieldmasters As Object Dim leMaster As Object

monDocument = ThisComponent lesFieldmasters = monDocument.getTextFieldMasters()

leNom="com.sun.star.text.FieldMaster.User." & laVariableNumerique

if lesFieldmasters.hasByName(leNom) then leMaster = lesFieldmasters.getByName(leNom) leMaster.Value = leNombre end if

End Sub

'# '# Sélection d'un paragraphe dans un style donné '#

Function CurseurSurProchainParagrapheStyle(ByVal oCurseur as Object, leStyle as String) as Boolean

CurseurSurProchainParagrapheStyle = false if not oCurseur.isStartOfParagraph then if not oCurseur.gotoNextParagraph(false) then return end if end if

Do if oCurseur.ParaStyleName = leStyle then oCurseur.gotoStartOfParagraph(false) oCurseur.gotoEndOfParagraph(true) CurseurSurProchainParagrapheStyle = true else if not oCurseur.gotoNextParagraph(false) then 'le dernier paragraphe a été atteint exit function end if end if Loop While not CurseurSurProchainParagrapheStyle End Function

'# '# test d'une affectation multilignes '#

sub TestAffectationMultiLignes

Dim curseurCopier as Object ' curseur de lecture Dim curseurColler as Object ' curseur d'écriture Dim monDocument As Object, monTexte as Object dim leStyle as String dim nb_fois as Long dim Saut as Integer dim contenu as String dim ii as long

Paragraphe = com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK

leStyle = "Boucle" nb_fois = 10

monTexte = thisComponent.Text CurseurCopier = monTexte.CreateTextCursor

' Recherche du paragraphe de référence

if CurseurSurProchainParagrapheStyle(CurseurCopier, leStyle) then ' On place le curseur d'écriture devant le paragraphe de référence curseurColler = monTexte.CreateTextCursorByRange(curseurCopier.Start) ' On change la valeur du champ utilisateur ii = 1 ChangerVariableNumerique("N", ii) do While ii < nb_fois ' On récupère le nouveau contenu contenu = curseurCopier.String ' On insère le contenu devant le paragraphe de référence, et ' on marque la fin du nouveau paragraphe monTexte.InsertString(curseurColler, contenu, false) monTexte.insertControlCharacter(curseurColler, Paragraphe, false) ii = ii+1 ChangerVariableNumerique("N", ii) Loop end if end sub