FR/Documentation/Composants et boite de dialogue
Nous allons réaliser une boîte de dialogue pour faire fonctionner notre compteur, ce sera le fil conducteur de ce chapitre. L'idée est d'utiliser l'environnement OOoBasic, car il est aisé d'y créer des boîtes de dialogue. Comme on va le voir tout au long de ce chapitre, il existe plusieurs méthodes pour faciliter l'utilisation d'un composant à l'aide des boîtes de dialogue. La première solution que l'on se propose d'examiner consiste à ne rien changer du code C++ du composant mais à enrober ce code par du OOoBasic et à utiliser ainsi les facilités de la gestion des sous-programmes OOoBasic par des boutons d'une boîte de dialogue.
Ajouter une boîte de dialogue au compteur avec le Basic
Rappelons pour information que notre compteur dispose de quatre méthodes :
- increment
- decrement
- setCount
- getCount
On va donc chercher à réaliser une boîte de dialogue qui va proposer un bouton par méthode. Elle proposera d'autre part deux champs texte :
- un champ texte pour positionner une valeur dans le compteur (donc associé au bouton setCount)
- un champ texte pour afficher la valeur du compteur (donc associé au bouton getCount)
Pour se faire une idée de quoi il s'agit, voici une image de la boîte de dialogue
Pour faire fonctionner l'ensemble on peut tout simplement utiliser le code OOoBasic suivant :
'Listing 1
REM ***** BASIC *****
Dim oSimpleComponent
Dim oDialog
Sub demonstrateSimpleComponent
oSimpleComponent = CreateUnoService( "foo.Counter" )
'oInspector = createUnoService("org.openoffice.InstanceInspector")
'oInspector.inspect(oSimpleComponent, "MyCounter")
'XRay oSimpleComponent
oDialog=CreateUnoDialog(DialogLibraries.Standard.Dialog1)
oDialog.Execute()
oDialog.dispose()
End Sub
Sub increment
oSimpleComponent.increment()
End Sub
Sub decrement
oSimpleComponent.decrement()
End Sub
Sub getCount
Dim oTextField
oTextField = oDialog.getControl("TextField2")
oTextField.setText( oSimpleComponent.getCount())
End Sub
Sub setCount
Dim oTextField
oTextField = oDialog.getControl("TextField1")
'implicit conversion String to Integer
oSimpleComponent.setCount(oTextField.getText())
End Sub
en prenant soin d'associer aux boutons les sous-programmes OOoBasic correspondants. Dans ce programme on a laissé en commentaire les différentes façons de réaliser l'introspection sur notre compteur, mais ceci n'a pas grand intérêt pour ce qui nous préoccupe. Template:Documentation/Note
Appel direct des méthodes du compteur à l'aide du service d'Introspection
Comme indiqué dans le Developer's Guide, depuis la version 2.0.4 il est possible d'associer directement des méthodes d'un composant à des événements de boutons (ou autres contrôles). Une autre façon de dire les choses, c'est que l'enrobage que l'on a utilisé dans la section précédente du genre :
'Listing 2
REM ***** BASIC *****
Sub increment
oSimpleComponent.increment()
End Sub
n'est plus nécessaire. Mais ceci a un coût : on ne pourra pas toujours garder le composant sans en modifier le code C++. Pour commencer par le plus simple, nous allons modifier notre programme OOoBasic, notre boîte de dialogue mais pas notre compteur.
Appel direct d'une méthode du compteur sans changer son code
On reprend en le modifiant le programme OOoBasic précédent pour qu'il utilise le service com.sun.star.awt.DialogProvider2 qui nous fournit la méthode "createDialogWithHandler" qui nous intéresse. Voici le programme correspondant :
'Listing 3
REM ***** BASIC *****
Dim oSimpleComponent
Dim oDialog
Sub demonstrateSimpleComponent
oSimpleComponent = CreateUnoService( "foo.Counter" )
oCreateDialog2=CreateUnoService("com.sun.star.awt.DialogProvider2")
'Merci ms777 pour la ligne suivante (voir http://www.oooforum.org/forum/viewtopic.phtml?t=84168)
oCreateDialog2.initialize(Array(ThisComponent))
oDialog=oCreateDialog2.createDialogWithHandler("vnd.sun.star.script:Standard.Dialog1?location=document", _
oSimpleComponent, StarDesktop.getActiveFrame() )
oDialog.Execute()
oDialog.dispose()
End Sub
'Sub increment
' oSimpleComponent.increment()
'End Sub
Sub decrement
oSimpleComponent.decrement()
End Sub
Sub getCount
Dim oTextField
oTextField = oDialog.getControl("TextField2")
oTextField.setText( oSimpleComponent.getCount())
End Sub
Sub setCount
Dim oTextField
oTextField = oDialog.getControl("TextField1")
'implicit conversion String to Integer
oSimpleComponent.setCount(oTextField.getText())
End Sub
Comme vous pouvez le voir, j'ai mis en commentaire le sous-programme OOoBasic "increment", il ne peut donc plus fonctionner. En fait j'ai modifié aussi la boîte de dialogue pour que le bouton "increment" n'appelle plus un sous-programme de macro, mais directement une méthode du composant counter. Cette page en anglais du Developer's Guide explique comment on procède pour cela. La partie initialisation s'en trouve légèrement changée. Template:Documentation/Note Il nous est possible de poursuivre comme cela avec la méthode decrement du compteur, mais impossible de continuer avec les deux autres méthodes "setCount" et "getCount". Pour comprendre pourquoi, il faut se poser la question de savoir comment tout cela fonctionne. En fait dans ce cas précis c'est le service d'introspection com.sun.star.beans.Introspection qui va être utilisé automatiquement pour retrouver la méthode. Mais cette introspection automatique n'est capable de retrouver que les méthodes ayant pour signature :
void [nomMethod](void);
ou encore
void [nomMethod]
(
[in] com::sun::star::awt::XDialog xDialog,
[in] any aEvent
);
et cela tombe bien parce que nos deux premières méthodes "increment" et "decrement" ont cette signature là, mais ce n'est pas le cas des deux suivantes "setCount" et "getCount". Si l'on veut les faire fonctionner avec le même principe que celui déjà invoqué, il nous faudra retirer les paramètres correspondants. C'est ce que l'on a fait en OOoBasic lorsqu'on a enrobé les méthodes C++ : regardez le "Sub getCount" en OOoBasic n'a plus de paramètre dans le listing 3 !
Appel direct de toutes les méthodes du compteur
Dans cette section nous allons chercher à modifier le compteur pour qu'il fonctionne complètement par appel direct de toutes ses méthodes.
Retour à la page d'accueil
Page d'accueil du développement C++ à l'aide du SDK
Voir aussi
- Version anglaise de ce chapitre
- Construire des composants
- Le paragraphe consacré au sujet dans le Developer's Guide
- La description du langage OOoBasic
- La gestion des boîtes de dialogue en OOoBasic.
- Objects contextuels en OOoBasic