OOobbs/44
質問
ダイアログ上にマクロでコントロールを配置したいので調べたところ addControl()というメソッドを見つけました。 ですが、使い方がよくわかりません。 addControl( [in] string [in] XControl Name, Control ); 1つ目の引数は、コントロールの名前を指定するんだと思いますが、 2つ目の引数がわかりません。 追加したいコントロールを指定するんだろうとは思いますが どういう書き方をしたらいいのかがわかりません。 ご回答を頂けると幸いです。 よろしくお願いします。 回答
マクロでダイアログにコントロールを配置するには,たとえば次のようにします。すこし長いのですが。次の絵のようなダイアログが作成できます。 Sub MainDialog() Dim oDialog As Object Dim oManager As Object Dim oTextModel As Object, oClose As Object, oListModel As Object oManager = GetProcessServiceManager() oDialogModel = oManager.createInstance("com.sun.star.awt.UnoControlDialogModel") With oDialogModel .setPropertyValue("Name","Dialog") .setPropertyValue( "PositionX", 100 ) .setPropertyValue( "PositionY", 60 ) .setPropertyValue( "Height", 175 ) .setPropertyValue( "Width", 157 ) .setPropertyValue( "Title", "Menu" ) End With oTextModel = oDialogModel.createInstance("com.sun.star.awt.UnoControlEditModel") With oTextModel .setPropertyValue( "Name", "Contents" ) .setPropertyValue( "PositionX", 4 ) .setPropertyValue( "PositionY", 21 ) .setPropertyValue( "Width", 149 ) .setPropertyValue( "Height", 150 ) .setPropertyValue("MultiLine",true) .setPropertyValue("VScroll",true) .setPropertyValue("HardLineBreaks",false) .setPropertyValue("Border",2) End With oClose = oDialogModel.createInstance("com.sun.star.awt.UnoControlButtonModel") With oClose .setPropertyValue( "Name", "Close" ) .setPropertyValue( "PositionX", 123 ) .setPropertyValue( "PositionY", 4 ) .setPropertyValue( "Width", 30 ) .setPropertyValue( "Height", 12 ) .setPropertyValue("Label","Close") .setPropertyValue("PushButtonType",2) End With oListModel = oDialogModel.createInstance("com.sun.star.awt.UnoControlComboBoxModel") With oListModel .setPropertyValue( "Name", "List" ) .setPropertyValue( "PositionX", 4 ) .setPropertyValue( "PositionY", 4 ) .setPropertyValue( "Width", 70 ) .setPropertyValue( "Height", 13 ) .setPropertyValue( "Dropdown",true) End With With oDialogModel .insertByName("Contents",oTextModel) .insertByName("Close",oClose) .insertByName("List", oListModel) End With oDialog = oManager.createInstance("com.sun.star.awt.UnoControlDialog") oDialog.setModel(oDialogModel) oList = oDialog.getControl("List") With oList .addItems(Array("Else","Properties","Methods"),0) .setText("Else") End With oDialog.setVisible(true) oDialog.execute() End Sub 順に説明していきます。
まずは,GlobalServiceManager を GetProcessServiceManager ランタイム関数を利用して取得します。これを利用してさまざまなダイアログやコントロールのサービスをインスタンス化します。 つぎに,ダイアログのモデルオブジェクトを作成します。そして,そのダイアログも出るオブジェクトのプロパティーを設定することでダイアログが表示されたときの見た目 (外観やサイズなど) を設定します。まずはサービスのインスタンス化です。サービスは com.sun.star.awt.UnoControlDialogModel です。 oDialogModel = oManager.createInstance("com.sun.star.awt.UnoControlDialogModel") ここで作成した oDialogModel オブジェクトは次のようにして作成されるオブジェクトと同じものです。 Dim oDialog As Object, oDialogModel As Object oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1) oDialogModel = oDialog.getModel() このオブジェクトのプロパティーとしてダイアログのサイズなどを指定しておきます。 各コントロールのモデルオブジェクトもやはりサービスをインスタンス化して作成します。 テキストコントロールは oTextModel = oDialogModel.createInstance("com.sun.star.awt.UnoControlEditModel") コマンドボタンオブジェクトは oClose = oDialogModel.createInstance("com.sun.star.awt.UnoControlButtonModel") などのようなサービスを使用します。 これらのコントロールには,「Name, PositionX, PositionY, Width, Height」などが必要です。 ダイアログモデルオブジェクトに各コントロールを insertByName メソッドを使用して追加します。 With oDialogModel .insertByName("Contents",oTextModel) .insertByName("Close",oClose) .insertByName("List", oListModel) End With つぎに,ダイアログオブジェクトのインスタンスを作成します。 oDialog = oManager.createInstance("com.sun.star.awt.UnoControlDialog") そのダイアログオブジェクトにダイアログモデルを設定します。 oDialog.setModel(oDialogModel) これでダイアログにコントロールの追加ができました。 このようにして作成したダイアログは execute メソッドでそのまま表示しようとしても表示されません。次のようにしてダイアログが見えるように設定します。 oDialog.setVisible(true) 最後に,ダイアログを呼び出して表示させます。 oDialog.execute()
イベントの記述ですが,これにはリスナーを使用します。使用するのは ActionListener です。これは com.sun.star.awt.XActionListener です。 リスナーの作成方法は次のとおりです。 Dim oActionListener As Object oActionListener = CreateUnoListener("ActionListener_", "com.sun.star.awt.XActionListener") 上記のようにして作成したリスナーを次のようにしてコントロールへ追加します。 Dim oCloseButton As Object oCloseButton = oDialog.getControl("CommandButton1") oCloseButton.addActionListener(oActionListener) リスナー用の準備が必要で,ActionListener の場合は actionPerformed メソッドがある (IDL Reference から) のでそれを用意しておきます。このとき,特殊な決まりがあります。アクションリスナーを作成する際にアクションリスナー名を "ActionListener_" としましたが,これは「"適当な名前" + "_" (アンダースコア) 」とする必要があります。 Sub ActionListener_actionPerformed(oEvent) MsgBox oEvent.Source.Dbg_Properties MsgBox oEvent.Source.getModel().Dbg_Properties End Sub Sub ActionListener_disposing() End Sub disposing メソッドは全てのリスナーに備えられているメソッドなので,これも同じように作成しておきます。 こうすると,ボタンを押したときに ActionListener_actionPerformed が呼び出されます。 ここでは,コマンドボタンを取り上げましたが他のコントロールではほかのリスナーを使用する必要があります。また,コマンドボタンでも他のリスナーを利用することでマウスのクリック数や押したボタンを判断する方法もあります。
|