<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.openoffice.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rackamlerouge</id>
	<title>Apache OpenOffice Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.openoffice.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rackamlerouge"/>
	<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/wiki/Special:Contributions/Rackamlerouge"/>
	<updated>2026-05-16T10:09:31Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=194580</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=194580"/>
		<updated>2011-03-01T21:47:33Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;L&amp;#039;enregistreur de macro OpenOffice.org et les instructions UNO&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org fournit un enregistreur, pour enregistrer une série d&amp;#039;actions, dans &amp;#039;&amp;#039;&amp;#039;Writer et Calc seulement&amp;#039;&amp;#039;&amp;#039;. Il permet de produire du code. L&amp;#039;enregistreur écrit une série d&amp;#039;instructions utilisant les objets UNO (Universal Network Objects, objets réseau universels), qui ne sont pas particulièrement pratique pour apprendre le modèle API d&amp;#039;OpenOffice.org. Le code produit est un peu dur à suivre. Il est généralement préférable d&amp;#039;utiliser les appels API d&amp;#039;OpenOffice.org mais parfois les appels UNO reste la seule la méthode (ou la plus facile) pour trouver les routines dont on a besoin.&lt;br /&gt;
&lt;br /&gt;
Pour avoir une liste des instructions possibles, voir : &lt;br /&gt;
http://wiki.services.openoffice.org/wiki/Framework/Article/OpenOffice.org_2.x_Commands&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, trois versions de la même macro : &lt;br /&gt;
&lt;br /&gt;
*L&amp;#039;exemple produit par l&amp;#039;enregistreur&lt;br /&gt;
*Ré-arrangement des appels UNO (Universal Network Objects, objets réseau universels)&lt;br /&gt;
*Macro avec les appels API (Application programming interface, interface de programmation applicative)&lt;br /&gt;
&lt;br /&gt;
La séquence des opérations enregistrées sont : &lt;br /&gt;
&lt;br /&gt;
Taper &amp;quot;Du texte&amp;quot;; Appuyer &amp;#039;&amp;#039;&amp;#039;Entrée&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;Un nouveau paragraphe avec un &amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Gras &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;mot&amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Normal &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot; en gras à l&amp;#039;intérieur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Remarque:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|Cela pouvait être mieux fait autrement, mais cet exemple simple sert à illustrer le point que nous traitons.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemple sortie de l&amp;#039;enregisteur Ooo==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem define variables&lt;br /&gt;
    dim document   as object&lt;br /&gt;
    dim dispatcher as object&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem get access to the document&lt;br /&gt;
    document   = ThisComponent.CurrentController.Frame&lt;br /&gt;
    dispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args1(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args1(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args1(0).Value = &amp;quot;Du texte&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args1())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertPara&amp;quot;, &amp;quot;&amp;quot;, 0, Array())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args3(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args3(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args3(0).Value = &amp;quot;Un nouveau paragraph avec un &amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args3())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args4(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args4(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args4(0).Value = true&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args4())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args5(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args5(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args5(0).Value = &amp;quot;mot&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args5())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args6(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args6(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args6(0).Value = false&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args6())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args7(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args7(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args7(0).Value = &amp;quot; en gras à l&amp;#039;intéreur.&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args7())&lt;br /&gt;
     &lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ré-arrangement des instructions UNO==&lt;br /&gt;
(Cette entête est liées à [[UNO Dispatch]], par conséquent si vous la modifier, changer aussi le lien.)&lt;br /&gt;
&lt;br /&gt;
Maintenant le même exemple ré-arrangé en utilisant une fonction pour appeler les objets UNO (certains objets UNO retournent une valeur, par conséquent il est préférable d&amp;#039;utiliser une fonction pour avoir aussi ce retour. L&amp;#039;utilisation d&amp;#039;une procédure (sub) ferait perdre la totale compatibilité des deux méthodes.) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Du texte&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertPara&amp;quot;)&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Un nouveau paragraphe avec un &amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,true))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;mot&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,false))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot; en gras à l&amp;#039;intérieur.&amp;quot;))&lt;br /&gt;
    end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    function fnDispatch(sCommand as string, optional mArgs)&lt;br /&gt;
        oFrame = ThisComponent.getCurrentController.getFrame&lt;br /&gt;
        oDispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
        &amp;#039;on error resume next&lt;br /&gt;
        if isMissing(mArgs) then&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, array())&lt;br /&gt;
        else&lt;br /&gt;
            nArgs = uBound(mArgs) \ 2&lt;br /&gt;
            dim Args(nArgs) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
            for i = 0 to nArgs&lt;br /&gt;
                Args(i).name = mArgs(i * 2)&lt;br /&gt;
                Args(i).value = mArgs(i * 2 + 1)&lt;br /&gt;
            next&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, Args())&lt;br /&gt;
        end if&lt;br /&gt;
    end function&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Macro avec les appels API==&lt;br /&gt;
Finalement le même exemple en utilisant les appels API : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
        oText = oVC.text&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Du texte&amp;quot;, False)&lt;br /&gt;
        oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Un nouveau paragraphe avec un &amp;quot;, False)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.BOLD)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;mot&amp;quot;, false)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.NORMAL)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot; en gras a l&amp;#039;intérieur.&amp;quot;, false)&lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Traduction à partir de :&lt;br /&gt;
http://wiki.services.openoffice.org/wiki/The_OpenOffice.org_recorder_and_UNO_dispatch_calls&lt;br /&gt;
&lt;br /&gt;
[[Category: FR/Documentation]]&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=159983</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=159983"/>
		<updated>2010-03-23T23:23:15Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;L&amp;#039;enregistreur de macro OpenOffice.org et les instructions UNO&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org fournit un enregistreur, pour enregistrer une série d&amp;#039;actions, dans &amp;#039;&amp;#039;&amp;#039;Writer et Calc seulement&amp;#039;&amp;#039;&amp;#039;. Il permet de produire du code. L&amp;#039;enregistreur écrit une série d&amp;#039;instructions utilisant les objets UNO (Universal Network Objects, objets réseau universels), qui ne sont pas particulièrement pratique pour apprendre le modèle API d&amp;#039;OpenOffice.org. Le code produit est un peu dur à suivre. Il est généralement préférable d&amp;#039;utiliser les appels API d&amp;#039;OpenOffice.org mais parfois les appels UNO reste la seule la méthode (ou la plus facile) pour trouver les routines dont on a besoin.&lt;br /&gt;
&lt;br /&gt;
Pour avoir une liste des instructions possibles, voir : http://www.openoffice.org/files/documents/25/2570/commandsReference.html&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, trois versions de la même macro : &lt;br /&gt;
&lt;br /&gt;
*L&amp;#039;exemple produit par l&amp;#039;enregistreur&lt;br /&gt;
*Ré-arrangement des appels UNO (Universal Network Objects, objets réseau universels)&lt;br /&gt;
*Macro avec les appels API (Application programming interface, interface de programmation applicative)&lt;br /&gt;
&lt;br /&gt;
La séquence des opérations enregistrées sont : &lt;br /&gt;
&lt;br /&gt;
Taper &amp;quot;Du texte&amp;quot;; Appuyer &amp;#039;&amp;#039;&amp;#039;Entrée&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;Un nouveau paragraphe avec un &amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Gras &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;mot&amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Normal &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot; en gras à l&amp;#039;intérieur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Remarque:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|Cela pouvait être mieux fait autrement, mais cet exemple simple sert à illustrer le point que nous traitons.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemple sortie de l&amp;#039;enregisteur Ooo==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem define variables&lt;br /&gt;
    dim document   as object&lt;br /&gt;
    dim dispatcher as object&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem get access to the document&lt;br /&gt;
    document   = ThisComponent.CurrentController.Frame&lt;br /&gt;
    dispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args1(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args1(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args1(0).Value = &amp;quot;Du texte&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args1())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertPara&amp;quot;, &amp;quot;&amp;quot;, 0, Array())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args3(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args3(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args3(0).Value = &amp;quot;Un nouveau paragraph avec un &amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args3())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args4(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args4(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args4(0).Value = true&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args4())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args5(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args5(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args5(0).Value = &amp;quot;mot&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args5())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args6(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args6(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args6(0).Value = false&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args6())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args7(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args7(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args7(0).Value = &amp;quot; en gras à l&amp;#039;intéreur.&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args7())&lt;br /&gt;
     &lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ré-arrangement des instructions UNO==&lt;br /&gt;
(Cette entête est liées à [[UNO Dispatch]], par conséquent si vous la modifier, changer aussi le lien.)&lt;br /&gt;
&lt;br /&gt;
Maintenant le même exemple ré-arrangé en utilisant une fonction pour appeler les objets UNO (certains objets UNO retournent une valeur, par conséquent il est préférable d&amp;#039;utiliser une fonction pour avoir aussi ce retour. L&amp;#039;utilisation d&amp;#039;une procédure (sub) ferait perdre la totale compatibilité des deux méthodes.) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Du texte&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertPara&amp;quot;)&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Un nouveau paragraphe avec un &amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,true))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;mot&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,false))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot; en gras à l&amp;#039;intérieur.&amp;quot;))&lt;br /&gt;
    end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    function fnDispatch(sCommand as string, optional mArgs)&lt;br /&gt;
        oFrame = ThisComponent.getCurrentController.getFrame&lt;br /&gt;
        oDispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
        &amp;#039;on error resume next&lt;br /&gt;
        if isMissing(mArgs) then&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, array())&lt;br /&gt;
        else&lt;br /&gt;
            nArgs = uBound(mArgs) \ 2&lt;br /&gt;
            dim Args(nArgs) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
            for i = 0 to nArgs&lt;br /&gt;
                Args(i).name = mArgs(i * 2)&lt;br /&gt;
                Args(i).value = mArgs(i * 2 + 1)&lt;br /&gt;
            next&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, Args())&lt;br /&gt;
        end if&lt;br /&gt;
    end function&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Macro avec les appels API==&lt;br /&gt;
Finalement le même exemple en utilisant les appels API : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
        oText = oVC.text&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Du texte&amp;quot;, False)&lt;br /&gt;
        oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Un nouveau paragraphe avec un &amp;quot;, False)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.BOLD)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;mot&amp;quot;, false)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.NORMAL)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot; en gras a l&amp;#039;intérieur.&amp;quot;, false)&lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Traduction à partir de :&lt;br /&gt;
http://wiki.services.openoffice.org/wiki/The_OpenOffice.org_recorder_and_UNO_dispatch_calls&lt;br /&gt;
&lt;br /&gt;
[[Category: FR/Documentation]]&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=159982</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=159982"/>
		<updated>2010-03-23T23:11:04Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;L&amp;#039;enregistreur de macro OpenOffice.org et les instructions UNO&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org fournit un enregistreur, pour enregistrer une série d&amp;#039;actions, dans &amp;#039;&amp;#039;&amp;#039;Writer et Calc seulement&amp;#039;&amp;#039;&amp;#039;. Il permet de produire du code. L&amp;#039;enregistreur écrit une série d&amp;#039;instructions utilisant les objets UNO (Universal Network Objects, objets réseau universels), qui ne sont pas particulièrement pratique pour apprendre le modèle API d&amp;#039;OpenOffice.org. Je trouve personnellement que le code produit est un peu dur à suivre. Il est généralement préférable d&amp;#039;utiliser les appels API d&amp;#039;OpenOffice.org mais parfois les appels UNO reste la seule la méthode (ou la plus facile) pour trouver les routines dont on a besoin.&lt;br /&gt;
&lt;br /&gt;
Pour une liste des appels du dispatcheur, voir: http://www.openoffice.org/files/documents/25/2570/commandsReference.html&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, trois versions de la même macro: &lt;br /&gt;
&lt;br /&gt;
*L&amp;#039;exemple produit par l&amp;#039;enregistreur&lt;br /&gt;
*Ré-arrangement des appels UNO&lt;br /&gt;
*Macro avec les appels API&lt;br /&gt;
&lt;br /&gt;
La séquence des opérations enregistrées sont: &lt;br /&gt;
&lt;br /&gt;
Taper &amp;quot;Du texte&amp;quot;; Appuyer &amp;#039;&amp;#039;&amp;#039;Entrée&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;Un nouveau paragraphe avec un &amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Gras &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;mot&amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Normal &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot; en gras à l&amp;#039;intérieur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Remarque:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|Cela pouvait être mieux fait autrement, mais cet exemple simple sert à illustrer le point que nous traitons.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemple sortie de l&amp;#039;enregisteur Ooo==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem define variables&lt;br /&gt;
    dim document   as object&lt;br /&gt;
    dim dispatcher as object&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem get access to the document&lt;br /&gt;
    document   = ThisComponent.CurrentController.Frame&lt;br /&gt;
    dispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args1(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args1(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args1(0).Value = &amp;quot;Du texte&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args1())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertPara&amp;quot;, &amp;quot;&amp;quot;, 0, Array())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args3(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args3(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args3(0).Value = &amp;quot;Un nouveau paragraph avec un &amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args3())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args4(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args4(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args4(0).Value = true&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args4())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args5(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args5(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args5(0).Value = &amp;quot;mot&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args5())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args6(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args6(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args6(0).Value = false&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args6())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args7(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args7(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args7(0).Value = &amp;quot; en gras à l&amp;#039;intéreur.&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args7())&lt;br /&gt;
     &lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ré-arrangement des appels UNO (dispatcheur)==&lt;br /&gt;
(Cette entête est liées à [[UNO Dispatch]], par conséquent si vous la modifier, changer aussi le lien.)&lt;br /&gt;
&lt;br /&gt;
Maintenant le même exemple ré-arrangé en utilisant une fonction pour appeler les objets UNO (certains objets UNO retournent une valeur, par conséquent il est préférable d&amp;#039;utiliser une fonction pour avoir aussi ce retour. L&amp;#039;utilisation d&amp;#039;une procédure (sub) ferait perdre la totale compatibilité des deux méthodes.) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Du texte&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertPara&amp;quot;)&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Un nouveau paragraphe avec un &amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,true))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;mot&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,false))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot; en gras à l&amp;#039;intérieur.&amp;quot;))&lt;br /&gt;
    end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    function fnDispatch(sCommand as string, optional mArgs)&lt;br /&gt;
        oFrame = ThisComponent.getCurrentController.getFrame&lt;br /&gt;
        oDispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
        &amp;#039;on error resume next&lt;br /&gt;
        if isMissing(mArgs) then&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, array())&lt;br /&gt;
        else&lt;br /&gt;
            nArgs = uBound(mArgs) \ 2&lt;br /&gt;
            dim Args(nArgs) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
            for i = 0 to nArgs&lt;br /&gt;
                Args(i).name = mArgs(i * 2)&lt;br /&gt;
                Args(i).value = mArgs(i * 2 + 1)&lt;br /&gt;
            next&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, Args())&lt;br /&gt;
        end if&lt;br /&gt;
    end function&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Macro avec les appels API==&lt;br /&gt;
Finalement le même exemple en utilisant les appels API : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
        oText = oVC.text&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Du texte&amp;quot;, False)&lt;br /&gt;
        oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Un nouveau paragraphe avec un &amp;quot;, False)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.BOLD)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;mot&amp;quot;, false)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.NORMAL)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot; en gras a l&amp;#039;intérieur.&amp;quot;, false)&lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Traduction à partir de :&lt;br /&gt;
http://wiki.services.openoffice.org/wiki/The_OpenOffice.org_recorder_and_UNO_dispatch_calls&lt;br /&gt;
&lt;br /&gt;
[[Category: FR/Documentation]]&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=Extensions_development_basic_fr&amp;diff=132825</id>
		<title>Extensions development basic fr</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=Extensions_development_basic_fr&amp;diff=132825"/>
		<updated>2009-06-23T15:41:38Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: /* Utilisation de l&amp;#039;enregistreur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Comment démarrer&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Cette page est un guide de démarrage qui vous permettra d&amp;#039;écrire des macros en OpenOffice.org Basic. Une connaissance préalable de la programmation est indispensable. Merci d&amp;#039;éditer cette page pour la rendre plus lisible. J&amp;#039;espère que vous la trouverez utile.&lt;br /&gt;
&lt;br /&gt;
Si vous maîtrisez les bases, alors vous pouvez consulter le [[CookBook]] qui donne des exemples et fournit des guides complémentaires.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Où le code est-il enregistré ?=&lt;br /&gt;
Le code OpenOffice.org Basic est enregistré dans des modules eux-mêmes placés dans les bibliothèques. Une bibliothèque peut être : &lt;br /&gt;
&lt;br /&gt;
*Partagée (pour une installation en réseau - OOo Macros &amp;amp; Dialogues) &lt;br /&gt;
*Uniquement pour l&amp;#039;utilisateur courant (Mes Macros &amp;amp; Dialogues) &lt;br /&gt;
*Incorporée à un document ou à un modèle de manière que son code ne soit disponible que lorsque ce document est ouvert.&lt;br /&gt;
&lt;br /&gt;
Lorsque des bibliothèques ne sont stockées ni dans un document ni dans un modèle, c&amp;#039;est-à-dire lorsque les bibliothèques sont partagées ou pour l&amp;#039;utilisateur courant, on les appelle &amp;#039;&amp;#039;&amp;#039;Bibliothèques OpenOffice.org&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Pour connaître les dossiers qui contiennent les bibliothèques OpenOffice.org voir :&amp;lt;br&amp;gt; &amp;#039;&amp;#039;&amp;#039;Outils &amp;gt; Options… &amp;gt; OpenOffice.org &amp;gt; Chemins &amp;gt; BASIC&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
[NdT : depuis la version 2.0.3, ces chemins ne sont plus affichés dans l&amp;#039;interface de OOo]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Note&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|Ne copiez pas ni ne déplacez les bibliothèques en utilisant les commandes du système d&amp;#039;exploitation. Préférez le gestionnaire de macros ou le gestionnaire de packages.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La taille autorisée pour les modules placés à l&amp;#039;intérieur des bibliothèques est limitée à 64 Ko. Une bilbiothèque peut contenir jusqu&amp;#039;à 16.000 modules. &lt;br /&gt;
&lt;br /&gt;
Pour plus d&amp;#039;information, reportez-vous à l&amp;#039;aide en ligne, rubriques : &amp;quot;Bibliothèques;organisation&amp;quot; et &amp;quot;Modules;sous-routines et fonctions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=Accéder à l&amp;#039;IDE=&lt;br /&gt;
Pour accéder à l&amp;#039;IDE (environnement de développement intégré) pour la première fois : &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org 1.1.x: &amp;#039;&amp;#039;&amp;#039;Outils &amp;gt; Macros &amp;gt; Macro… &amp;gt;&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org 1.9.x et ultérieur : &amp;#039;&amp;#039;&amp;#039;Outils &amp;gt; Macros &amp;gt; Gérer les macros &amp;gt; OpenOffice.org Basic… &amp;gt;&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Pour commencer, nous allons utiliser le Module1 de la bibliothèque Standard, présente pour l&amp;#039;utilisateur courant uniquement. &lt;br /&gt;
&lt;br /&gt;
Saisissons un nom pour notre nouvelle macro : &amp;#039;&amp;#039;&amp;#039;HelloWorld&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Dans la macro, sélectionnons &amp;#039;&amp;#039;&amp;#039;Standard&amp;#039;&amp;#039;&amp;#039; dans la zone de liste.&lt;br /&gt;
&lt;br /&gt;
Cliquons sur &amp;#039;&amp;#039;&amp;#039;Nouveau&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Nous devons maintenant trouver quelque chose comme ça : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
REM  *****  BASIC  *****&lt;br /&gt;
 &lt;br /&gt;
Sub Main&lt;br /&gt;
 &lt;br /&gt;
End Sub&lt;br /&gt;
 &lt;br /&gt;
Sub HelloWorld&lt;br /&gt;
 &lt;br /&gt;
End Sub&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Le curseur est positionné au début de la ligne &amp;lt;tt&amp;gt;Sub HelloWorld&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Note&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|Maintenant que l&amp;#039;IDE est actif, il peut être accédé depuis le menu Fenêtre d&amp;#039;OpenOffice.org ou par la barre des tâches du système d&amp;#039;exploitation.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Saisie de code=&lt;br /&gt;
Sélectionnons et effaçons : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
REM  *****  BASIC  *****&lt;br /&gt;
 &lt;br /&gt;
Sub Main&lt;br /&gt;
 &lt;br /&gt;
End Sub&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Au-dessous de la ligne &amp;quot;Sub HelloWorld&amp;quot; entrons &amp;lt;tt&amp;gt;msgbox &amp;quot;Hello World!&amp;quot;&amp;lt;/tt&amp;gt;, de manière à ce que l&amp;#039;éditeur ressemble à ceci : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
Sub HelloWorld&lt;br /&gt;
  msgbox &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
End Sub&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Notes:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|L&amp;#039;IDE ne fournit aucune fonctionnalité de complétion du code, ni d&amp;#039;aide sur la syntaxe des commandes lors de la frappe. Pour obtenir de l&amp;#039;aide sur une commande Basic, plaçons le curseur dans la commande et tapons F1.&amp;lt;br&amp;gt; Les commandes OpenOffice.org Basic ne sont pas sensibles à la casse. C&amp;#039;est pourquoi msgbox, MSGBOX et Msgbox sont équivalents.&amp;lt;br&amp;gt; Les chaînes sont entourées de guillemets doubles.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Exécution du code=&lt;br /&gt;
Le code Basic peut être exécuté de plusieurs façons : &lt;br /&gt;
&lt;br /&gt;
*Directement dans l&amp;#039;IDE. La barre des macro comprte un bouton Exécuter (par défaut, le troisième de la seconde barre d&amp;#039;outils). Ce bouton lance la première macro du module en cours. &lt;br /&gt;
&lt;br /&gt;
*Depuis le menu Outils :&lt;br /&gt;
&lt;br /&gt;
(Version 1.1.x) &amp;#039;&amp;#039;&amp;#039;Outils &amp;gt; Macros &amp;gt; Macro…&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
(Version 1.9.x et supérieures) &amp;#039;&amp;#039;&amp;#039;Outils &amp;gt; Macros &amp;gt; Exécuter la macro…&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
*Par assignation de la macro à une [[ touche]]. &lt;br /&gt;
&lt;br /&gt;
*Par assignation de la macro à une [[ option de menu]]. &lt;br /&gt;
&lt;br /&gt;
*Par assignation de la macro à un bouton de barre d&amp;#039;outil. &lt;br /&gt;
&lt;br /&gt;
*En créant un [[ contrôle dans un document]]. &lt;br /&gt;
&lt;br /&gt;
*Par assignation de la macro à un évènement. &lt;br /&gt;
&lt;br /&gt;
Pour l&amp;#039;instant essayons de lancer la procédure &amp;quot;HelloWorld&amp;quot; en cliquant sur le bouton &amp;#039;&amp;#039;&amp;#039;Exécuter&amp;#039;&amp;#039;&amp;#039;. Un dialogue intitulé &amp;quot;soffice&amp;quot; et comportant le texte &amp;quot;Hello World!&amp;quot; ainsi qu&amp;#039;un bouton OK doit s&amp;#039;afficher.&lt;br /&gt;
&lt;br /&gt;
=Enregistrement du code=&lt;br /&gt;
Le code est enregistré automatiquement chaque fois que son conteneur est lui-même enregistré. Par conséquent, si le code se trouve dans une bibliothèque OpenOffice.org (partagée ou de l&amp;#039;utilisateur), il est automatiquement enregistré lorsque OpenOffice.org est refermé. Si le code se trouve dans une bilbiothèque qui fait partie d&amp;#039;un document, alors il est enregistré lorsque le document l&amp;#039;est. &lt;br /&gt;
&lt;br /&gt;
Un bouton Enregistrer figure dans la barre d&amp;#039;outils Standard (celle du haut par défaut). Si le code se trouve à l&amp;#039;intérieur d&amp;#039;un document ou modèle, alors la totalité du document est enregistrée. Si le code se trouve à l&amp;#039;intérieur d&amp;#039;une bibliothèque OpenOffice.org alors seule la bilbiothèque courante est enregistrée.&lt;br /&gt;
&lt;br /&gt;
=Les variables=&lt;br /&gt;
Nous pouvons forcer la déclaration des variables en insérant &amp;lt;tt&amp;gt;Option Explicit&amp;lt;/tt&amp;gt; au début du module. Pour consulter une discussion consacrée à la déclaration ou non des variables, voir : [[http://www.oooforum.org/forum/viewtopic.phtml?t=5845 cette discussion]]. &lt;br /&gt;
&lt;br /&gt;
Dans cette discussion, on voit que l&amp;#039;auteur de cette page défendait initialement la déclaration systématique des variables. Depuis lors il a changé d&amp;#039;avis et ne les déclare plus du tout. Bref, c&amp;#039;est une question de préférence personnelle. Dans un cas comme dans l&amp;#039;autre, les préférences de l&amp;#039;auteur vont au nommage des variables selon la convention suivante, qui sera utilisée tout au long des exemples de ce wiki :&lt;br /&gt;
&lt;br /&gt;
La première lettre du nom de la variable indique le type de valeur contenue, telle que présentée à la table ci-dessous (basée sur un tableau dans Tutorial.pdf de Sun) &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Lettre&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Signification&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|a&lt;br /&gt;
|Structure&lt;br /&gt;
|-&lt;br /&gt;
|b&lt;br /&gt;
|Boolean (TRUE ou FALSE)&lt;br /&gt;
|-&lt;br /&gt;
|e&lt;br /&gt;
|Enumeration. Cette variable ne peut prendre qu&amp;#039;une valeur parmi un ensemble limité de valeurs.&lt;br /&gt;
|-&lt;br /&gt;
|f&lt;br /&gt;
|Float (de 3.402823 x 1038 à 1.401298 x 10-45. Une variable de type float [NdT : single] peut occuper jusqu&amp;#039;à quatre octets)&amp;lt;br&amp;gt; Double (de 1.79769313486232 x 10308 à 4.94065645841247 x 10-324. Une variable de ce type peut occuper jusqu&amp;#039;à huit octets)&amp;lt;br&amp;gt; Currency (de -922337203685477.5808 à +922337203685477.5807 et occupe jusqu&amp;#039;à huit octets en mémoire)&lt;br /&gt;
|-&lt;br /&gt;
|m&lt;br /&gt;
|Array (aka sequence aka matrice)&lt;br /&gt;
|-&lt;br /&gt;
|n&lt;br /&gt;
|Integer (de -32768 à 32767) ou&amp;lt;br&amp;gt; Long (de -2147483648 à 2147483647).&lt;br /&gt;
|-&lt;br /&gt;
|o&lt;br /&gt;
|Object, service ou interface&lt;br /&gt;
|-&lt;br /&gt;
|s&lt;br /&gt;
|String (Une variable string peut mémoriser jusqu&amp;#039;à 65535 caractères Unicode).&lt;br /&gt;
|-&lt;br /&gt;
|x&lt;br /&gt;
|Interface, montre que seules les opérations portant sur une interface particulière d&amp;#039;un objet sont utilisées&lt;br /&gt;
|-&lt;br /&gt;
|v&lt;br /&gt;
|Variant, n&amp;#039;importe quelle valeur&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Utilisons des noms descriptifs suffisamment longs et employons le style &amp;quot;Camel case&amp;quot; [NdT : usage conjoint des majuscules et des minuscules pour faire ressortir les éléments du nom]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Note :&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|Les variables définies par l&amp;#039;utilisateur en OpenOffice.org Basic ne sont pas sensibles à la casse. Les constantes UNO-API le sont.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les variables indexant les boucles constituent une exception conventionnelle aux longs noms descriptifs. Des symboles tels que i, j et k sont en effet d&amp;#039;usage fréquent. De même, lorsqu&amp;#039;une chaîne est construite, on utilise fréquemment s comme variable temporaire. &lt;br /&gt;
&lt;br /&gt;
Editons la routine sub HelloWorld de manière qu&amp;#039;elle ressemble à ceci et exécutons-la : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
sub HelloWorld&lt;br /&gt;
dim i as integer &amp;#039;ligne optionnelle&lt;br /&gt;
  for i = 0 to 2&lt;br /&gt;
    &amp;#039;Ces lignes sont indentées par souci de lisiblité uniquement&lt;br /&gt;
    &amp;#039;Notre code devrait toujours être structuré ainsi pour lui donner des chances de survie&lt;br /&gt;
    msgbox &amp;quot;Hello World &amp;quot; &amp;amp; i&lt;br /&gt;
  next i&lt;br /&gt;
end sub&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Pour plus d&amp;#039;informations sur les variables, reportons-nous à l&amp;#039;aide en ligne, rubrique &amp;quot;variables;utilisation&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=L&amp;#039;API OpenOffice.org=&lt;br /&gt;
Cette section commence par un exemple. La suite donne des informations complémentaires qui nous permettront de comprendre l&amp;#039;exemple et de l&amp;#039;étendre.&lt;br /&gt;
&lt;br /&gt;
Essayons d&amp;#039;exécuter le code ci-dessous lorsque différents types de documents sont ouverts.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
sub main&lt;br /&gt;
&amp;#039;BasicLibraries.loadLibrary(&amp;quot;XrayTool&amp;quot;)&lt;br /&gt;
&amp;#039;xray thisComponent&lt;br /&gt;
msgbox fnWhichComponent(thisComponent)&lt;br /&gt;
end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function fnWhichComponent(oDoc) as string&lt;br /&gt;
if HasUnoInterfaces(oDoc, &amp;quot;com.sun.star.lang.XServiceInfo&amp;quot;) then &lt;br /&gt;
   if thisComponent.supportsService (&amp;quot;com.sun.star.text.GenericTextDocument&amp;quot;) then&lt;br /&gt;
      fnWhichComponent = &amp;quot;Texte&amp;quot;&lt;br /&gt;
   elseif thisComponent.supportsService(&amp;quot;com.sun.star.sheet.SpreadsheetDocument&amp;quot;) then&lt;br /&gt;
      fnWhichComponent = &amp;quot;Feuille de calcul&amp;quot;&lt;br /&gt;
   elseif thisComponent.supportsService(&amp;quot;com.sun.star.presentation.PresentationDocument&amp;quot;) then&lt;br /&gt;
      fnWhichComponent = &amp;quot;Presentation&amp;quot;&lt;br /&gt;
   elseif thisComponent.supportsService(&amp;quot;com.sun.star.drawing.GenericDrawingDocument&amp;quot;) then&lt;br /&gt;
      fnWhichComponent = &amp;quot;Dessin&amp;quot;&lt;br /&gt;
   else&lt;br /&gt;
      fnWhichComponent = &amp;quot;Oops le document ouvert est autre chose&amp;quot;&lt;br /&gt;
   end if&lt;br /&gt;
else&lt;br /&gt;
   fnWhichComponent = &amp;quot;Ce n&amp;#039;est pas un document&amp;quot;&lt;br /&gt;
end if&lt;br /&gt;
End function&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Convention de nommage des routines==&lt;br /&gt;
Dans l&amp;#039;exemple ci-dessus, le nom de la fonction utilisateur commence par &amp;quot;fn&amp;quot;. Il s&amp;#039;agit de la convention adoptée par l&amp;#039;auteur initial [NdT : version anglaise] qui permet au lecteur de savoir qu&amp;#039;il s&amp;#039;agit d&amp;#039;une fonction définie par l&amp;#039;utilisateur. Dans le même esprit, l&amp;#039;auteur initial utilise la convention de débuter les noms des procédures par &amp;quot;sub&amp;quot;. Lorsque l&amp;#039;on apprend un nouveau langage et de nouvelles API, il peut s&amp;#039;avérer difficile de reconnaître ce qui ressortit du langage lui-même de ce qui a été défini ailleurs dans notre code. Ce document/wiki emploie ces conventions pour le nommage des fonctions et des procédures.&lt;br /&gt;
&lt;br /&gt;
==Présentation de l&amp;#039;API OpenOffice.org==&lt;br /&gt;
Cette section introduit les termes : &lt;br /&gt;
&lt;br /&gt;
* Interface &lt;br /&gt;
* Module &lt;br /&gt;
* Service &lt;br /&gt;
* Méthode &lt;br /&gt;
* Propriété &lt;br /&gt;
&lt;br /&gt;
S&amp;#039;il n&amp;#039;est pas essentiel de comprendre la différence entre une interface et un service ou ce qu&amp;#039;est un module pour pouvoir écrire des extensions à OpenOffice.org, la compréhension de ces termes aide à correctement interpréter la documentation ainsi qu&amp;#039;à l&amp;#039;introspection des éléments manipulés. Peut-être nous faudra-t-il relire cette section plusieurs fois. &lt;br /&gt;
&lt;br /&gt;
Une &amp;#039;&amp;#039;&amp;#039;interface&amp;#039;&amp;#039;&amp;#039; est la &amp;#039;&amp;#039;définition&amp;#039;&amp;#039; d&amp;#039;un ensemble de méthodes (avec leurs arguments) qu&amp;#039;un service implémentant cette interface doit comporter. &lt;br /&gt;
&lt;br /&gt;
Les interfaces sont regroupées en &amp;#039;&amp;#039;&amp;#039;modules&amp;#039;&amp;#039;&amp;#039; pour des besoins de nommage. Toutes les interfaces (et les services) commencent par le nom &amp;quot;com.sun.star&amp;quot; puis vient le nom du module puis celui de l&amp;#039;interface (ou du service). &lt;br /&gt;
&lt;br /&gt;
Par exemple, la plupart des services fournissent l&amp;#039;interface &amp;lt;tt&amp;gt;com.sun.star.beans.XPropertySet&amp;lt;/tt&amp;gt;. Cette interface est enregistrée dans le module &amp;quot;beans&amp;quot; et fournit l&amp;#039;accès aux propriétés d&amp;#039;un service. Une &amp;#039;&amp;#039;&amp;#039;propriété&amp;#039;&amp;#039;&amp;#039; est une valeur tandis qu&amp;#039;une &amp;#039;&amp;#039;&amp;#039;méthode&amp;#039;&amp;#039;&amp;#039; définit une action. &lt;br /&gt;
&lt;br /&gt;
Un objet OpenOffice.org peut supporter de nombreux services. &lt;br /&gt;
&lt;br /&gt;
Un objet OpenOffice.org peut supporter un service qui implémente une interface dans laquell une description de méthode déclare qu&amp;#039;un autre objet OpenOffice.org est retourné.&lt;br /&gt;
&lt;br /&gt;
==Introspection==&lt;br /&gt;
HasUnoInterfaces est une fonction OpenOffice.org Basic utilisée pour l&amp;#039;introspection. Ce document  [[http://www.oooforum.org/forum/viewtopic.phtml?t=7068 link]] permettra d&amp;#039;apprendre ce que l&amp;#039;on entend par introspection dans d&amp;#039;autres langages de programmation. &lt;br /&gt;
&lt;br /&gt;
HasUnoInterfaces renvoie une valeur &amp;quot;vrai&amp;quot; si toutes les interfaces spécifiées sont disponibles pour l&amp;#039;objet appelant. &lt;br /&gt;
&lt;br /&gt;
La plupart des objets OpenOffice.org fournissent la méthode supportsService parce qu&amp;#039;ils disposent également de l&amp;#039;interface com.sun.star.lang.XServiceInfo. &lt;br /&gt;
&lt;br /&gt;
Dans l&amp;#039;exemple ci-dessus, la commande OpenOffice.org Basic, &amp;#039;&amp;#039;&amp;#039;HasUnoInterfaces&amp;#039;&amp;#039;&amp;#039; vérifie si le document actif dispose de l&amp;#039;interface com.sun.star.lang.XServiceInfo, car si cette interface n&amp;#039;est pas présente, alors le document n&amp;#039;aura pas non plus la méthode supportsService, et une erreur d&amp;#039;exécution se produirait si un objet tentait d&amp;#039;accéder à une méthode inexistante. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SupportsService&amp;#039;&amp;#039;&amp;#039; est une méthode qui renvoie la valeur &amp;quot;vrai&amp;quot; si le service spécifié est disponible. Dans l&amp;#039;exemple ci-dessus, on vérifie la présence d&amp;#039;un service afin de déterminer le type de document en cours d&amp;#039;activation.&lt;br /&gt;
&lt;br /&gt;
==L&amp;#039;Outil X-Ray==&lt;br /&gt;
L&amp;#039;utilisation de &amp;quot;HasUnoInterfaces&amp;quot; et de &amp;quot;supportsService&amp;quot; permet d&amp;#039;obtenir des informations sur un objet donné lors de son exécution, mais procéder ainsi pour apprendre le langage Basic deviendrait vite fastidieux. Heureusement, et grâce à Bernard Marcelly, nous disposons de l&amp;#039;outil X-Ray. Cet outil est disponible ici en version française: [[http://fr.openoffice.org/Documentation/How-to/indexht-programmation.html HowTos Programmation]] et ici en version anglaise [[http://ooomacros.org/dev.php#101416 ooomacros]]. Téléchargez le fichier zip, dézippez l&amp;#039;archive, ouvrez le document dans OpenOffice.org, et suivez les instructions pour son installation et configuration. &lt;br /&gt;
&lt;br /&gt;
Une partie de la configuration de l&amp;#039;outil X-Ray concerne la définition de l&amp;#039;endroit où est stockée une copie locale (sur le disque dur) du Kit de Développement OpenOffice.org (appélé SDK). Téléchargez le Kit de Développement OpenOffice.org depuis [[http://www.openoffice.org/dev_docs/source/sdk/ le site du SDK]] et installez le sur votre disque dur. &lt;br /&gt;
&lt;br /&gt;
Dans l&amp;#039;exemple ci-dessus, au début du code, il y a deux lignes mises en commentaires (les lignes de commentaires commencent avec des apostrophes ou le mot réservé rem): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;BasicLibraries.loadLibrary(&amp;quot;XrayTool&amp;quot;)&lt;br /&gt;
&amp;#039;xray thisComponent&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Une fois l&amp;#039;outil X-Ray installé, supprimez les apostrophes dans les lignes indiquées ci-dessus et relancez la macro.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;BasicLibraries&amp;#039;&amp;#039;&amp;#039; est une commande OpenOffice.org Basic qui renvoie un objet permettant d&amp;#039;accéder aux bibliothèques OpenOffice.org. La méthode &amp;lt;tt&amp;gt;loadLibrary&amp;lt;/tt&amp;gt; rend disponible aux utilisateurs les routines présentes dans cette bibliothèque. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;xray&amp;lt;/tt&amp;gt; indique la routine xray contenue dans la bibliothèque XrayTool, l&amp;#039;objet thisComponent étant l&amp;#039;objet transmis à xray pour l&amp;#039;introspection. &lt;br /&gt;
&lt;br /&gt;
Afin de trouver l&amp;#039;objet que vous cherchez, il est souvent nécessaire de le découvrir ou de le créer depuis StarDesktop ou thisComponent.&lt;br /&gt;
&lt;br /&gt;
==Desktop, documents, et current selection==&lt;br /&gt;
StarDesktop et ThisComponent sont des commandes OpenOffice.org Basic qui ont trait à l&amp;#039;application et le document actif (c&amp;#039;est-à-dire, celui qui a le focus actuellement sur le bureau) respectivement. &lt;br /&gt;
&lt;br /&gt;
Contrairement à Microsoft Office, l&amp;#039;application OpenOffice.org est monolithique et comporte différents composants. Lorsqu&amp;#039;on exécute du code, il peut être utile de vérifier quel composant est actuellement en cours d&amp;#039;activation. Le code ci-dessus donne un exemple de la manière de procéder à cette vérification. &lt;br /&gt;
&lt;br /&gt;
Quand il est fait référence au Desktop dans StarDesktop, celui-ci se réfère à une existence virtuelle (puisqu&amp;#039;auparavant il existait réellement dans OpenOffice.org et dans StarOffice). On peut ainsi le considérer comme étant l&amp;#039;application OpenOffice.org elle-même.&lt;br /&gt;
&lt;br /&gt;
==Création de Nouveaux Documents==&lt;br /&gt;
Pour créer un nouveau document Writer, on écrit le code suivant: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
oDoc = StarDesktop.loadComponentFromURL(&amp;quot;private:factory/swriter&amp;quot;, &amp;quot;_blank&amp;quot;, 0, Array())&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De la même manière, pour un nouveau document Calc: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
oDoc = StarDesktop.loadComponentFromURL(&amp;quot;private:factory/scalc&amp;quot;, &amp;quot;_blank&amp;quot;, 0, Array())&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il serait sans doute plus facile d&amp;#039;écrire une fonction simple: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
function fnNewDoc(sDocType as string)&lt;br /&gt;
fnNewDoc = StarDesktop.loadComponentFromURL(&amp;quot;private:factory/&amp;quot; &amp;amp; sDocType , &amp;quot;_blank&amp;quot;, 0, Array())&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, on pourra créer de nouveaux documents ainsi: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
oDoc = fnNewDoc(&amp;quot;swriter&amp;quot;)&lt;br /&gt;
oDoc = fnNewDoc(&amp;quot;scalc&amp;quot;)&lt;br /&gt;
oDoc = fnNewDoc(&amp;quot;simpress&amp;quot;)&lt;br /&gt;
oDoc = fnNewDoc(&amp;quot;sdraw&amp;quot;)&lt;br /&gt;
oDoc = fnNewDoc(&amp;quot;smath&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voir également http://api.openoffice.org/docs/common/ref/com/sun/star/frame/XComponentLoader.html .&lt;br /&gt;
&lt;br /&gt;
==Ouverture d&amp;#039;un document==&lt;br /&gt;
Le code suivant donne un exemple permettant d&amp;#039;ouvrir un fichier. Pour plus d&amp;#039;informations sur l&amp;#039;utilisation d&amp;#039;URL au sein de OpenOffice.org, voir [[ URL Basics]]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
sFile = &amp;quot;C:\Documents and Settings\danny\Desktop\MyCalc.sxc&amp;quot; &amp;#039; Windows&lt;br /&gt;
sFile = &amp;quot;/home/danny/Desktop/MyCalc.sxc&amp;quot; &amp;#039; Linux&lt;br /&gt;
sURL = ConvertToURL(sFile)&lt;br /&gt;
oDoc = StarDesktop.loadComponentFromURL(sURL, &amp;quot;_blank&amp;quot;, 0, Array())&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici encore, il peut être plus rationnel de simplifier le code en écrivant une fonction: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
function fnOpenDoc(sFile)&lt;br /&gt;
sURL = ConvertToURL(sFile)&lt;br /&gt;
fnOpenDoc = StarDesktop.loadComponentFromURL(sURL, &amp;quot;_blank&amp;quot;, 0, Array())&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemples d&amp;#039;utilisation de la fonction: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
oDoc = fnOpenDoc(&amp;quot;C:\Documents and Settings\danny\Desktop\MyCalc.sxc&amp;quot;) &amp;#039; Windows&lt;br /&gt;
oDoc = fnOpenDoc(&amp;quot;/home/danny/Desktop/MyCalc.sxc&amp;quot;) &amp;#039; Linux&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==La sélection en cours==&lt;br /&gt;
Nous avons souvent besoin d&amp;#039;exécuter du code qui affecte la sélection courante. &amp;lt;tt&amp;gt;ThisComponent&amp;lt;/tt&amp;gt; possède une méthode &amp;lt;tt&amp;gt;getCurrentSelection&amp;lt;/tt&amp;gt;. Comme de nombreux types d&amp;#039;objets sont sélectionnables, il est habituel de vérifier que l&amp;#039;objet sélectionné possède le service qui contient la méthode que nous voulons appliquer à l&amp;#039;objet. &lt;br /&gt;
&lt;br /&gt;
Editons la routine principale du code ci-dessous et re-exécutons-la successivement sur un document texte comportant plusieurs sélections différentes (pour sélectionner plus d&amp;#039;un bloc de texte, nous maintenons la touche Control enfoncée). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
sub main&lt;br /&gt;
BasicLibraries.loadLibrary(&amp;quot;XrayTool&amp;quot;)&lt;br /&gt;
if fnWhichComponent(thisComponent) = &amp;quot;Text&amp;quot; then&lt;br /&gt;
        oCurSelection = thisComponent.getCurrentSelection()&lt;br /&gt;
        &amp;#039;xray oCurSelection&lt;br /&gt;
        if oCurSelection.supportsService(&amp;quot;com.sun.star.text.TextRanges&amp;quot;) then&lt;br /&gt;
                msgbox &amp;quot;Il y a &amp;quot; &amp;amp; oCurSelection.getCount() &amp;amp; _&lt;br /&gt;
                 &amp;quot; sélections dans le document texte en cours.&amp;quot;&lt;br /&gt;
        end if&lt;br /&gt;
end if&lt;br /&gt;
end sub&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Lorsqu&amp;#039;il n&amp;#039;y a aucune sélection, le nombre affiché est un - le point d&amp;#039;insertion -, avec un bloc de text sélectionné, il renvoie également un, mais avec deux blocs de texte, ce nombre devient égal à trois - le point d&amp;#039;insertion et les deux blocs de texte sélectionnés. &lt;br /&gt;
&lt;br /&gt;
Exercice 1 : Modifier le code ci-dessus afin qu&amp;#039;il fonctionne sur des plages de cellules sélectionnées dans une feuille de calcul. &lt;br /&gt;
&lt;br /&gt;
Question 1 : Lorsque deux blocs de cellules sont sélectionnés, quelle est la valeur du nombre de sélections ?&lt;br /&gt;
&lt;br /&gt;
==Les propriétés==&lt;br /&gt;
Retirons le commentaire de &amp;lt;tt&amp;gt;&amp;#039;xray oCurSelection&amp;lt;/tt&amp;gt; de manière à lancer xray, ce qui permet de constater que l&amp;#039;objet pointé par &amp;lt;tt&amp;gt;oCurSelection&amp;lt;/tt&amp;gt; possède une &amp;quot;propriété&amp;quot; nommée &amp;lt;tt&amp;gt;Count&amp;lt;/tt&amp;gt; dont la description est &amp;quot;pseudo-prop, read only&amp;quot;. Nous pourrions écrire &amp;lt;tt&amp;gt;oCurSelection.count&amp;lt;/tt&amp;gt; en OpenOffice.org Basic, mais comme ce n&amp;#039;est pas possible dans tous les autres langages qui accèdent à l&amp;#039;API OpenOffice.org, ce wiki essaiera de toujours utiliser l&amp;#039;approche par méthode (je signale çà car je n&amp;#039;ai pas pris l&amp;#039;habitude de le faire et il m&amp;#039;arrive d&amp;#039;oublier). &lt;br /&gt;
&lt;br /&gt;
L&amp;#039;exemple suivant montre comment changer une valeur de propriété pour les sélections courantes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
sub main&lt;br /&gt;
BasicLibraries.loadLibrary(&amp;quot;XrayTool&amp;quot;)&lt;br /&gt;
if fnWhichComponent(thisComponent) = &amp;quot;Text&amp;quot; then&lt;br /&gt;
   oCurSelection = thisComponent.getCurrentSelection()&lt;br /&gt;
   if oCurSelection.supportsService(&amp;quot;com.sun.star.text.TextRanges&amp;quot;) then&lt;br /&gt;
      nCount = oCurSelection.Count&lt;br /&gt;
      &amp;#039;xray oCurSelection.getByIndex(0)&lt;br /&gt;
      &amp;#039;Attention : le point d&amp;#039;insertion va voir la même action appliquée deux fois&lt;br /&gt;
      &amp;#039;ici çà n&amp;#039;a pas d&amp;#039;importance mais il est des cas ou cela pourrait en avoir.&lt;br /&gt;
      for i = 0 to nCount - 1&lt;br /&gt;
         oCurSelection.getByIndex(i).setPropertyValue(&amp;quot;CharStyleName&amp;quot;, &amp;quot;Strong Emphasis&amp;quot;)&lt;br /&gt;
      next&lt;br /&gt;
   end if&lt;br /&gt;
end if&lt;br /&gt;
end sub&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En Basic OpenOffice.org nous pouvons raccourcir la ligne d&amp;#039;affectation ainsi : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
oCurSelection(i).CharStyleName = &amp;quot;Strong Emphasis&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ce wiki essaiera toujours d&amp;#039;utiliser les noms complets des méthodes pour l&amp;#039;indexation et l&amp;#039;assignation des propriétés. La raison en est que non seulement cela aide les nouveaux venus à comprendre ce qui se passe mais également nous rendons ainsi la conversion du code vers d&amp;#039;autres langages plus aisée (encore une fois, je n&amp;#039;ai pas l&amp;#039;habitude de pratiquer systématiquement ainsi, c&amp;#039;est pourquoi des contre-exemples pourraient m&amp;#039;échapper). &lt;br /&gt;
&lt;br /&gt;
Exercice 2 : Réécrire le code ci-dessus de manière que l&amp;#039;avertissement disparaisse. &lt;br /&gt;
&lt;br /&gt;
Voir [[ Current selection]].&lt;br /&gt;
&lt;br /&gt;
=Accès répété à des objets subordonnés (accès aux énumérations)=&lt;br /&gt;
Il arrive qu&amp;#039;une énumération soit nécessaire pour accéder à l&amp;#039;objet désiré. C&amp;#039;est le cas, par exemple, des paragraphes à l&amp;#039;intérieur d&amp;#039;un document ou dans une sélection.&lt;br /&gt;
&lt;br /&gt;
Lorsqu&amp;#039;un document Writer est actif et que du texte y est sélectionné, &amp;lt;tt&amp;gt;thisDocument.getText()&amp;lt;/tt&amp;gt; et &amp;lt;tt&amp;gt;thisComponent.getCurrentSelection().getByIndex(i)&amp;lt;/tt&amp;gt; possèdent toutes deux le service &amp;lt;tt&amp;gt;com.sun.star.text.TextRange&amp;lt;/tt&amp;gt; qui lui-même possède l&amp;#039;interface &amp;lt;tt&amp;gt;com.sun.star.container.XContentEnumerationAccess&amp;lt;/tt&amp;gt;. Il est possible de créer une énumération des paragraphes du document en cours ou d&amp;#039;un sélection donnée. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039; Creation de l&amp;#039;objet énumeration&lt;br /&gt;
oTextElementEnum = thisComponent.getText().createEnumeration()&lt;br /&gt;
&amp;#039;ou bien : thisComponent.getCurrentSelection().getByIndex(i).createEnumeration()&lt;br /&gt;
 &lt;br /&gt;
&amp;#039; boucler sur tous les élément texte&lt;br /&gt;
while oTextElementEnum.hasMoreElements()&lt;br /&gt;
        oTextElement = oTextElementEnum.nextElement&lt;br /&gt;
        if oTextElement.supportsService(&amp;quot;com.sun.star.text.TextTable&amp;quot;) then&lt;br /&gt;
                MsgBox &amp;quot;Le bloc en cours contient un tableau.&amp;quot;&lt;br /&gt;
        end if&lt;br /&gt;
        if oTextElement.supportsService(&amp;quot;com.sun.star.text.Paragraph&amp;quot;) then&lt;br /&gt;
                MsgBox &amp;quot;Le bloc en cours contient un paragraphe.&amp;quot;&lt;br /&gt;
        end if&lt;br /&gt;
wend&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Exercise 3 : Etendre l&amp;#039;exemple ci-dessus pour lui faire afficher la liste de toutes les portions de textes mises en gras.&lt;br /&gt;
&lt;br /&gt;
=Accès nommés=&lt;br /&gt;
Certains objets fournissent l&amp;#039;accès nommé à un type particulier d&amp;#039;objet subordonné, d&amp;#039;autres fournissent l&amp;#039;accès indexé et certains fournissent les deux à la fois, accès nommé et indexé. &lt;br /&gt;
&lt;br /&gt;
Par exemple, si le document en cours dans OpenOffice.org est une classeur, alors l&amp;#039;accès à une feuille spécifique peut s&amp;#039;effectuer par accès indexé : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
oSheet = thisComponent.getSheets.getByIndex(0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
ou bien par accès nommé : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
oSheet = thisComponent.getSheets.getByName(&amp;quot;Feuille1&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Pour vérifier qu&amp;#039;un objet doté d&amp;#039;un nom particulier existe déjà, utilisons &amp;lt;tt&amp;gt;hasByName&amp;lt;/tt&amp;gt;. Par exemple : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
if thisComponent.getSheets.hasByName(&amp;quot;Feuille1&amp;quot;) then&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Parcourir tous les noms d&amp;#039;objets disponibles peut se faire comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
mNames = thisComponent.getSheets.getElementnames&lt;br /&gt;
for i = lbound(mNames) to ubound(mNames)&lt;br /&gt;
        msgbox mNames(i)&lt;br /&gt;
next&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Quelques objets subordonnés nommés fournissent également l&amp;#039;interface : &amp;lt;tt&amp;gt;com.sun.star.container.XNameContainer&amp;lt;/tt&amp;gt;. Cette interface définit que de tels objets doivent comporter les méthodes : &amp;lt;tt&amp;gt;insertByName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;replaceByname&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;removeByName&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Ex : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
thisComponent.getSheets.insertByName(&amp;quot;NouvelleFeuille&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Créer de nouveaux objets=&lt;br /&gt;
Certains objets proposent des services qui implémentent des interfaces fournissant des méthodes spécifiques pour créer un type particulier d&amp;#039;objet.&lt;br /&gt;
&lt;br /&gt;
Par exemple, si le document en cours est un document Writer, alors &amp;lt;tt&amp;gt;thisComponent.getText&amp;lt;/tt&amp;gt; est un objet qui fournit le service &amp;lt;tt&amp;gt;com.sun.star.text.Text&amp;lt;/tt&amp;gt; qui implémente l&amp;#039;interface &amp;lt;tt&amp;gt;com.sun.star.text.XSimpleText&amp;lt;/tt&amp;gt; laquelle définit les méthodes &amp;lt;tt&amp;gt;createTextCursor&amp;lt;/tt&amp;gt; et &amp;lt;tt&amp;gt;createTextCursorByRange&amp;lt;/tt&amp;gt;. Ces deux méthodes permettent de créer un curseur texte afin d&amp;#039;accéder au corps du document. Ces curseurs sont indépendants du curseur de visualisation. Ce dernier est visible à l&amp;#039;écran et est manipulé par l&amp;#039;utilisateur (et également par programme), tandis qu&amp;#039;un curseur texte n&amp;#039;apparaît pas à l&amp;#039;écran et n&amp;#039;est employé que par des programmes. Le morceau de code qui suit montre la création d&amp;#039;un curseur texte qui démarre à l&amp;#039;emplacement du curseur de visualisation pour être ensuite déplacé indépendamment de ce dernier. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
oCursor = oVC.getText.createTextCursorByRange(oVC)&lt;br /&gt;
oCursor.gotoStartOfSentence(false)&lt;br /&gt;
oCursor.gotoEndOfSentence(true)&lt;br /&gt;
msgbox oCursor.getString&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Certains objets sont dépendants du contexte et peuvent être créés par appel de la méthode &amp;lt;tt&amp;gt;createInstance&amp;lt;/tt&amp;gt; définie dans l&amp;#039;interface &amp;lt;tt&amp;gt;com.sun.star.lang.XMultiServiceFactory&amp;lt;/tt&amp;gt;. Par exemple, pour ajouter un rectangle sur la première page d&amp;#039;un document Draw : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
dim aPoint as new com.sun.star.awt.Point&lt;br /&gt;
dim aSize as new com.sun.star.awt.Size&lt;br /&gt;
 &lt;br /&gt;
aPoint.x = 1000&lt;br /&gt;
aPoint.y = 1000&lt;br /&gt;
 &lt;br /&gt;
aSize.Width = 10000&lt;br /&gt;
aSize.Height = 10000&lt;br /&gt;
 &lt;br /&gt;
oRectangleShape = thisComponent.createInstance(&amp;quot;com.sun.star.drawing.RectangleShape&amp;quot;)&lt;br /&gt;
oRectangleShape.Size = aSize&lt;br /&gt;
oRectangleShape.Position = aPoint&lt;br /&gt;
 &lt;br /&gt;
thisComponent.getDrawPages.getByIndex(0).add(oRectangleShape)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cet exemple utilise également des structures UNO. Voir plus bas pour plus d&amp;#039;informations sur ce sujet.&lt;br /&gt;
&lt;br /&gt;
Certains objets sont indépendants du contexte. Pour les créer, nous utilisons la commande Basic OpenOffice.org &amp;lt;tt&amp;gt;createUnoService&amp;lt;/tt&amp;gt;. Par exemple, pour créer l&amp;#039;équivalent de StarDesktop : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
oDesktop = createUnoService(&amp;quot;com.sun.star.frame.Desktop&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le procédé que j&amp;#039;emploie pour savoir comment accéder ou créer un objet est le suivant :&lt;br /&gt;
&lt;br /&gt;
Est-ce que l&amp;#039;objet existe déjà ? Si oui, alors je dois pouvoir y accéder à partir de quelque chose comme &amp;lt;tt&amp;gt;thisComponent&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
L&amp;#039;objet doit-il appartenir à un autre objet ? Si oui, alors le propriétaire comporte-t-il une méthode spécifique pour créer l&amp;#039;objet ? Si oui, j&amp;#039;appelle cette méthode.&lt;br /&gt;
&lt;br /&gt;
Le nouvel objet doit-il appartenir à un autre objet qui ne fournit par de méthode de création mais fournit &amp;lt;tt&amp;gt;createInstance&amp;lt;/tt&amp;gt; ? Si l&amp;#039;objet ne fournit pas &amp;lt;tt&amp;gt;createInstance&amp;lt;/tt&amp;gt; suis-je certain que j&amp;#039;utilise le bon objet ou est-il dépendant du contexte ?&lt;br /&gt;
&lt;br /&gt;
Il me semble que la création d&amp;#039;objets est mal documentée actuellement c&amp;#039;est pourquoi j&amp;#039;espère que ce document/wiki rendra les choses plus claires.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Structures UNO==&lt;br /&gt;
Les structures UNO se déclarent au moyen de la commande Basic OpenOffice.org &amp;lt;tt&amp;gt;dim&amp;lt;/tt&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
dim aPoint as new com.sun.star.awt.Point&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ou encore en employant la commande Basic OpenOffice.org &amp;lt;tt&amp;gt;createUnoStruct&amp;lt;/tt&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
aPoint = createUnoStruct(&amp;quot;com.sun.star.awt.Point&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Note :&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|La casse est importante lors de la déclaration de structures UNO. Tout ce qui précède le nom de la structure est en minuscules, le nom lui-même marriant minuscules et majuscules.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Création de Listeners et de Handlers==&lt;br /&gt;
L&amp;#039;interface utilisateur permet d&amp;#039;assigner des macros à certains événements : &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org versions 1.1.x: &amp;#039;&amp;#039;&amp;#039;Outils &amp;gt; Adaptation &amp;gt; Evénements&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org versions 1.9.x and above: &amp;#039;&amp;#039;&amp;#039;Outils &amp;gt; Personnaliser &amp;gt; Evénements&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Nous pouvons également assigner des macros à une gamme plus large d&amp;#039;événements en utilisant la commande Basic OpenOffice.org &amp;lt;tt&amp;gt;CreateUnoListener&amp;lt;/tt&amp;gt;. La même commande sert à créer à la fois des  listeners aet des handlers. Un listener attend un événement et permet toujours à d&amp;#039;autres listeners de répondre à ce même événement. Un handler attend un événement et peut éventuellement le consommer afin que d&amp;#039;autres listeners ne puissent pas agir dessus.&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;exemple ci-dessous crée un gestionnaire de clavier : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
global IannzExampleKeyHandler&lt;br /&gt;
 &lt;br /&gt;
sub SetupKeyHandler&lt;br /&gt;
oController = thisComponent.currentController&lt;br /&gt;
IannzExampleKeyHandler = CreateUnoListener(&amp;quot;KeyHandler_&amp;quot;,&amp;quot;com.sun.star.awt.XKeyHandler&amp;quot;)&lt;br /&gt;
oController.addKeyHandler(IannzExampleKeyHandler) &amp;#039; Enregistre le listener&lt;br /&gt;
end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
sub RemoveKeyHandler&lt;br /&gt;
thisComponent.currentController.removeKeyHandler(IannzExampleKeyHandler)&lt;br /&gt;
end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
sub KeyHandler_disposing&lt;br /&gt;
end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function KeyHandler_keyReleased(oKeyEvent as new com.sun.star.awt.KeyHandler) as boolean&lt;br /&gt;
        KeyHandler_keyReleased = False    &lt;br /&gt;
end function&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function KeyHandler_keyPressed(oKeyEvent as new com.sun.star.awt.KeyHandler) as boolean&lt;br /&gt;
KeyHandler_keyPressed = false   &amp;#039;Laisser d&amp;#039;autres listeners gérer l&amp;#039;événement&lt;br /&gt;
if oKeyEvent.modifiers = com.sun.star.awt.KeyModifier.MOD2 then &amp;#039;Control key was pressed&lt;br /&gt;
        if oKeyEvent.keyCode = com.sun.star.awt.Key.Q then&lt;br /&gt;
                msgbox &amp;quot;Alt + Q a été appuyé&amp;quot;&lt;br /&gt;
                KeyHandler_keyPressed = true    &amp;#039;Ne pas laisser d&amp;#039;autres listeners gérer l&amp;#039;événement&lt;br /&gt;
        end if&lt;br /&gt;
end if&lt;br /&gt;
end function&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Une variable globale conserve sa valeur après la sortie de la macro. Dans ce cas, nous voulons pouvoir utiliser cette variable plus tard pour supprimer le handler. Je fais débuter tous mes noms de variables globales du radical Iannz qui est le nom que j&amp;#039;ai enregistré pour le site web OpenOffice.org. Ceci permet d&amp;#039;éviter des conflits éventuels entre mes variables globales et d&amp;#039;autres bibliothèques qui pourraient utiliser les mêmes noms. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sub SetupKeyHandler&amp;lt;/tt&amp;gt; initialise le handler. Le premier paramètre de CreateUnoListener est le nom générique des méthodes qui sont appelées quand ce type d&amp;#039;événement se produit. Dans cet exemple .&amp;lt;tt&amp;gt;&amp;quot;KeyHandler_&amp;quot;&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Le second parameter est le nom de l&amp;#039;interface du listener ou du handler, &amp;quot;com.sun.star.awt.XKeyHandler&amp;quot;. Le nom est sensible à la casse, tout jusque et y compris le nom du module est toujours en minuscules, le nom de l&amp;#039;interface commence par un &amp;quot;X&amp;quot; et le reste est en TitleCase. &lt;br /&gt;
&lt;br /&gt;
Utilsions le SDK pour trouver quelles méthodes l&amp;#039;interface doit fournir. Nous devrons fournir des routines pour toutes ces méthodes, même si nous n&amp;#039;avons pas l&amp;#039;intention de les utiliser. Nous devrons également fournir une méthode de nettoyage. Les noms de ces routines débutent par la chaîne passée comme premier paramètre à CreateUnoListener. Dans l&amp;#039;exemple c&amp;#039;est &amp;lt;tt&amp;gt;&amp;quot;KeyHandler_&amp;quot;&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Il y a donc dans l&amp;#039;exemple &amp;lt;tt&amp;gt;KeyHandler_disposing&amp;lt;/tt&amp;gt; et &amp;lt;tt&amp;gt;KeyHandler_keyReleased&amp;lt;/tt&amp;gt; qui, en fait, ne font rien mais sont nécessaires, et &amp;lt;tt&amp;gt;KeyHandler_keyPressed&amp;lt;/tt&amp;gt; qui accomplit la fonctionnalité effective. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sub RemoveKeyHandler&amp;lt;/tt&amp;gt; montre comment supprimer le handler.&lt;br /&gt;
&lt;br /&gt;
=Les constantes OpenOffice.org=&lt;br /&gt;
L&amp;#039;exemple ci-dessus utilise des constantes OpenOffice.org. &lt;br /&gt;
&lt;br /&gt;
Par ex : com.sun.star.awt.KeyModifier.MOD2&lt;br /&gt;
&lt;br /&gt;
Les constantes OpenOffice.org sont sensibles à la casse. Tout jusque et y compris le nom du module est toujours en minuscules. Le nom du groupe de constantes est en TitleCase. Le nom effectif de la constante est toujours en MAJUSCULES. &lt;br /&gt;
&lt;br /&gt;
Les programmeurs qui n&amp;#039;utilisent pas le Basic OpenOffice.org peuvent ne pas avoir accès à ces constantes.&lt;br /&gt;
&lt;br /&gt;
=Utilisation de l&amp;#039;enregistreur=&lt;br /&gt;
Voir la section [[ L&amp;#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)]]&lt;br /&gt;
où sont comparés l&amp;#039;enregistrement des commandes UNO Dispatch et les appels API.&lt;br /&gt;
&lt;br /&gt;
Traduit de l&amp;#039;anglais : [[ The OpenOffice.org recorder and UNO dispatch calls]]&lt;br /&gt;
&lt;br /&gt;
= Voir aussi=&lt;br /&gt;
* [[Programming_OooWriter |Programming OOoWriter in C++]] où des record OOBasic sont utilisés en C++&lt;br /&gt;
* Une brève description de l&amp;#039;[[XIntrospection_Interface|interface XIntrospection]].&lt;br /&gt;
* Télécharger [http://fr.openoffice.org/Documentation/How-to/indexht-programmation.html L&amp;#039;outil XRay OOoBasic] de Bernard Marcelly. &lt;br /&gt;
* A voir aussi en anglais : [[Object Inspector|The New Object Inspector]] et [[BASIC/UNO_Object_Browser|The BASIC UNO Object Browser]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Basic:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_Appels_UNO_(dispatch)&amp;diff=132823</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_Appels_UNO_(dispatch)&amp;diff=132823"/>
		<updated>2009-06-23T15:40:29Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch) moved to L&amp;#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch): Suppression de la majuscule d&amp;#039;appel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[L&amp;#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)]]&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132822</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132822"/>
		<updated>2009-06-23T15:40:29Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch) moved to L&amp;#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch): Suppression de la majuscule d&amp;#039;appel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;L&amp;#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org fournit un enregistreur, pour enregistrer une série d&amp;#039;actions, dans &amp;#039;&amp;#039;&amp;#039;Writer et Calc seulement&amp;#039;&amp;#039;&amp;#039;. Il permet de produire du code. L&amp;#039;enregistreur écrit une série d&amp;#039;appels UNO (dispatch), qui ne sont pas particulièrement pratique pour apprendre le modèle API d&amp;#039;OpenOffice.org. Je trouve personnellement que le code produit est un peu dur à suivre. Il est généralement préférable d&amp;#039;utiliser les appels API d&amp;#039;OpenOffice.org mais parfois le dispatcheur d&amp;#039;appels UNO reste la seule la méthode (ou la plus facile) pour trouver les routines dont on a besoin.&lt;br /&gt;
&lt;br /&gt;
Pour une liste des appels du dispatcheur, voir: http://www.openoffice.org/files/documents/25/2570/commandsReference.html&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, trois versions de la même macro: &lt;br /&gt;
&lt;br /&gt;
*L&amp;#039;exemple produit par l&amp;#039;enregistreur&lt;br /&gt;
*Ré-arrangement des appels UNO (dispatcheur)&lt;br /&gt;
*Macro avec les appels API&lt;br /&gt;
&lt;br /&gt;
La séquence des opérations enregistrées sont: &lt;br /&gt;
&lt;br /&gt;
Taper &amp;quot;Du texte&amp;quot;; Appuyer &amp;#039;&amp;#039;&amp;#039;Entrée&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;Un nouveau paragraphe avec un &amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Gras &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;mot&amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Normal &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot; en gras à l&amp;#039;intérieur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Remarque:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|Cela pouvait être mieux fait autrement, mais cet exemple simple sert à illustrer le point que nous traitons.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemple sortie de l&amp;#039;enregisteur Ooo==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem define variables&lt;br /&gt;
    dim document   as object&lt;br /&gt;
    dim dispatcher as object&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem get access to the document&lt;br /&gt;
    document   = ThisComponent.CurrentController.Frame&lt;br /&gt;
    dispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args1(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args1(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args1(0).Value = &amp;quot;Du texte&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args1())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertPara&amp;quot;, &amp;quot;&amp;quot;, 0, Array())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args3(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args3(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args3(0).Value = &amp;quot;Un nouveau paragraph avec un &amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args3())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args4(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args4(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args4(0).Value = true&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args4())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args5(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args5(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args5(0).Value = &amp;quot;mot&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args5())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args6(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args6(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args6(0).Value = false&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args6())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args7(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args7(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args7(0).Value = &amp;quot; en gras à l&amp;#039;intéreur.&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args7())&lt;br /&gt;
     &lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ré-arrangement des appels UNO (dispatcheur)==&lt;br /&gt;
(Cette entête est liées à [[UNO Dispatch]], par conséquent si vous la modifier, changer aussi le lien.)&lt;br /&gt;
&lt;br /&gt;
Maintenant le même exemple ré-arrangé en utilisant une fonction pour appeler le dispatcheur d&amp;#039;appels UNO (certains appels UNO (Dispatch) retournent une valeur, par conséquent il est préférable d&amp;#039;utiliser une fonction pour avoir aussi ce retour. L&amp;#039;utilisation d&amp;#039;une procédure (sub) ferait perdre la totale compatibilité des deux méthodes.) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Du texte&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertPara&amp;quot;)&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Un nouveau paragraphe avec un &amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,true))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;mot&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,false))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot; en gras à l&amp;#039;intérieur.&amp;quot;))&lt;br /&gt;
    end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    function fnDispatch(sCommand as string, optional mArgs)&lt;br /&gt;
        oFrame = ThisComponent.getCurrentController.getFrame&lt;br /&gt;
        oDispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
        &amp;#039;on error resume next&lt;br /&gt;
        if isMissing(mArgs) then&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, array())&lt;br /&gt;
        else&lt;br /&gt;
            nArgs = uBound(mArgs) \ 2&lt;br /&gt;
            dim Args(nArgs) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
            for i = 0 to nArgs&lt;br /&gt;
                Args(i).name = mArgs(i * 2)&lt;br /&gt;
                Args(i).value = mArgs(i * 2 + 1)&lt;br /&gt;
            next&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, Args())&lt;br /&gt;
        end if&lt;br /&gt;
    end function&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Macro avec les appels API==&lt;br /&gt;
Finalement le même exemple en utilisant les appels API : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
        oText = oVC.text&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Du texte&amp;quot;, False)&lt;br /&gt;
        oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Un nouveau paragraphe avec un &amp;quot;, False)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.BOLD)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;mot&amp;quot;, false)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.NORMAL)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot; en gras a l&amp;#039;intérieur.&amp;quot;, false)&lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Traduction à partir de :&lt;br /&gt;
http://wiki.services.openoffice.org/wiki/The_OpenOffice.org_recorder_and_UNO_dispatch_calls&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132820</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132820"/>
		<updated>2009-06-23T15:28:24Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: (checkpoint save)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;L&amp;#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org fournit un enregistreur, pour enregistrer une série d&amp;#039;actions, dans &amp;#039;&amp;#039;&amp;#039;Writer et Calc seulement&amp;#039;&amp;#039;&amp;#039;. Il permet de produire du code. L&amp;#039;enregistreur écrit une série d&amp;#039;appels UNO (dispatch), qui ne sont pas particulièrement pratique pour apprendre le modèle API d&amp;#039;OpenOffice.org. Je trouve personnellement que le code produit est un peu dur à suivre. Il est généralement préférable d&amp;#039;utiliser les appels API d&amp;#039;OpenOffice.org mais parfois le dispatcheur d&amp;#039;appels UNO reste la seule la méthode (ou la plus facile) pour trouver les routines dont on a besoin.&lt;br /&gt;
&lt;br /&gt;
Pour une liste des appels du dispatcheur, voir: http://www.openoffice.org/files/documents/25/2570/commandsReference.html&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, trois versions de la même macro: &lt;br /&gt;
&lt;br /&gt;
*L&amp;#039;exemple produit par l&amp;#039;enregistreur&lt;br /&gt;
*Ré-arrangement des appels UNO (dispatcheur)&lt;br /&gt;
*Macro avec les appels API&lt;br /&gt;
&lt;br /&gt;
La séquence des opérations enregistrées sont: &lt;br /&gt;
&lt;br /&gt;
Taper &amp;quot;Du texte&amp;quot;; Appuyer &amp;#039;&amp;#039;&amp;#039;Entrée&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;Un nouveau paragraphe avec un &amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Gras &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;mot&amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Normal &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot; en gras à l&amp;#039;intérieur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Remarque:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|Cela pouvait être mieux fait autrement, mais cet exemple simple sert à illustrer le point que nous traitons.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemple sortie de l&amp;#039;enregisteur Ooo==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem define variables&lt;br /&gt;
    dim document   as object&lt;br /&gt;
    dim dispatcher as object&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem get access to the document&lt;br /&gt;
    document   = ThisComponent.CurrentController.Frame&lt;br /&gt;
    dispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args1(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args1(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args1(0).Value = &amp;quot;Du texte&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args1())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertPara&amp;quot;, &amp;quot;&amp;quot;, 0, Array())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args3(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args3(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args3(0).Value = &amp;quot;Un nouveau paragraph avec un &amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args3())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args4(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args4(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args4(0).Value = true&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args4())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args5(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args5(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args5(0).Value = &amp;quot;mot&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args5())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args6(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args6(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args6(0).Value = false&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args6())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args7(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args7(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args7(0).Value = &amp;quot; en gras à l&amp;#039;intéreur.&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args7())&lt;br /&gt;
     &lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ré-arrangement des appels UNO (dispatcheur)==&lt;br /&gt;
(Cette entête est liées à [[UNO Dispatch]], par conséquent si vous la modifier, changer aussi le lien.)&lt;br /&gt;
&lt;br /&gt;
Maintenant le même exemple ré-arrangé en utilisant une fonction pour appeler le dispatcheur d&amp;#039;appels UNO (certains appels UNO (Dispatch) retournent une valeur, par conséquent il est préférable d&amp;#039;utiliser une fonction pour avoir aussi ce retour. L&amp;#039;utilisation d&amp;#039;une procédure (sub) ferait perdre la totale compatibilité des deux méthodes.) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Du texte&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertPara&amp;quot;)&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Un nouveau paragraphe avec un &amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,true))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;mot&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,false))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot; en gras à l&amp;#039;intérieur.&amp;quot;))&lt;br /&gt;
    end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    function fnDispatch(sCommand as string, optional mArgs)&lt;br /&gt;
        oFrame = ThisComponent.getCurrentController.getFrame&lt;br /&gt;
        oDispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
        &amp;#039;on error resume next&lt;br /&gt;
        if isMissing(mArgs) then&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, array())&lt;br /&gt;
        else&lt;br /&gt;
            nArgs = uBound(mArgs) \ 2&lt;br /&gt;
            dim Args(nArgs) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
            for i = 0 to nArgs&lt;br /&gt;
                Args(i).name = mArgs(i * 2)&lt;br /&gt;
                Args(i).value = mArgs(i * 2 + 1)&lt;br /&gt;
            next&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, Args())&lt;br /&gt;
        end if&lt;br /&gt;
    end function&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Macro avec les appels API==&lt;br /&gt;
Finalement le même exemple en utilisant les appels API : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
        oText = oVC.text&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Du texte&amp;quot;, False)&lt;br /&gt;
        oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Un nouveau paragraphe avec un &amp;quot;, False)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.BOLD)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;mot&amp;quot;, false)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.NORMAL)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot; en gras a l&amp;#039;intérieur.&amp;quot;, false)&lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Traduction à partir de :&lt;br /&gt;
http://wiki.services.openoffice.org/wiki/The_OpenOffice.org_recorder_and_UNO_dispatch_calls&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132819</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132819"/>
		<updated>2009-06-23T15:22:55Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: (checkpoint save)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org fournit un enregistreur, pour enregistrer une série d&amp;#039;actions, dans &amp;#039;&amp;#039;&amp;#039;Writer et Calc seulement&amp;#039;&amp;#039;&amp;#039;. Il permet de produire du code. L&amp;#039;enregistreur écrit une série d&amp;#039;appels UNO (dispatch), qui ne sont pas particulièrement pratique pour apprendre le modèle API d&amp;#039;OpenOffice.org. Je trouve personnellement que le code produit est un peu dur à suivre. Il est généralement préférable d&amp;#039;utiliser les appels API d&amp;#039;OpenOffice.org mais parfois le dispatcheur d&amp;#039;appels UNO reste la seule la méthode (ou la plus facile) pour trouver les routines dont on a besoin.&lt;br /&gt;
&lt;br /&gt;
Pour une liste des appels du dispatcheur, voir: http://www.openoffice.org/files/documents/25/2570/commandsReference.html&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, trois versions de la même macro: &lt;br /&gt;
&lt;br /&gt;
*L&amp;#039;exemple produit par l&amp;#039;enregistreur&lt;br /&gt;
*Ré-arrangement des appels UNO (dispatcheur)&lt;br /&gt;
*Macro avec les appels API&lt;br /&gt;
&lt;br /&gt;
La séquence des opérations enregistrées sont: &lt;br /&gt;
&lt;br /&gt;
Taper &amp;quot;Du texte&amp;quot;; Appuyer &amp;#039;&amp;#039;&amp;#039;Entrée&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;Un nouveau paragraphe avec un &amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Gras &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;mot&amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Normal &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot; en gras à l&amp;#039;intérieur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Remarque:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|Cela pouvait être mieux fait autrement, mais cet exemple simple sert à illustrer le point que nous traitons.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemple sortie de l&amp;#039;enregisteur Ooo==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem define variables&lt;br /&gt;
    dim document   as object&lt;br /&gt;
    dim dispatcher as object&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem get access to the document&lt;br /&gt;
    document   = ThisComponent.CurrentController.Frame&lt;br /&gt;
    dispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args1(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args1(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args1(0).Value = &amp;quot;Du texte&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args1())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertPara&amp;quot;, &amp;quot;&amp;quot;, 0, Array())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args3(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args3(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args3(0).Value = &amp;quot;Un nouveau paragraph avec un &amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args3())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args4(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args4(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args4(0).Value = true&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args4())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args5(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args5(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args5(0).Value = &amp;quot;mot&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args5())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args6(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args6(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args6(0).Value = false&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args6())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args7(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args7(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args7(0).Value = &amp;quot; en gras à l&amp;#039;intéreur.&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args7())&lt;br /&gt;
     &lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ré-arrangement des appels UNO (dispatcheur)==&lt;br /&gt;
(Cette entête est liées à [[UNO Dispatch]], par conséquent si vous la modifier, changer aussi le lien.)&lt;br /&gt;
&lt;br /&gt;
Maintenant le même exemple ré-arrangé en utilisant une fonction pour appeler le dispatcheur d&amp;#039;appels UNO (certains appels UNO (Dispatch) retournent une valeur, par conséquent il est préférable d&amp;#039;utiliser une fonction pour avoir aussi ce retour. L&amp;#039;utilisation d&amp;#039;une procédure (sub) ferait perdre la totale compatibilité des deux méthodes.) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Du texte&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertPara&amp;quot;)&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Un nouveau paragraphe avec un &amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,true))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;mot&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,false))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot; en gras à l&amp;#039;intérieur.&amp;quot;))&lt;br /&gt;
    end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    function fnDispatch(sCommand as string, optional mArgs)&lt;br /&gt;
        oFrame = ThisComponent.getCurrentController.getFrame&lt;br /&gt;
        oDispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
        &amp;#039;on error resume next&lt;br /&gt;
        if isMissing(mArgs) then&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, array())&lt;br /&gt;
        else&lt;br /&gt;
            nArgs = uBound(mArgs) \ 2&lt;br /&gt;
            dim Args(nArgs) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
            for i = 0 to nArgs&lt;br /&gt;
                Args(i).name = mArgs(i * 2)&lt;br /&gt;
                Args(i).value = mArgs(i * 2 + 1)&lt;br /&gt;
            next&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, Args())&lt;br /&gt;
        end if&lt;br /&gt;
    end function&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Macro avec les appels API==&lt;br /&gt;
Finalement le même exemple en utilisant les appels API : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
        oText = oVC.text&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Du texte&amp;quot;, False)&lt;br /&gt;
        oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Un nouveau paragraphe avec un &amp;quot;, False)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.BOLD)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;mot&amp;quot;, false)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.NORMAL)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot; en gras a l&amp;#039;intérieur.&amp;quot;, false)&lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132818</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132818"/>
		<updated>2009-06-23T15:21:45Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: (checkpoint save)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org fournit un enregistreur, pour enregistrer une série d&amp;#039;actions, dans &amp;#039;&amp;#039;&amp;#039;Writer et Calc seulement&amp;#039;&amp;#039;&amp;#039;. Il permet de produire du code. L&amp;#039;enregistreur écrit une série d&amp;#039;appels UNO (dispatch), qui ne sont pas particulièrement pratique pour apprendre le modèle API d&amp;#039;OpenOffice.org. Je trouve personnellement que le code produit est un peu dur à suivre. Il est généralement préférable d&amp;#039;utiliser les appels API d&amp;#039;OpenOffice.org mais parfois le dispatcheur d&amp;#039;appels UNO reste la seule la méthode (ou la plus facile) pour trouver les routines dont on a besoin.&lt;br /&gt;
&lt;br /&gt;
Pour une liste des appels du dispatcheur, voir: http://www.openoffice.org/files/documents/25/2570/commandsReference.html&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, trois versions de la même macro: &lt;br /&gt;
&lt;br /&gt;
*L&amp;#039;exemple produit par l&amp;#039;enregistreur&lt;br /&gt;
*Ré-arrangement des appels UNO (dispatcheur)&lt;br /&gt;
*Macro avec les appels API&lt;br /&gt;
&lt;br /&gt;
La séquence des opérations enregistrées sont: &lt;br /&gt;
&lt;br /&gt;
Taper &amp;quot;Du texte&amp;quot; ; Appuyer &amp;#039;&amp;#039;&amp;#039;Entrée&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;Un nouveau paragraphe avec un &amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Gras &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;mot&amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Normal &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot; en gras à l&amp;#039;intérieur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Remarque :&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|Cela pouvait être mieux fait autrement, mais cet exemple simple sert à illustrer le point que nous traitons.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemple sortie de l&amp;#039;enregisteur Ooo==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem define variables&lt;br /&gt;
    dim document   as object&lt;br /&gt;
    dim dispatcher as object&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem get access to the document&lt;br /&gt;
    document   = ThisComponent.CurrentController.Frame&lt;br /&gt;
    dispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args1(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args1(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args1(0).Value = &amp;quot;Du texte&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args1())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertPara&amp;quot;, &amp;quot;&amp;quot;, 0, Array())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args3(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args3(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args3(0).Value = &amp;quot;Un nouveau paragraph avec un &amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args3())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args4(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args4(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args4(0).Value = true&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args4())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args5(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args5(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args5(0).Value = &amp;quot;mot&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args5())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args6(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args6(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args6(0).Value = false&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args6())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args7(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args7(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args7(0).Value = &amp;quot; en gras à l&amp;#039;intéreur.&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args7())&lt;br /&gt;
     &lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ré-arrangement des appels UNO (dispatcheur)==&lt;br /&gt;
(Cette entête est liées à [[UNO Dispatch]], par conséquent si vous la modifier, changer aussi le lien.)&lt;br /&gt;
&lt;br /&gt;
Maintenant le même exemple ré-arrangé en utilisant une fonction pour appeler le dispatcheur d&amp;#039;appels UNO (certains appels UNO (Dispatch) retournent une valeur, par conséquent il est préférable d&amp;#039;utiliser une fonction pour avoir aussi ce retour. L&amp;#039;utilisation d&amp;#039;une procédure (sub) ferait perdre la totale compatibilité des deux méthodes.) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Du texte&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertPara&amp;quot;)&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Un nouveau paragraphe avec un &amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,true))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;mot&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,false))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot; en gras à l&amp;#039;intérieur.&amp;quot;))&lt;br /&gt;
    end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    function fnDispatch(sCommand as string, optional mArgs)&lt;br /&gt;
        oFrame = ThisComponent.getCurrentController.getFrame&lt;br /&gt;
        oDispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
        &amp;#039;on error resume next&lt;br /&gt;
        if isMissing(mArgs) then&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, array())&lt;br /&gt;
        else&lt;br /&gt;
            nArgs = uBound(mArgs) \ 2&lt;br /&gt;
            dim Args(nArgs) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
            for i = 0 to nArgs&lt;br /&gt;
                Args(i).name = mArgs(i * 2)&lt;br /&gt;
                Args(i).value = mArgs(i * 2 + 1)&lt;br /&gt;
            next&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, Args())&lt;br /&gt;
        end if&lt;br /&gt;
    end function&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Macro avec les appels API==&lt;br /&gt;
Finalement le même exemple en utilisant les appels API : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
        oText = oVC.text&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Du texte&amp;quot;, False)&lt;br /&gt;
        oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Un nouveau paragraphe avec un &amp;quot;, False)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.BOLD)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;mot&amp;quot;, false)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.NORMAL)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot; en gras a l&amp;#039;intérieur.&amp;quot;, false)&lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132817</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132817"/>
		<updated>2009-06-23T15:21:16Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: (checkpoint save)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org fournit un enregistreur, pour enregistrer une série d&amp;#039;actions, dans &amp;#039;&amp;#039;&amp;#039;Writer et Calc seulement&amp;#039;&amp;#039;&amp;#039;. Il permet de produire du code. L&amp;#039;enregistreur écrit une série d&amp;#039;appels UNO (dispatch), qui ne sont pas particulièrement pratique pour apprendre le modèle API d&amp;#039;OpenOffice.org. Je trouve personnellement que le code produit est un peu dur à suivre. Il est généralement préférable d&amp;#039;utiliser les appels API d&amp;#039;OpenOffice.org mais parfois le dispatcheur d&amp;#039;appels UNO reste la seule la méthode (ou la plus facile) pour trouver les routines dont on a besoin.&lt;br /&gt;
&lt;br /&gt;
Pour une liste des appels du dispatcheur, voir : http://www.openoffice.org/files/documents/25/2570/commandsReference.html&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, trois versions de la même macro : &lt;br /&gt;
&lt;br /&gt;
*L&amp;#039;exemple produit par l&amp;#039;enregistreur&lt;br /&gt;
*Ré-arrangement des appels UNO (dispatcheur)&lt;br /&gt;
*Macro avec les appels API&lt;br /&gt;
&lt;br /&gt;
La séquence des opérations enregistrées sont : &lt;br /&gt;
&lt;br /&gt;
Taper &amp;quot;Du texte&amp;quot; ; Appuyer &amp;#039;&amp;#039;&amp;#039;Entrée&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;Un nouveau paragraphe avec un &amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Gras &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;mot&amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Normal &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot; en gras à l&amp;#039;intérieur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Remarque :&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|Cela pouvait être mieux fait autrement, mais cet exemple simple sert à illustrer le point que nous traitons.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemple sortie de l&amp;#039;enregisteur Ooo==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem define variables&lt;br /&gt;
    dim document   as object&lt;br /&gt;
    dim dispatcher as object&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem get access to the document&lt;br /&gt;
    document   = ThisComponent.CurrentController.Frame&lt;br /&gt;
    dispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args1(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args1(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args1(0).Value = &amp;quot;Du texte&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args1())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertPara&amp;quot;, &amp;quot;&amp;quot;, 0, Array())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args3(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args3(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args3(0).Value = &amp;quot;Un nouveau paragraph avec un &amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args3())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args4(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args4(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args4(0).Value = true&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args4())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args5(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args5(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args5(0).Value = &amp;quot;mot&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args5())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args6(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args6(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args6(0).Value = false&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args6())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args7(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args7(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args7(0).Value = &amp;quot; en gras à l&amp;#039;intéreur.&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args7())&lt;br /&gt;
     &lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ré-arrangement des appels UNO (dispatcheur)==&lt;br /&gt;
(Cette entête est liées à [[UNO Dispatch]], par conséquent si vous la modifier, changer aussi le lien.)&lt;br /&gt;
&lt;br /&gt;
Maintenant le même exemple ré-arrangé en utilisant une fonction pour appeler le dispatcheur d&amp;#039;appels UNO (certains appels UNO (Dispatch) retournent une valeur, par conséquent il est préférable d&amp;#039;utiliser une fonction pour avoir aussi ce retour. L&amp;#039;utilisation d&amp;#039;une procédure (sub) ferait perdre la totale compatibilité des deux méthodes.) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Du texte&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertPara&amp;quot;)&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Un nouveau paragraphe avec un &amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,true))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;mot&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,false))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot; en gras à l&amp;#039;intérieur.&amp;quot;))&lt;br /&gt;
    end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    function fnDispatch(sCommand as string, optional mArgs)&lt;br /&gt;
        oFrame = ThisComponent.getCurrentController.getFrame&lt;br /&gt;
        oDispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
        &amp;#039;on error resume next&lt;br /&gt;
        if isMissing(mArgs) then&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, array())&lt;br /&gt;
        else&lt;br /&gt;
            nArgs = uBound(mArgs) \ 2&lt;br /&gt;
            dim Args(nArgs) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
            for i = 0 to nArgs&lt;br /&gt;
                Args(i).name = mArgs(i * 2)&lt;br /&gt;
                Args(i).value = mArgs(i * 2 + 1)&lt;br /&gt;
            next&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, Args())&lt;br /&gt;
        end if&lt;br /&gt;
    end function&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Macro avec les appels API==&lt;br /&gt;
Finalement le même exemple en utilisant les appels API : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
        oText = oVC.text&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Du texte&amp;quot;, False)&lt;br /&gt;
        oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Un nouveau paragraphe avec un &amp;quot;, False)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.BOLD)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;mot&amp;quot;, false)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.NORMAL)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot; en gras a l&amp;#039;intérieur.&amp;quot;, false)&lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132816</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132816"/>
		<updated>2009-06-23T15:17:50Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org fournit un enregistreur, pour enregistrer une série d&amp;#039;actions, dans &amp;#039;&amp;#039;&amp;#039;Writer et Calc seulement&amp;#039;&amp;#039;&amp;#039;. Il permet de produire du code. L&amp;#039;enregistreur écrit une série d&amp;#039;appels UNO (dispatch), qui ne sont pas particulièrement pratique pour apprendre le modèle API d&amp;#039;OpenOffice.org. Je trouve personnellement que le code produit est un peu dur à suivre. Il est généralement préférable d&amp;#039;utiliser les appels API d&amp;#039;OpenOffice.org mais parfois le dispatcheur d&amp;#039;appels UNO reste la seule la méthode (ou la plus facile) pour trouver les routines dont on a besoin.&lt;br /&gt;
&lt;br /&gt;
Pour une liste des appels du dispatcheur, voir : http://www.openoffice.org/files/documents/25/2570/commandsReference.html&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, trois versions de la même macro : &lt;br /&gt;
&lt;br /&gt;
*L&amp;#039;exemple produit par l&amp;#039;enregistreur&lt;br /&gt;
*Ré-arrangement des appels UNO (dispatcheur)&lt;br /&gt;
*Macro avec les appels API&lt;br /&gt;
&lt;br /&gt;
La séquence des opérations enregistrées sont : &lt;br /&gt;
&lt;br /&gt;
Taper &amp;quot;Du texte&amp;quot; ; Appuyer &amp;#039;&amp;#039;&amp;#039;Entrée&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;Un nouveau paragraphe avec un &amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Gras &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;gras&amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; &amp;quot;Regular&amp;quot;&amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot; mot à l&amp;#039;intérieur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Remarque :&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|Cela pouvait être mieux fait autrement, mais cet exemple simple sert à illustrer le point que nous traitons.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemple sortie de l&amp;#039;enregisteur Ooo==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem define variables&lt;br /&gt;
    dim document   as object&lt;br /&gt;
    dim dispatcher as object&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem get access to the document&lt;br /&gt;
    document   = ThisComponent.CurrentController.Frame&lt;br /&gt;
    dispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args1(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args1(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args1(0).Value = &amp;quot;Du texte&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args1())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertPara&amp;quot;, &amp;quot;&amp;quot;, 0, Array())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args3(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args3(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args3(0).Value = &amp;quot;Un nouveau paragraph avec un &amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args3())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args4(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args4(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args4(0).Value = true&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args4())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args5(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args5(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args5(0).Value = &amp;quot;gras&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args5())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args6(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args6(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args6(0).Value = false&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args6())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args7(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args7(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args7(0).Value = &amp;quot; mot à l&amp;#039;intéreur.&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args7())&lt;br /&gt;
     &lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ré-arrangement des appels UNO (dispatcheur)==&lt;br /&gt;
(Cette entête est liées à [[UNO Dispatch]], par conséquent si vous la modifier, changer aussi le lien.)&lt;br /&gt;
&lt;br /&gt;
Maintenant le même exemple ré-arrangé en utilisant une fonction pour appeler le dispatcheur d&amp;#039;appels UNO (certains appels UNO (Dispatch) retournent une valeur, par conséquent il est préférable d&amp;#039;utiliser une fonction pour avoir aussi ce retour. L&amp;#039;utilisation d&amp;#039;une procédure (sub) ferait perdre la totale compatibilité des deux méthodes.) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Du texte&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertPara&amp;quot;)&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Un nouveau paragraphe avec un &amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,true))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;gras&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,false))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot; mot à l&amp;#039;intérieur.&amp;quot;))&lt;br /&gt;
    end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    function fnDispatch(sCommand as string, optional mArgs)&lt;br /&gt;
        oFrame = ThisComponent.getCurrentController.getFrame&lt;br /&gt;
        oDispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
        &amp;#039;on error resume next&lt;br /&gt;
        if isMissing(mArgs) then&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, array())&lt;br /&gt;
        else&lt;br /&gt;
            nArgs = uBound(mArgs) \ 2&lt;br /&gt;
            dim Args(nArgs) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
            for i = 0 to nArgs&lt;br /&gt;
                Args(i).name = mArgs(i * 2)&lt;br /&gt;
                Args(i).value = mArgs(i * 2 + 1)&lt;br /&gt;
            next&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, Args())&lt;br /&gt;
        end if&lt;br /&gt;
    end function&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Macro avec les appels API==&lt;br /&gt;
Finalement le même exemple en utilisant les appels API : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Exemple&lt;br /&gt;
        oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
        oText = oVC.text&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Du texte&amp;quot;, False)&lt;br /&gt;
        oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Un nouveau paragraphe avec un &amp;quot;, False)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.BOLD)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;gras&amp;quot;, false)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.NORMAL)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot; mot a l&amp;#039;intérieur.&amp;quot;, false)&lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132815</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132815"/>
		<updated>2009-06-23T15:16:35Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org fournit un enregistreur, pour enregistrer une série d&amp;#039;actions, dans &amp;#039;&amp;#039;&amp;#039;Writer et Calc seulement&amp;#039;&amp;#039;&amp;#039;. Il permet de produire du code. L&amp;#039;enregistreur écrit une série d&amp;#039;appels UNO (dispatch), qui ne sont pas particulièrement pratique pour apprendre le modèle API d&amp;#039;OpenOffice.org. Je trouve personnellement que le code produit est un peu dur à suivre. Il est généralement préférable d&amp;#039;utiliser les appels API d&amp;#039;OpenOffice.org mais parfois le dispatcheur d&amp;#039;appels UNO reste la seule la méthode (ou la plus facile) pour trouver les routines dont on a besoin.&lt;br /&gt;
&lt;br /&gt;
Pour une liste des appels du dispatcheur, voir : http://www.openoffice.org/files/documents/25/2570/commandsReference.html&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, trois versions de la même macro : &lt;br /&gt;
&lt;br /&gt;
*L&amp;#039;exemple produit par l&amp;#039;enregistreur&lt;br /&gt;
*Ré-arrangement des appels UNO (dispatcheur)&lt;br /&gt;
*Macro avec les appels API&lt;br /&gt;
&lt;br /&gt;
La séquence des opérations enregistrées sont : &lt;br /&gt;
&lt;br /&gt;
Taper &amp;quot;Du texte&amp;quot; ; Appuyer &amp;#039;&amp;#039;&amp;#039;Entrée&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;Un nouveau paragraphe avec un &amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Gras &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;gras&amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; &amp;quot;Regular&amp;quot;&amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot; mot à l&amp;#039;intérieur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Remarque :&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|Cela pouvait être mieux fait autrement, mais cet exemple simple sert à illustrer le point que nous traitons.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemple sortie de l&amp;#039;enregisteur Ooo==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem define variables&lt;br /&gt;
    dim document   as object&lt;br /&gt;
    dim dispatcher as object&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem get access to the document&lt;br /&gt;
    document   = ThisComponent.CurrentController.Frame&lt;br /&gt;
    dispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args1(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args1(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args1(0).Value = &amp;quot;Du texte&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args1())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertPara&amp;quot;, &amp;quot;&amp;quot;, 0, Array())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args3(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args3(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args3(0).Value = &amp;quot;Un nouveau paragraph avec un &amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args3())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args4(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args4(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args4(0).Value = true&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args4())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args5(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args5(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args5(0).Value = &amp;quot;gras&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args5())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args6(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args6(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args6(0).Value = false&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args6())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args7(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args7(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args7(0).Value = &amp;quot; mot à l&amp;#039;intéreur.&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args7())&lt;br /&gt;
     &lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ré-arrangement des appels UNO (dispatcheur)==&lt;br /&gt;
(Cette entête est liées à [[UNO Dispatch]], par conséquent si vous la modifier, changer aussi le lien.)&lt;br /&gt;
&lt;br /&gt;
Maintenant le même exemple ré-arrangé en utilisant une fonction pour appeler le dispatcheur d&amp;#039;appels UNO (certains appels UNO (Dispatch) retournent une valeur, par conséquent il est préférable d&amp;#039;utiliser une fonction pour avoir aussi ce retour. L&amp;#039;utilisation d&amp;#039;une procédure (sub) ferait perdre la totale compatibilité des deux méthodes.) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Du texte&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertPara&amp;quot;)&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Un nouveau paragraphe avec un &amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,true))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;gras&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,false))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot; mot à l&amp;#039;intérieur.&amp;quot;))&lt;br /&gt;
    end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    function fnDispatch(sCommand as string, optional mArgs)&lt;br /&gt;
        oFrame = ThisComponent.getCurrentController.getFrame&lt;br /&gt;
        oDispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
        &amp;#039;on error resume next&lt;br /&gt;
        if isMissing(mArgs) then&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, array())&lt;br /&gt;
        else&lt;br /&gt;
            nArgs = uBound(mArgs) \ 2&lt;br /&gt;
            dim Args(nArgs) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
            for i = 0 to nArgs&lt;br /&gt;
                Args(i).name = mArgs(i * 2)&lt;br /&gt;
                Args(i).value = mArgs(i * 2 + 1)&lt;br /&gt;
            next&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, Args())&lt;br /&gt;
        end if&lt;br /&gt;
    end function&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Macro avec les appels API==&lt;br /&gt;
Finalement le même exemple en utilisant les appels API : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
        oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
        oText = oVC.text&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Du texte&amp;quot;, False)&lt;br /&gt;
        oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Un nouveau paragraphe avec un &amp;quot;, False)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.BOLD)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;gras&amp;quot;, false)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.NORMAL)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot; mot a l&amp;#039;intérieur.&amp;quot;, false)&lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132813</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132813"/>
		<updated>2009-06-23T15:14:06Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: (checkpoint save)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org fournit un enregistreur, pour enregistrer une série d&amp;#039;actions, dans &amp;#039;&amp;#039;&amp;#039;Writer et Calc seulement&amp;#039;&amp;#039;&amp;#039;. Il permet de produire du code. L&amp;#039;enregistreur écrit une série d&amp;#039;appels UNO (dispatch), qui ne sont pas particulièrement pratique pour apprendre le modèle API d&amp;#039;OpenOffice.org. Je trouve personnelement que le code produit est un peu dur à suivre. Il est généralement préférable d&amp;#039;utiliser les appels API d&amp;#039;OpenOffice.org mais parfois le dispatcheur d&amp;#039;appels UNO reste la seule la méthode (ou la plus facile) de trouver les routines dont on a besoin.&lt;br /&gt;
&lt;br /&gt;
Pour une liste des appels du dispatcheur, voir : http://www.openoffice.org/files/documents/25/2570/commandsReference.html&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, trois versions de la même macro : &lt;br /&gt;
&lt;br /&gt;
*L&amp;#039;exemple produit par l&amp;#039;enregistreur&lt;br /&gt;
*Ré-arrangement des appels UNO (dispatcheur)&lt;br /&gt;
*Macro avec les appels API&lt;br /&gt;
&lt;br /&gt;
La séquence des opérations enregistrées sont : &lt;br /&gt;
&lt;br /&gt;
Taper &amp;quot;Du texte&amp;quot; ; Appuyer &amp;#039;&amp;#039;&amp;#039;Entrée&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;Un nouveau paragraphe avec un &amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; Gras &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;gras&amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Caractères… &amp;gt; &amp;quot;Regular&amp;quot;&amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot; mot à l&amp;#039;intérieur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Remarque :&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|Cela pouvait être mieux fait autrement, mais cet exemple simple sert à illustrer le point que nous traitons.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemple sortie de l&amp;#039;enregisteur Ooo==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem define variables&lt;br /&gt;
    dim document   as object&lt;br /&gt;
    dim dispatcher as object&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem get access to the document&lt;br /&gt;
    document   = ThisComponent.CurrentController.Frame&lt;br /&gt;
    dispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args1(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args1(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args1(0).Value = &amp;quot;Du texte&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args1())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertPara&amp;quot;, &amp;quot;&amp;quot;, 0, Array())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args3(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args3(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args3(0).Value = &amp;quot;Un nouveau paragraph avec un &amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args3())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args4(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args4(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args4(0).Value = true&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args4())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args5(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args5(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args5(0).Value = &amp;quot;gras&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args5())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args6(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args6(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args6(0).Value = false&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args6())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args7(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args7(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args7(0).Value = &amp;quot; mot à l&amp;#039;intéreur.&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args7())&lt;br /&gt;
     &lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ré-arrangement des appels UNO (dispatcheur)==&lt;br /&gt;
(Cette entête est liées à [[UNO Dispatch]], par conséquent si vous la modifier, changer aussi le lien.)&lt;br /&gt;
&lt;br /&gt;
Maintenant le même exemple ré-arrangé en utilisant une fonction pour appeler le dispatcheur d&amp;#039;appels UNO (certains appels UNO (Dispatch) retournent une valeur, par conséquent il est préférable d&amp;#039;utiliser une fonction pour avoir aussi ce retour. L&amp;#039;utilisation d&amp;#039;une procédure (sub) ferait perdre la totale compatibilité des deux méthodes.) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Du texte&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertPara&amp;quot;)&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Un nouveau paragraphe avec un &amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,true))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;gras&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,false))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot; mot à l&amp;#039;intérieur.&amp;quot;))&lt;br /&gt;
    end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    function fnDispatch(sCommand as string, optional mArgs)&lt;br /&gt;
        oFrame = ThisComponent.getCurrentController.getFrame&lt;br /&gt;
        oDispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
        &amp;#039;on error resume next&lt;br /&gt;
        if isMissing(mArgs) then&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, array())&lt;br /&gt;
        else&lt;br /&gt;
            nArgs = uBound(mArgs) \ 2&lt;br /&gt;
            dim Args(nArgs) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
            for i = 0 to nArgs&lt;br /&gt;
                Args(i).name = mArgs(i * 2)&lt;br /&gt;
                Args(i).value = mArgs(i * 2 + 1)&lt;br /&gt;
            next&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, Args())&lt;br /&gt;
        end if&lt;br /&gt;
    end function&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Macro avec les appels API==&lt;br /&gt;
Finalement le même exemple en utilisant les appels API : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
        oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
        oText = oVC.text&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Du texte&amp;quot;, False)&lt;br /&gt;
        oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Un nouveau paragraphe avec un &amp;quot;, False)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.BOLD)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;gras&amp;quot;, false)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.NORMAL)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot; mot a l&amp;#039;intérieur.&amp;quot;, false)&lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132803</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132803"/>
		<updated>2009-06-23T14:32:14Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: (checkpoint save)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org fourni un enregistreur, pour enregistrer une série d&amp;#039;actions, dans &amp;#039;&amp;#039;&amp;#039;Writer et Calc seulement&amp;#039;&amp;#039;&amp;#039;, pour produire du code. L&amp;#039;enregistreur produit une série d&amp;#039;appels UNO (dispatch), qui ne sont pas particulièrement pratique pour apprendre le modèle API d&amp;#039;OpenOffice.org. Je trouve personnelement que le code que produit l&amp;#039;enregistreur est un peu dur à suivre. Il est généralement préférable d&amp;#039;utiliser les appels API d&amp;#039;OpenOffice.org mais parfois le dispatcheur d&amp;#039;appels UNO reste la seule la méthode (ou la plus facile) de trouver les routines dont on a besoin.&lt;br /&gt;
&lt;br /&gt;
Pour une liste des appels du dispatcheur, voir : http://www.openoffice.org/files/documents/25/2570/commandsReference.html&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, trois versions de la même macro : &lt;br /&gt;
&lt;br /&gt;
*L&amp;#039;exemple produit par l&amp;#039;enregistreur&lt;br /&gt;
*Ré-arrangement des appels UNO (dispatcheur)&lt;br /&gt;
*Macro avec les appels API&lt;br /&gt;
&lt;br /&gt;
La séquence des opérations enregistrées sont : &lt;br /&gt;
&lt;br /&gt;
Taper &amp;quot;Some text&amp;quot; ; Appuyer &amp;#039;&amp;#039;&amp;#039;Entrée&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;A new paragraph with a &amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Character… &amp;gt; Bold &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Type &amp;quot;bold&amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Character… &amp;gt; Regular&amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot; word in it&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|This would be best handled with autotext, but this simple example demonstrates the point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemple sortie de l&amp;#039;enregisteur Ooo==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem define variables&lt;br /&gt;
    dim document   as object&lt;br /&gt;
    dim dispatcher as object&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem get access to the document&lt;br /&gt;
    document   = ThisComponent.CurrentController.Frame&lt;br /&gt;
    dispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args1(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args1(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args1(0).Value = &amp;quot;Some text&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args1())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertPara&amp;quot;, &amp;quot;&amp;quot;, 0, Array())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args3(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args3(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args3(0).Value = &amp;quot;A new paragraph with a &amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args3())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args4(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args4(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args4(0).Value = true&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args4())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args5(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args5(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args5(0).Value = &amp;quot;bold&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args5())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args6(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args6(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args6(0).Value = false&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args6())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args7(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args7(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args7(0).Value = &amp;quot; word in it.&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args7())&lt;br /&gt;
     &lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ré-arrangement des appels UNO (dispatcheur)==&lt;br /&gt;
(This heading is linked to from [[ UNO Dispatch]], so if you change it change the link as well.) &lt;br /&gt;
&lt;br /&gt;
Now the same example having been tidied using a function for calling the UNO dispatch calls (some UNO Dispatch calls return a value so using a function makes it more generically useful than a sub): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Some text&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertPara&amp;quot;)&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;A new paragraph with a &amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,true))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;bold&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,false))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot; word in it.&amp;quot;))&lt;br /&gt;
    end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    function fnDispatch(sCommand as string, optional mArgs)&lt;br /&gt;
        oFrame = ThisComponent.getCurrentController.getFrame&lt;br /&gt;
        oDispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
        &amp;#039;on error resume next&lt;br /&gt;
        if isMissing(mArgs) then&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, array())&lt;br /&gt;
        else&lt;br /&gt;
            nArgs = uBound(mArgs) \ 2&lt;br /&gt;
            dim Args(nArgs) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
            for i = 0 to nArgs&lt;br /&gt;
                Args(i).name = mArgs(i * 2)&lt;br /&gt;
                Args(i).value = mArgs(i * 2 + 1)&lt;br /&gt;
            next&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, Args())&lt;br /&gt;
        end if&lt;br /&gt;
    end function&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Macro avec les appels API==&lt;br /&gt;
Finalement le même exemple en utilisant les appels API : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
        oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
        oText = oVC.text&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Some text&amp;quot;, False)&lt;br /&gt;
        oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;A new paragraph with a &amp;quot;, False)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.BOLD)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;bold&amp;quot;, false)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.NORMAL)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot; word in it.&amp;quot;, false)&lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132801</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132801"/>
		<updated>2009-06-23T14:22:49Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch) (checkpoint save)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org fourni un enregistreur, pour enregistrer une série d&amp;#039;actions, dans &amp;#039;&amp;#039;&amp;#039;Writer et Calc seulement&amp;#039;&amp;#039;&amp;#039;, pour produire du code. L&amp;#039;enregistreur produit une série d&amp;#039;appels UNO (dispatch), qui ne sont pas particulièrement pratique pour apprendre le modèle API d&amp;#039;OpenOffice.org. Je trouve personnelement que le code que produit l&amp;#039;enregistreur est un peu dur à suivre. Il est généralement préférable d&amp;#039;utiliser les appels API d&amp;#039;OpenOffice.org mais parfois le dispatcheur d&amp;#039;appels UNO reste la seule la méthode (ou la plus facile) de trouver les routines dont on a besoin.&lt;br /&gt;
&lt;br /&gt;
Pour une liste des appels du dispatcheur, voir : http://www.openoffice.org/files/documents/25/2570/commandsReference.html&lt;br /&gt;
&lt;br /&gt;
Ci-dessous, trois versions de la même macro : &lt;br /&gt;
&lt;br /&gt;
*L&amp;#039;exemple produit par l&amp;#039;enregistreur&lt;br /&gt;
*Ré-arrangement des appels UNO (dispatcheur)&lt;br /&gt;
*Macro avec les appels API&lt;br /&gt;
&lt;br /&gt;
La séquence des opérations enregistrées sont : &lt;br /&gt;
&lt;br /&gt;
Taper &amp;quot;Some text&amp;quot; ; Appuyer &amp;#039;&amp;#039;&amp;#039;Entrée&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot;A new paragraph with a &amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Character… &amp;gt; Bold &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Type &amp;quot;bold&amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Character… &amp;gt; Regular&amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Taper &amp;quot; word in it&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|This would be best handled with autotext, but this simple example demonstrates the point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Recorded example==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem define variables&lt;br /&gt;
    dim document   as object&lt;br /&gt;
    dim dispatcher as object&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem get access to the document&lt;br /&gt;
    document   = ThisComponent.CurrentController.Frame&lt;br /&gt;
    dispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args1(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args1(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args1(0).Value = &amp;quot;Some text&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args1())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertPara&amp;quot;, &amp;quot;&amp;quot;, 0, Array())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args3(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args3(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args3(0).Value = &amp;quot;A new paragraph with a &amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args3())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args4(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args4(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args4(0).Value = true&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args4())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args5(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args5(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args5(0).Value = &amp;quot;bold&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args5())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args6(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args6(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args6(0).Value = false&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args6())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args7(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args7(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args7(0).Value = &amp;quot; word in it.&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args7())&lt;br /&gt;
     &lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ré-arrangement des appels UNO (dispatcheur)==&lt;br /&gt;
(This heading is linked to from [[ UNO Dispatch]], so if you change it change the link as well.) &lt;br /&gt;
&lt;br /&gt;
Now the same example having been tidied using a function for calling the UNO dispatch calls (some UNO Dispatch calls return a value so using a function makes it more generically useful than a sub): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Some text&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertPara&amp;quot;)&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;A new paragraph with a &amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,true))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;bold&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,false))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot; word in it.&amp;quot;))&lt;br /&gt;
    end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    function fnDispatch(sCommand as string, optional mArgs)&lt;br /&gt;
        oFrame = ThisComponent.getCurrentController.getFrame&lt;br /&gt;
        oDispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
        &amp;#039;on error resume next&lt;br /&gt;
        if isMissing(mArgs) then&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, array())&lt;br /&gt;
        else&lt;br /&gt;
            nArgs = uBound(mArgs) \ 2&lt;br /&gt;
            dim Args(nArgs) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
            for i = 0 to nArgs&lt;br /&gt;
                Args(i).name = mArgs(i * 2)&lt;br /&gt;
                Args(i).value = mArgs(i * 2 + 1)&lt;br /&gt;
            next&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, Args())&lt;br /&gt;
        end if&lt;br /&gt;
    end function&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Macro avec les appels API==&lt;br /&gt;
Finalement le même exemple en utilisant les appels API : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
        oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
        oText = oVC.text&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Some text&amp;quot;, False)&lt;br /&gt;
        oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;A new paragraph with a &amp;quot;, False)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.BOLD)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;bold&amp;quot;, false)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.NORMAL)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot; word in it.&amp;quot;, false)&lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=The_OpenOffice.org_recorder_and_UNO_dispatch_calls&amp;diff=132800</id>
		<title>The OpenOffice.org recorder and UNO dispatch calls</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=The_OpenOffice.org_recorder_and_UNO_dispatch_calls&amp;diff=132800"/>
		<updated>2009-06-23T14:20:42Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: The OpenOffice.org recorder and UNO dispatch calls moved to L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch): Traduction de la page:
The OpenOffice.org recorder and UNO dispatch calls&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch)]]&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132799</id>
		<title>L&#039;enregistreur de macro OpenOffice.org et les appels UNO (dispatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=L%27enregistreur_de_macro_OpenOffice.org_et_les_appels_UNO_(dispatch)&amp;diff=132799"/>
		<updated>2009-06-23T14:20:42Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: The OpenOffice.org recorder and UNO dispatch calls moved to L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO (dispatch): Traduction de la page:
The OpenOffice.org recorder and UNO dispatch calls&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;The OpenOffice.org recorder and UNO dispatch calls&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
OpenOffice.org provides a recorder, to record a series of actions, in &amp;#039;&amp;#039;&amp;#039;Writer and Calc only&amp;#039;&amp;#039;&amp;#039;, to produce some code. The recorder produces a series of UNO dispatch calls, which are not particularly useful for learning the OpenOffice.org API model. I personally find the code that the recorder produces to be a little hard to follow. It is generally considered preferable to use OpenOffice.org API calls but sometimes the only way or most convenient way is to use UNO dispatch calls.&lt;br /&gt;
&lt;br /&gt;
For a list of dispatch calls see: http://www.openoffice.org/files/documents/25/2570/commandsReference.html&lt;br /&gt;
&lt;br /&gt;
Below are three versions of the same macro: &lt;br /&gt;
&lt;br /&gt;
*Recorded example&lt;br /&gt;
*Tidied UNO dispatch calls&lt;br /&gt;
*API Calls&lt;br /&gt;
&lt;br /&gt;
The series of steps recorded were: &lt;br /&gt;
&lt;br /&gt;
Type &amp;quot;Some text&amp;quot; ; Press &amp;#039;&amp;#039;&amp;#039;Enter&amp;#039;&amp;#039;&amp;#039;; Type &amp;quot;A new paragraph with a &amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Character… &amp;gt; Bold &amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Type &amp;quot;bold&amp;quot;; &amp;#039;&amp;#039;&amp;#039;Format &amp;gt; Character… &amp;gt; Regular&amp;gt; OK&amp;#039;&amp;#039;&amp;#039;; Type &amp;quot; word in it&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|This would be best handled with autotext, but this simple example demonstrates the point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Recorded example==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem define variables&lt;br /&gt;
    dim document   as object&lt;br /&gt;
    dim dispatcher as object&lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    rem get access to the document&lt;br /&gt;
    document   = ThisComponent.CurrentController.Frame&lt;br /&gt;
    dispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args1(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args1(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args1(0).Value = &amp;quot;Some text&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args1())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertPara&amp;quot;, &amp;quot;&amp;quot;, 0, Array())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args3(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args3(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args3(0).Value = &amp;quot;A new paragraph with a &amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args3())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args4(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args4(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args4(0).Value = true&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args4())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args5(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args5(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args5(0).Value = &amp;quot;bold&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args5())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args6(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args6(0).Name = &amp;quot;Bold&amp;quot;&lt;br /&gt;
    args6(0).Value = false&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:Bold&amp;quot;, &amp;quot;&amp;quot;, 0, args6())&lt;br /&gt;
     &lt;br /&gt;
    rem ----------------------------------------------------------------------&lt;br /&gt;
    dim args7(0) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
    args7(0).Name = &amp;quot;Text&amp;quot;&lt;br /&gt;
    args7(0).Value = &amp;quot; word in it.&amp;quot;&lt;br /&gt;
     &lt;br /&gt;
    dispatcher.executeDispatch(document, &amp;quot;.uno:InsertText&amp;quot;, &amp;quot;&amp;quot;, 0, args7())&lt;br /&gt;
     &lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tidied UNO dispatch calls==&lt;br /&gt;
(This heading is linked to from [[ UNO Dispatch]], so if you change it change the link as well.) &lt;br /&gt;
&lt;br /&gt;
Now the same example having been tidied using a function for calling the UNO dispatch calls (some UNO Dispatch calls return a value so using a function makes it more generically useful than a sub): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;Some text&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertPara&amp;quot;)&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;A new paragraph with a &amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,true))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot;bold&amp;quot;))&lt;br /&gt;
        fnDispatch(&amp;quot;Bold&amp;quot;, array(&amp;quot;Bold&amp;quot;,false))&lt;br /&gt;
        fnDispatch(&amp;quot;InsertText&amp;quot;, array(&amp;quot;Text&amp;quot;,&amp;quot; word in it.&amp;quot;))&lt;br /&gt;
    end sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    function fnDispatch(sCommand as string, optional mArgs)&lt;br /&gt;
        oFrame = ThisComponent.getCurrentController.getFrame&lt;br /&gt;
        oDispatcher = createUnoService(&amp;quot;com.sun.star.frame.DispatchHelper&amp;quot;)&lt;br /&gt;
        &amp;#039;on error resume next&lt;br /&gt;
        if isMissing(mArgs) then&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, array())&lt;br /&gt;
        else&lt;br /&gt;
            nArgs = uBound(mArgs) \ 2&lt;br /&gt;
            dim Args(nArgs) as new com.sun.star.beans.PropertyValue&lt;br /&gt;
            for i = 0 to nArgs&lt;br /&gt;
                Args(i).name = mArgs(i * 2)&lt;br /&gt;
                Args(i).value = mArgs(i * 2 + 1)&lt;br /&gt;
            next&lt;br /&gt;
            fnDispatch = oDispatcher.executeDispatch(oFrame, &amp;quot;.uno:&amp;quot; &amp;amp; sCommand, &amp;quot;&amp;quot;, 0, Args())&lt;br /&gt;
        end if&lt;br /&gt;
    end function&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==API calls==&lt;br /&gt;
Finally the same example using API calls: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    sub Example&lt;br /&gt;
        oVC = thisComponent.getCurrentController.getViewCursor&lt;br /&gt;
        oText = oVC.text&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;Some text&amp;quot;, False)&lt;br /&gt;
        oText.insertControlCharacter(oVC, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;A new paragraph with a &amp;quot;, False)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.BOLD)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot;bold&amp;quot;, false)&lt;br /&gt;
        oVC.setPropertyValue(&amp;quot;CharWeight&amp;quot;, com.sun.star.awt.FontWeight.NORMAL)&lt;br /&gt;
        oText.insertString(oVC, &amp;quot; word in it.&amp;quot;, false)&lt;br /&gt;
    end sub&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
	<entry>
		<id>https://wiki.openoffice.org/w/index.php?title=User:Rackamlerouge/Collections/L%27enregistreur_de_macro_OpenOffice.org_et_les_Appels_UNO&amp;diff=132796</id>
		<title>User:Rackamlerouge/Collections/L&#039;enregistreur de macro OpenOffice.org et les Appels UNO</title>
		<link rel="alternate" type="text/html" href="https://wiki.openoffice.org/w/index.php?title=User:Rackamlerouge/Collections/L%27enregistreur_de_macro_OpenOffice.org_et_les_Appels_UNO&amp;diff=132796"/>
		<updated>2009-06-23T13:52:54Z</updated>

		<summary type="html">&lt;p&gt;Rackamlerouge: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== L&amp;#039;enregistreur de macro OpenOffice.org et les Appels UNO ==&lt;br /&gt;
:[[The OpenOffice.org recorder and UNO dispatch calls]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Collections]]&lt;/div&gt;</summary>
		<author><name>Rackamlerouge</name></author>
	</entry>
</feed>