** [[OOobbs/44]] [#s5ae47c1] -''サマリ'': マクロで動的にコントロールを配置する方法 -''環境'': Basic -''状態'': 解決 -''投稿者'': [[まの]] -''投稿日'': 2004-12-05 (日) 07:11:56 *** 質問 [#ff35820e] ダイアログ上にマクロでコントロールを配置したいので調べたところ addControl()というメソッドを見つけました。 ですが、使い方がよくわかりません。 addControl( [in] string [in] XControl Name, Control ); 1つ目の引数は、コントロールの名前を指定するんだと思いますが、 2つ目の引数がわかりません。 追加したいコントロールを指定するんだろうとは思いますが どういう書き方をしたらいいのかがわかりません。 ご回答を頂けると幸いです。 よろしくお願いします。 *** 回答 [#gc811fb4] -一般的にダイアログにマクロでコントロールを配置するときには,addControl ではなくて ''insertByName'' メソッドを使います。 -- [[はにゃ?]] &new{2004-12-05 (日) 11:33:09}; マクロでダイアログにコントロールを配置するには,たとえば次のようにします。すこし長いのですが。次の絵のようなダイアログが作成できます。 &ref(runtimedialog.png); 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 へのアクセス +ダイアログのモデルオブジェクトの作成 +各コントロールモデルのインスタンスの作成 +ダイアログモデルオブジェクトへの各コントロールオブジェクトの追加 +ダイアログオブジェクトの作成 +ダイアログオブジェクトへのダイアログのモデルオブジェクトの設定 +ダイアログオブジェクトの visibility (可視性) の設定 +ダイアログの表示 まずは,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() -お忙しい中、大変詳しいご回答をありがとうございました。 もう1つわからないのが、マクロで配置したコントロールのイベントの記述の仕方です。 「Events」というプロパティがあったので.setPropertyValue("Events",OnClick) などとやってみたりしたのですが、エラーになってしまいました。 -- [[まの]] &new{2004-12-05 (日) 13:12:13}; -あと、イベントが起きたときにそのイベントが起きたコントロールの取得もしたいのです。 -- [[まの]] &new{2004-12-05 (日) 13:13:14}; -かなり途中になってしまっていました。すいません。すぐに続きをかきます。 -- [[はにゃ?]] &new{2004-12-05 (日) 16:07:49}; イベントの記述ですが,これにはリスナーを使用します。使用するのは 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 が呼び出されます。 ここでは,コマンドボタンを取り上げましたが他のコントロールではほかのリスナーを使用する必要があります。また,コマンドボタンでも他のリスナーを利用することでマウスのクリック数や押したボタンを判断する方法もあります。 -動的なコントロールの配置の「動的」具合がどれくらいか分からなかったので事前にダイアログを作成する方法を紹介しました。さらにダイアログを表示したあとでコントロールを追加していく方法もあります。以前書いたページで使用しています。http://www.kisweb.ne.jp/personal/hermione/generic/sub/dialog_add_control.html また,[[OOobbs/17]] のページも参考になるかもしれません。 -- [[はにゃ?]] &new{2004-12-06 (月) 00:06:52}; -大変詳しいご回答ありがとうございました。 これでなんとかなりそうです。 -- [[まの]] &new{2004-12-06 (月) 16:39:08}; #comment |