【解決&追加情報】ダイアログの表示位置

スプレッドシート (Calc) について
返信する
K.Tsunoda
記事: 71
登録日時: 11月 2, 2008, 6:44 pm
連絡する:

【解決&追加情報】ダイアログの表示位置

投稿記事 by K.Tsunoda »

( Windows XP SP2 / OOo 3.0.0 )

こんにちは。

ダイアログの表示位置が変わってしまう事で困っています。

何もせず単純にダイアログを表示させると、IDEでのダイアログプロパティ[PositionX / PositionY]
の値に拠らず、普通は「親ウィンドウの中央」に表示されます。

execute前に、マクロでダイアログの[PositionX / PositionY]を設定すれば、
当然、その位置で表示されます。

しかし、ダイアログの[PositionX / PositionY]を変更していなくても、
ダイアログの[Height / Width]をマクロで変更した場合に、
IDEでの[PositionX / PositionY]が活きてきて、その位置で表示されてしまいます。

条件によってダイアログ上のコントロールを隠す場合がある為、
隠すコントロール群をダイアログ右側に配置しておいて、
 ・全て見せる → 設計時のWidthのまま表示 ------------------→ 親ウィンドウ中央表示
 ・一部隠す  → 右側が隠れるようにWidthを変更して表示 ----→ 若干右上に表示位置がズレる
という風にしています。

見せる場合には全部一画面で見せたいのでページを使わずにダイアログのサイズで対応しています。
Visible も広い空っぽの場所が見苦しいので、ここでは使っていません。

この2つのケースで初期表示位置が変わってしまう事で困っています。

両方で表示前に[PositionX / PositionY]を変更すれば位置は同じになりますが、
できれば画面中央(親ウィンドウ中央)の位置で揃えたいです。

強制的に『親ウィンドウ中央表示』とさせるオプション等はあるでしょうか?

(5/26 追記)
実際には、↓のカレンダーダイアログで、六曜の有無によって右側の六曜カラーガイダンスの
表示有無を処理するのに使っています。
http://blog.livedoor.jp/addinbox/archives/51199327.html

----------------------------------------------------------------------
【 5/28 追記 】
ダイアログのWidthを変更すると表示位置が画面中央からズレるという件について追加情報です。

原因は、Width値の変更方法にあったようです。Excel/VBAの習慣で、特に考えも無く

コード: 全て選択

  With oDialog.Model
      .Width = .getByName("ABC").PositionX - 5
  End With

という風に、モデルの[ Width ]で変更していました。
(ABC が右側にある隠したいコントロールで、そのX座標値の手前にダイアログの幅を設定)

これで設定すると表示位置がズレたんですが、getPosSize/setPosSize で変更するように
変えたところ、Widthを変更しても画面中央に表示されました。
以下の返信にある、親ウィンドウの中央位置を算出して設定しなくても、そのままで画面中央になりました。

コード: 全て選択

  oABC_PosSize = oDialog.getControl("ABC").getPosSize()
  oDialog.setPosSize(0, 0, (oABC_PosSize.X - 5), 0, com.sun.star.awt.PosSize.WIDTH)

ただ、getPosSize/setPosSizeでの値は、モデルの[PositionX/PositionY/Width/Height]とは
単位が違うようで、値が異なるのですね。
最初、PositionX値をsetPosSizeに与えたら、トンデモなくサイズが変わってしまいました。

OOoは「何を使ったら良いのか」で難しいです♪
最後に編集したユーザー K.Tsunoda [ 5月 28, 2009, 5:43 pm ], 累計 2 回
tani
記事: 60
登録日時: 6月 13, 2008, 10:12 am

Re: ダイアログの表示位置

投稿記事 by tani »

見せる場合には全部一画面で見せたいのでページを使わずにダイアログのサイズで対応しています。
Visible も広い空っぽの場所が見苦しいので、ここでは使っていません。
普通は上のどっちかで実装するんじゃないですかねー。
強制的に『親ウィンドウ中央表示』とさせるオプション等はあるでしょうか?
ない感じがします。親ウィンドウの大きさとかから計算して出すしかないんじゃないでしょうか。
親ウィンドウの大きさはComponentWindowオブジェクトとかContainerWindowオブジェクトとかから分かりますが、ちょっとめんどくさいですねー。


追記:
例えば以下のような感じにしてボタンとPushOKを割り付けると、どこにダイアログを移動させてもボタンを押すと中央に戻ってきます。

コード: 全て選択

Dim oDialog As Object

Sub Main
  DialogLibraries.LoadLibrary("Standard")
  oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
  
  oDialog.execute()
End Sub

Sub PushOK
  oContainerWindow = ThisComponent.getCurrentController().getFrame.getContainerWindow
  WindowX = oContainerWindow.Size.Width
  WindowY = oContainerWindow.Size.Height

  DialogX = oDialog.Size.Width
  DialogY = oDialog.Size.Height

  oDialog.setPosSize(Int((WindowX - DialogX) / 2), Int((WindowY - DialogY) / 2), 0, 0, com.sun.star.awt.PosSize.POS)  
End Sub
K.Tsunoda
記事: 71
登録日時: 11月 2, 2008, 6:44 pm
連絡する:

Re: ダイアログの表示位置

投稿記事 by K.Tsunoda »

>親ウィンドウの大きさとかから計算して出すしかないんじゃないでしょうか。
>親ウィンドウの大きさはComponentWindowオブジェクト
ありがとうございます。
私も、あちこち調べてて、今やっと出来たとこでした。
使い方、これで間違ってなかったようで良かった♪

OOo 本格的に始めて、まだ10日あまり。
API一覧のサイトで、com.sun.云々 辺りを調べるのが面倒ですね。

コード: 全て選択

  Dim oDialog As Object
  DialogLibraries.LoadLibrary("Standard")
  oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)

  oDialog.Model.Width = 変更値
  Call SetDialogWindowCenter(oDialog)
  oDialog.execute()

 ~~~~~~

Sub SetDialogWindowCenter(argDialog As Object)
Dim oActiveFrame As Object
Dim oActiveWindow As Object
Dim lngWinHeight As Long
Dim lngWinWidth As Long

  oActiveFrame = StarDeskTop.activeFrame()
  oActiveWindow = oActiveFrame.getContainerWindow()
  With oActiveWindow.getPosSize()
    lngWinHeight = .Height
    lngWinWidth = .Width
  End With
  
  With argDialog
    .setPosSize(Int((lngWinWidth - .Size.Width) / 2), _
                Int((lngWinHeight - .Size.Height) / 2), _
                0, 0, com.sun.star.awt.PosSize.POS)
  End With
End Sub
最初、 oDialog.Model.PositionX / PositionY に結果を代入したら、
ダイアログは小さくなるわ、ウィンドウの右下に表示されるわ、で焦りましたけど(笑)

(5/31 修正)
setPosSize 内でダイアログのサイズに [.Model.Width] [.Model.Height] を使ってました。
[.Size.Width] [.Size.Height] に訂正します。
最後に編集したユーザー K.Tsunoda [ 5月 31, 2009, 1:36 pm ], 累計 1 回
tani
記事: 60
登録日時: 6月 13, 2008, 10:12 am

Re: 【解決】ダイアログの表示位置

投稿記事 by tani »

余談ですが。
API一覧のサイトで、com.sun.云々 辺りを調べるのが面倒ですね。
Xray toolを使ったりするとちょっとは楽になります。
http://www.ooomacros.org/dev.php
一番下にあります。
メソッドとかプロパティとかの一覧が見れたりするだけなのでやっぱりapi.openoffice.orgで調べたりするんですが。
返信する

“Calc”に戻る