Top > OOoBasic > Dialog > CreateDialog

ダイアログ作成 Edit

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

ダイアログエディタ Edit

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

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

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

項目説明
名前Dialog1ダイアログの名前
タイトルダイアログのタイトル
アクティブにするはい利用可能にする
ページステップ0ダイアログのページ
  • 名前
    ダイアログをあらわす名前です。ダイアログを表示する際に必要です。
  • タイトル
    ダイアログのタイトルバーに表示される文字列です。
  • アクティブにする
    ダイアログを利用可能にするかどうかを選択します。アクティブにしないと閉じることさえできません。
  • ページステップ
    ダイアログのページ番号です。タブの代わりに利用されます。別の項目で説明します。

テスト表示 Edit

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

ダイアログ表示 Edit

OOoBasic からダイアログを表示してやります。

  1. 作成したダイアログのあるライブラリを読み込んでやります。ここでは "Standard" ライブラリを読み込んでいます。
  2. ダイアログオブジェクトを CreateUnoDialog ランタイム関数を使用して作成します。引数にダイアログを指定します。
  3. ダイアログオブジェクトの execute メソッドでダイアログを表示します。
Sub Dialog_1
Dim oDialog As Object
  DialogLibraries.LoadLibrary("Standard")
  oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
  oDialog.execute()
End Sub

execute メソッド Edit

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

ダイアログが閉じられるのは次のような場合です。

  • OK ボタンを押したとき
  • キャンセルボタンを押したとき
  • タイトルバーの閉じるボタンを押したとき
  • endExecute メソッドが呼ばれたとき
閉じ方
0OK
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"))

ダイアログを閉じる Edit

ユーザーによる操作でダイアログが閉じられる以外にダイアログオブジェクトの 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

ダイアログの特徴 Edit

ダイアログの特徴についてです。

  • Modal ダイアログ
    モダルなダイアログとは、ユーザーの操作が終わるまで前面に表示されるダイアログです。ダイアログが表示されている間は下に表示されているドキュメントなどを操作できません。
  • ページ
    ダイアログにはタブコントロールがありません。その代わりとしてページを切り替えてコントロールをページごとに配置することができます。

ダイアログのページ Edit

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

ページごとの配置 Edit

ページごとにコントロールを配置するには

  1. ダイアログを選択
  2. プロパティダイアログを表示させる
  3. ページプロパティを変更する
  4. コントロールを配置する

コントロールのページ変更 Edit

  1. ページを変更したいコントロールを選択
  2. ページプロパティを表示したいページ番号に変更する

ページの切り替え Edit

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

ダイアログのページの切り替えはダイアログモデルオブジェクトの 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

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

モダルダイアログ Edit

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

しかし、Calc でダイアログを表示、セル範囲の選択でユーザーに範囲を選択してもらおうとしてもモダルダイアログではうまくいきません (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 を実行時に実行されるように設定します。が、このとき二つのボタンの種類は「標準」にしておきます。そうしないとボタンを押したときのマクロが実行されません。

ダイアログの言語 Edit

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