Top > OOoBasic > Dialog > Example28

ノンモダルダイアログ Edit

ダイアログエディタで作成したダイアログをノンモダルダイアログとして利用します。

  • リサイズ不可
  • バツボタンで閉じるには com.sun.star.awt.XTopWindowListener を利用
  • コントロールのアクションは全てリスナーで処理する必要あり
  • ボタンの CANCEL や OK も不可、リスナーで

ダイアログの結果をどのようにして受け取るか、といった観点からコードが少し変わると思います。

OOo Basic の CreateUnoDialog ランタイム関数でインスタンス化したダイアログは、ダイアログをインスタンス化したOOo Basic のサブルーチンが終了すると同時に破棄されてしまいます。

Sub NonModalDialogIsDestroyed
  oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
  oDialog.setVisible(True)
End Sub

このコードでは oDialog をグローバル変数としても効果がありません。この方法を利用したければ、While ループなどでサブルーチンから抜け出ないようにします。ダイアログ参照。

とはいえ、この方法は面白くないので別の方法でダイアログをインスタンス化します。DialogProvider サービスでインスタンス化したダイアログはサブルーチンが終了しても破棄されません。

 oDialog = CreateUnoService("com.sun.star.awt.DialogProvider").createDialog(_
     "vnd.sun.star.script:Standard.Dialog1?location=application")

Edit

以下に簡単な例を示します。Standard.Dialog1 にはテキストフィールド TextField と OK およびキャンセルボタンが btnOk と btnCancel の名前で配置してあります。ダイアログが不要になったら dispose します。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
Sub CreateNonmodalDialogFromDialog
  ' サブルーチンが終了しても破棄されない様にウィンドウをインスタンス化
  oDialog = CreateUnoService("com.sun.star.awt.DialogProvider").createDialog(_
      "vnd.sun.star.script:Standard.Dialog1?location=application")
  ' バツボタンで閉じられるように
  oDialog.addTopWindowListener(_
      CreateUnoListener("NonModalToClose_", _
          "com.sun.star.awt.XTopWindowListener"))
  
  ' ボタンアクション用にリスナーとコマンドを設定
  oButtonListener = CreateUnoListener(_
      "NonModalButton_", "com.sun.star.awt.XActionListener")
  btnOk = oDialog.getControl("btnOk")
  btnOk.addActionListener(oButtonListener)
  btnOk.setActionCommand("ok")
  btnCancel = oDialog.getControl("btnCancel")
  btnCancel.addActionListener(oButtonListener)
  btnCancel.setActionCommand("cancel")
  
  ' 表示
  ShowDialog(oDialog)
End Sub
 
' ダイアログを表示
Sub ShowDialog(oDialog)
  oDialog.setVisible(True)
End Sub
 
' ダイアログを非表示
Sub HideDialog(oDialog)
  oDialog.setVisible(False)
End Sub
 
' ダイアログを非表示にして破棄
Sub CloseDialog(oDialog)
  HideDialog(oDialog)
  oDialog.dispose()
End Sub
 
' ボタンのアクション
Sub NonModalButton_actionPerformed(ev)
  cmd = ev.ActionCommand
  Select Case cmd
  Case "ok"
    oDialog = ev.Source.getContext()
    ' 何かする
    ' HideDialog(oDialog) ' 先に非表示にしたい場合
    msgbox oDialog.getControl("TextField1").getText()
    ' CloseDialog(oDialog) ' OK でも終了する
  Case "cancel"
    CloseDialog(ev.Source.getContext())
  End Select
End Sub
Sub NonModalButton_disposing(ev)
End Sub
 
' com.sun.star.awt.XTopWindowListener
Sub NonModalToClose_windowOpened(ev)
End Sub
' ウィンドウのバツボタンを押すと呼ばれる
Sub NonModalToClose_windowClosing(ev)
  CloseDialog(ev.Source)
End Sub
Sub NonModalToClose_windowClosed(ev)
End Sub
Sub NonModalToClose_windowMinimized(ev)
End Sub
Sub NonModalToClose_windowNormalized(ev)
End Sub
Sub NonModalToClose_windowActivated(ev)
End Sub
Sub NonModalToClose_windowDeactivated(ev)
End Sub
Sub NonModalToClose_disposing(ev)
End Sub

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