Top > OOobbs2 > 114

OOobbs2/114 Edit

  • サマリ: ダイアログウィンドウ表示時にエスケープキーを無効にしたい
  • 環境: Basic
  • 状態: 未解決
  • 投稿者: のの?
  • 投稿日: 2008-07-07 (月) 17:37:51

質問 Edit

Calc上でマクロからダイアログウィンドウを表示しているのですが、ある特定のダイアログウィンドウの場合だけ、エスケープキーを無効にしてダイアログウィンドウを閉じないように制御したいのです。 掲示板のキーハンドラーやマウスハンドラーの質問を読んでたのですが分かりませんでした。 宜しくお願いします。

回答 Edit

  • Basic の CreateUnoDialog ランタイム関数で作成したダイアログを閉じられなくする方法がないんですよね。

リスナーはキー操作を食いつぶすことが出来ないのでこの用途には使えません。また、キーハンドラはダイアログコントロール上では提供されていません (フォーカスがダイアログに移ってしまっているので、ドキュメントにハンドラを設定しても意味なかったです)。

というわけで、以下代案。

  1. インチキな方法でノンモダルダイアログにして利用する
  2. 閉じられないモダルダイアログを作成する

2 はかなり面倒なので、お勧めできません。1 はダイアログがノンモダルになってしまう問題があります。

案: 1

案 1 は普通に作成したダイアログを setVisible(True) にして表示させてノンモダルダイアログを作成する時の方法を利用します。ダイアログ表示中は while ループ中にいるようにしておき、ダイアログ上のボタンまたはアクションでループを抜けた後でダイアログを非表示にします。

ここで挙げた例ではダイアログエディタで作成したダイアログに TextField1 と CommandButton1 があります。 CommandButton1 を押したときに btn_push を割り当ててあります。

問題については後述します。

  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
Dim bOpen As Boolean
 
Sub dialog_test_1
   bOpen = True
   dialoglibraries.loadLibrary("Standard")
   oDlg = DialogLibraries.Standard.Dialog8
   oDlg = CreateUnoDialog(oDlg)
   
   'oDoc = ThisComponent
   'oContainerWindow = oDoc.getCurrentController()._
   '    getFrame().getContainerWindow()
   
   'On Error GoTo Handler
   'oContainerWindow.setEnable( False ) ' disable the whole window
   
   oDlg.setVisible(True) ' show dialog
   
   While bOpen
     wait(500)
   WEnd
   
   oDlg.setVisible(False) ' hide dialog
   
   'oContainerWindow.setEnable( True ) ' enable
   
   ' do something
   msgbox oDlg.getControl("TextField1").getText()
   
   oDlg.dispose()
   
   Exit Sub
   'Handler:
   'If NOT oContainerWindow.isEnabled() Then
   '  oContainerWindow.setEnable( True )
   'End If
End Sub
 
 
Sub btn_push(ev)
  bOpen = False
End Sub

ボタンの種類を DEFAULT 以外の OK や CANCEL にしてあるとボタンが動作しません。

問題点は、ダイアログがノンモダル風になってしまうためダイアログがほったらかしにされるかもしれないことです。モダルダイアログであれば、下のドキュメントのウィンドウを操作出来ません。

同じように操作不可にするにはドキュメントのフレームのコンポーネントウィンドウを無効化する方法が利用できそうです。上記コードのコメントにしてある行のシングルクォートを外してみてください。

  • はにゃ? 2008-07-07 (Mon) 19:05:50
  • 案 2 はダイアログエディタが利用できないためダイアログに飽きた人のページに例として置いておきました。 OOoBasic/Window/UnCloseableDialog -- はにゃ? 2008-07-07 (Mon) 19:30:33
  • プラットホームが不明なのでなんともですが、winだとwin32APIでなんとかなるだろうとは思いますが。なにせ・・凹んでいるので。 -- ponkan 2008-07-08 (火) 19:16:24
  • へこーですか。あー、あれねぇ・・・。デフォルト設定を変更できないのがそもそもの原因。とはいえ、代替案を書いている間にコメントが付いちゃって・・・。 -- はにゃ? 2008-07-08 (火) 21:09:16

感想,コメント,メモ Edit

  • 早速の回答有難うございます。方法がないのは残念です。。。 -- のの 2008-07-07 (月) 19:17:37
  • あー、更新の衝突が。 -- はにゃ? 2008-07-07 (Mon) 19:20:28


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