Top > OOoBasic > Dialog > CreateDialog
*ダイアログ作成 [#obad79b4]

普通にダイアログを作成するときには、ダイアログエディタで作成します。

#contents

**ダイアログエディタ [#ye306b5e]

メニューのツール -> マクロ -> ダイアログの管理 からダイアログを作成したいライブラリを選択して新規作成します。編集したいダイアログを選択して編集を行います。

最初に表示されている何もないダイアログをマウスカーソルで囲って選択し、ツールバーの「プロパティ」ボタンを押すとプロパティ値が表示されます。

以下のプロパティについて説明します。

,項目,値,説明
,名前,Dialog1,ダイアログの名前
,タイトル,,ダイアログのタイトル
,アクティブにする,はい,利用可能にする
,ページステップ,0,ダイアログのページ

-名前~
ダイアログをあらわす名前です。ダイアログを表示する際に必要です。

-タイトル~
ダイアログのタイトルバーに表示される文字列です。

-アクティブにする~
ダイアログを利用可能にするかどうかを選択します。アクティブにしないと閉じることさえできません。

-ページステップ~
ダイアログのページ番号です。タブの代わりに利用されます。別の項目で説明します。

***テスト表示 [#r4e8fe8e]
ダイアログツールバーの「テストモードオン/オフ」で作成したダイアログをテスト表示してみることができます。


**ダイアログ表示 [#dc8dd033]
OOoBasic からダイアログを表示してやります。

+作成したダイアログのあるライブラリを読み込んでやります。ここでは "Standard" ライブラリを読み込んでいます。
+ダイアログオブジェクトを ''CreateUnoDialog'' ランタイム関数を使用して作成します。引数にダイアログを指定します。
+ダイアログオブジェクトの ''execute'' メソッドでダイアログを表示します。

 Sub Dialog_1
 Dim oDialog As Object
   DialogLibraries.LoadLibrary("Standard")
   oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
   oDialog.execute()
 End Sub

***execute メソッド [#cd420ccb]

''execute '' はダイアログがどのようにして閉じられたかを数値として返します。

ダイアログが閉じられるのは次のような場合です。
-OK ボタンを押したとき
-キャンセルボタンを押したとき
-タイトルバーの閉じるボタンを押したとき
-''endExecute'' メソッドが呼ばれたとき

,値,閉じ方
,0,OK
,1,キャンセル(OK以外)

返り値を取得すれば、OK ボタンが押されたときのみ処理を続けることができます。

 Sub Dialog_2
 Dim oDialog As Object
   DialogLibraries.LoadLibrary("Standard")
   oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
   If oDialog.execute() = 1 Then
     msgbox "OK button pushed."
   Else
     msgbox "Canceled."
   End If
 End Sub

 oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
この部分は次のようにも書けます。
 oDialog = CreateUnoDialog( _
    DialogLibraries.getByName("Standard").getByName("Dialog1"))
**ダイアログを閉じる [#yb54565a]
ユーザーによる操作でダイアログが閉じられる以外にダイアログオブジェクトの ''endExecute'' メソッドを使用することでダイアログを閉じることができます。

''endExecute'' メソッドでダイアログが閉じられると、''execute'' メソッドの返り値は 0 になります。

 Dim oDialog As Object
 
 Sub Dialog_3
   DialogLibraries.LoadLibrary("Standard")
   oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
   If oDialog.execute() = 1 Then
     msgbox "OK button pushed."
   Else
     msgbox "Canceled."
   End If
 End Sub
 
 Sub CloseDialog
   oDialog.endExecute()
 End Sub

この例では CloseDialog を何かコントロールのイベントに割り当てて利用します。

OOo 3.3 以降では css.awt.XDialog2 インターフェースの endDialog メソッドをダイアログを閉じるために利用できます。このメソッドでは execute メソッドの返り値を指定できるため通常でない方法で閉じたダイアログでも OK ボタンを押した処理を継続して行えます。

 Sub CloseDialog2
   oDialog.endDialog(1) ' the same return value for execute method as pushed OK 
 End Sub
**ダイアログの特徴 [#bb69bc0e]
ダイアログの特徴についてです。

-Modal ダイアログ~
モダルなダイアログとは、ユーザーの操作が終わるまで前面に表示されるダイアログです。ダイアログが表示されている間は下に表示されているドキュメントなどを操作できません。

-ページ~
ダイアログにはタブコントロールがありません。その代わりとしてページを切り替えてコントロールをページごとに配置することができます。

**ダイアログのページ [#t23b5fe6]

ダイアログにはページごとにコントロールを配置することができます。各ページのコントロールは指定したページのみに表示されます。例外として、"0" ページに配置したコントロールはすべてのページに表示されます。

***ページごとの配置 [#d00af759]
ページごとにコントロールを配置するには
+ダイアログを選択
+プロパティダイアログを表示させる
+ページプロパティを変更する
+コントロールを配置する

***コントロールのページ変更 [#l38e1499]
+ページを変更したいコントロールを選択
+ページプロパティを表示したいページ番号に変更する

***ページの切り替え [#b3780f21]
ダイアログを表示して、ユーザーの操作でページを切り替えるにはボタンなどにページを切り替えるイベントなどを設定する必要があります。

ダイアログのページの切り替えはダイアログモデルオブジェクトの ''Step'' プロパティで行います。

 Dim oDialog As Object
 Dim oDialogModel As Object
 
 Sub Dialog_2
   DialogLibraries.LoadLibrary("Standard")
   oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
   oDialogModel = oDialog.Model
   oDialogModel.Step = 1
   oDialog.execute()
 End Sub
 
 Sub NextPage
   oDialogModel.Step = 2
 End Sub

ダイアログのページを利用するときにはダイアログを表示する前にダイアログのページを指定しておきます。指定しないとダイアログエディタで編集しているページから表示されます。



**モダルダイアログ [#o4f0ce9f]
上記のようにダイアログエディタで作成したダイアログを表示 (execute) するとすべてモダルダイアログになってしまい、ダイアログの表示中にはドキュメントを操作できません。これはウィザードなどのダイアログ中にドキュメントが変更されないようにするため、といった利点もあります。

しかし、Calc でダイアログを表示、[[セル範囲の選択>OOoBasic/Calc/rangeselection]]でユーザーに範囲を選択してもらおうとしてもモダルダイアログではうまくいきません (setVisible(False) にしても非表示になるだけであいからわずドキュメントにふれられません)。

ウィンドウを作成してノンモダルダイアログとしてもいいのですが、ダイアログエディタで作成できないため非常に面倒です。

そこで、簡単なウィザード程度であれば次のような方法でなんとかなります。

 Dim bExecuted As Boolean
 Dim nResult As Integer
 
 Sub dlg_a1
   DialogLibraries.LoadLibrary("Standard")
   oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
   
   oDialog.setVisible(True)
   While bExecuted
     wait(1000)
   WEnd
   If nResult = 1 then
      ' do something ...
   end if
   oDialog.dispose()
 End Sub
 
 
 Sub ok_pushed( ev )
   bExecuted = False
   nResult = 1
 End Sub
 
 Sub cancel_pushed( ev )
   bExecuted = False
   nResult = 0
 End Sub

OK ボタンに ok_pushed を、キャンセルボタンに cancel_pushed を実行時に実行されるように設定します。が、このとき二つのボタンの種類は「標準」にしておきます。そうしないとボタンを押したときのマクロが実行されません。
**ダイアログの言語 [#zb93895e]
2.2 からダイアログの言語を変更できるようになっています。GUI の設定言語に応じて表示が変更されます。

2.3 でバグがあるため表示がデフォルトになってしまいます。これを正しく表示させるためにはダイアログの言語設定を表示前に変更しておきます。

  DialogLibraries.LoadLibrary(sLibName)
  oDialog = CreateUnoDialog( _
    DialogLibraries.getByName(sLibName).getByName(sDialogName))
  
  aCurrentLocale = GetUILocale
  oRResolver = oDialog.getModel().ResourceResolver
  oRResolver.setCurrentLocale(aCurrentLocale,True)

 
 ' get locale of the UI. en-US, ja, ...
 Function GetUILocale() As com.sun.star.lang.Locale
   oConfigProvider = CreateUnoService( _
     "com.sun.star.configuration.ConfigurationProvider")
   Dim aNode(0) As New com.sun.star.beans.PropertyValue
   aNode(0).Name = "nodepath"
   'aNode(0).Value = "/org.openoffice.Office.Linguistic/General"
   'oConfigAccess = oConfigProvider.createInstanceWithArguments( _
   '   "com.sun.star.configuration.ConfigurationAccess", aNode)
   'sUILocale = oConfigAccess.getPropertyValue("UILocale")
   aNode(0).Value = "/org.openoffice.Setup/L10N"
   oConfigAccess = oConfigProvider.createInstanceWithArguments( _
      "com.sun.star.configuration.ConfigurationAccess", aNode)
   sUILocale = oConfigAccess.getPropertyValue("ooLocale")
   Dim aLocale As New com.sun.star.lang.Locale
   If InStr(sUILocale,"-") > 0 Then
     aLocale.Language = Mid(sUILocale,1,InStr(sUILocale,"-") -1)
     aLocale.Country = Mid(sUILocale,InStr(sUILocale,"-") +1)
   Else
     aLocale = SearchInInstalledLocale(sUILocale)
   End If
   GetUILocale = aLocale
 End Function
 
 
 ' find locale from a language without its country
 Function SearchInInstalledLocale( sLocLanguage As String )
   Dim aLocLocale As New com.sun.star.lang.Locale
   oLocaleData = CreateUnoService("com.sun.star.i18n.LocaleData")
   aInstalledLocales = oLocaleData.getAllInstalledLocaleNames()
   For i = 0 To UBound(aInstalledLocales)
     If aInstalledLocales(i).Language = sLocLanguage Then
       aLocLocale = aInstalledLocales(i)
     End If
   Next i
   SearchInInstalledLocale = aLocLocale
 End Function

まず、現在の UI の言語設定を取得します。言語設定は en-US などのように言語-国として文字列で保存されています。日本語のように一つの国でのみ利用されている言語では ja としてハイフンで区切られずに言語のみになっています。

国も指定しないとエラーが出るのでインストールされているすべてのロケール設定から言語に対応するロケールを探します。

最後にダイアログモデルオブジェクトの ResourceResolver に現在の言語を設定します。

言語が標準に設定されていると UILocale が空で失敗するため、自動判定により起動後に更新される ooLocale を利用したほうがいいようです。

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes