「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:1
総数:2457
現在:6


Hiddenドキュメントを閉じた後に開くドキュメントが縮小Windowになる

ページOpenOffice.org FAQの登録ページ
投稿者K.Tsunoda
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2009-10-09 10:58:13 (金)
OSWindowsXP
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

普段、Calc を全画面(最大化)で利用しています。

マクロから、非表示(Hidden)でドキュメントを開いた場合

Dim aArg(1) As New com.sun.star.beans.PropertyValue
aArg(0).Name = "ReadOnly"
aArg(0).Value = True
aArg(1).Name = "Hidden"
aArg(1).Value = True
oDoc = StarDesktop.loadComponentFromUrl(URL, "_blank", 0, aArg())

(1) 非表示ドキュメントを開いたまま、OOo を終了して、OOo を再起動後
(2) マクロで、非表示のドキュメントを Close した後

(1) or (2) の後、つまり「非表示ドキュメントが閉じられた後」では、
新たに、ドキュメントを開くと縮小ウィンドウで表示されてしまいます。
(ユーザー操作/マクロ共に)

多分、非表示オープン処理が、その時の OOo ウィンドウサイズを無視して
常に縮小ウィンドウサイズで行なわれている為、そのウィンドウサイズが
最新情報として残る為だろうと思われます。

非表示ドキュメントを閉じた後に開くドキュメントが全画面で開くようになる
回避策はないでしょうか。


尚、現在、非表示で開いているドキュメントを、「表示」モードで開くと、
通常通りに、その時の OOo ウィンドウサイズ(全画面)で表示されます。


非表示ドキュメントを最大化?

M.Kamataki (2009-10-09 11:09:49 (金))

>多分、非表示オープン処理が、その時の OOo ウィンドウサイズを無視して
>常に縮小ウィンドウサイズで行なわれている為、そのウィンドウサイズが
>最新情報として残る為だろうと思われます。

わたしもそう思います。ということで、非表示時のドキュメントを最大化する処理を加えてみると、上記仮説の真偽も確認できるかと思います。Windowsに限りますが、最大化の処理をfaq/4/1670「画面の最大化、最小化」で紹介しています。試していただけないでしょうか。

あるいは、ちょっとあれかと思いますが、「ドキュメントを開く」イベントに最大化処理を割り付けるとか。

最大化が Visible にしてしまう

K.Tsunoda (2009-10-09 13:01:05 (金))

ありがとうございます。
最大化してから閉じた後では、やはり問題ないですね。

ただ、「最大化」が Visible にしてしまいますから、
これでは本来の意味が無くなってしまいます。
「最大化」の後に Visible=False が必要になりますね。

Declare Function ShowWindow Lib "user32" _
  (ByVal lHwnd As Long, ByVal lCmdShow As Long) As Boolean 
'
Sub Main1()
Dim strURL As String
Dim oDoc As Object
Dim aArg(1) As New com.sun.star.beans.PropertyValue
Dim oWindow1 As Object
Dim lngHandle As Long
Dim oSize1 As Object
Dim oWindow2 As Object
Dim oSize2 As Object
'
  oWindow1 = ThisComponent.CurrentController.Frame.ContainerWindow
  oSize1 = oWindow1.PosSize()
'
  strURL = "file:///D:/MyDocuments_D/HiddenDummy.ods"
  aArg(0).Name = "ReadOnly"
  aArg(0).Value = True
  aArg(1).Name = "Hidden"
  aArg(1).Value = True
  oDoc = StarDesktop.loadComponentFromUrl(strURL, "_blank", 0, aArg())
'
  oWindow2 = oDoc.CurrentController.Frame.ContainerWindow
  lngHandle = oWindow2.getWindowHandle(DimArray(), 1) ' 1=WIN32
  Call ShowWindow( lngHandle, 3 )
  oSize2 = oWindow2.PosSize()
'
  MsgBox "Window1(Visible) Height=" & oSize1.Height & " Width=" & oSize1.Width & chr(13) & chr(13) & _
         "Window2(Hidden ) Height=" & oSize2.Height & " Width=" & oSize2.Width
'
  'oDoc.Close(True)
End Sub


Hidden(最大化なし)にすると Height/Width がゼロになりますね。
「最大化」して Visible になった後でもゼロのままです。



試しに、[Hidden=False]で開いてから、[Visible=False]で隠してみました。
当然ですが、これなら縮小にはなりませんね。
開いている間、グレーウィンドウが出ますけど・・・
逆にプログレスバーも出るから良いかな・・・

Sub Main2()
Dim strURL As String
Dim oDoc As Object
Dim aArg(1) As New com.sun.star.beans.PropertyValue
Dim oWindow1 As Object
Dim oSize1 As Object
Dim oWindow2 As Object
Dim oSize2 As Object
'
  oWindow1 = ThisComponent.CurrentController.Frame.ContainerWindow
  oSize1 = oWindow1.PosSize()
'
  strURL = "file:///D:/MyDocuments_D/HiddenDummy.ods"
  aArg(0).Name = "ReadOnly"
  aArg(0).Value = True
  aArg(1).Name = "Hidden"
  aArg(1).Value = False
  oDoc = StarDesktop.loadComponentFromUrl(strURL, "_blank", 0, aArg())
'
  oWindow2 = oDoc.CurrentController.Frame.ContainerWindow
  oWindow2.Visible = False
  oSize2 = oWindow2.PosSize()
'
  Wait(20)
  MsgBox "Window1(Visible) Height=" & oSize1.Height & " Width=" & oSize1.Width & chr(13) & chr(13) & _
         "Window2(Hidden ) Height=" & oSize2.Height & " Width=" & oSize2.Width
'
  'oDoc.Close(True)
End Sub

[Visible=False]では OOo終了後も残る

K.Tsunoda (2009-10-09 16:45:01 (金))

> [Hidden=False]で開いてから、[Visible=False]で隠してみました。
これで大丈夫と思いましたが駄目でした。

[Hidden=True] で開いたドキュメントは OOo を終了する時に
【自動的に Close 】されます。

[Hidden=Fale & Visible=False]で開いたドキュメントは OOo を終了しても
「非表示」のままで活きていますね。

その結果、OOo を終了したつもりでも、soffice.bin/soffice.exe のプロセス
も残っています。OOo を起動して非表示ドキュメントにアクセスしてみると、
当然アクセスできます。


[Hidden=True]⇒[最大化]⇒[Window.Visible=False]の3段階かな・・・

これも駄目

K.Tsunoda (2009-10-09 17:06:28 (金))

>[Hidden=True]⇒[最大化]⇒[Window.Visible=False]の3段階かな・・・
シート部分は非表示になっていますが、ウィンドウタイトルとタスクバーには
非表示ドキュメントの名前が出て来ます。

「閉じるボタン」も効くので、非表示ドキュメントを閉じる事も出来ます。


開発中の郵便番号変換アドイン用のDB(Calc ドキュメント)を非表示で開こうと
思って試しているんですが、どうやっても駄目みたいですね。

『使った後は縮小ウィンドウになります。ごめんなさい』で逃げようか・・・

画面サイズ設定の最大化フラグを復元

はにゃ? (2009-10-09 20:52:51 (金))

Configuration の /org.openoffice.Setup/Office/Factories/Factory['com.sun.star.sheet.SpreadsheetDocument'] の ooSetupFactoryWindowAttributes の値のインデックス二番目の値を4にすると新しく作成される Calc のウィンドウが最大化されるので、該当ドキュメントを閉じた後に設定を変更すればいいかもしれません。

Re: 最大化フラグ

K.Tsunoda (2009-10-09 22:11:10 (金))

こんにちは。
はにゃ?さんのサイトには、いつもお世話になっています。

faq/1/278 「起動時のWindowサイズを最大にする方法は?」で解説されている
[ $(user)/registry/data/org/openoffice/Setup.xcu ]ファイル内

 <node oor:name="Factories">
  <node oor:name="com.sun.star.sheet.SpreadsheetDocument">
   <prop oor:name="ooSetupFactoryWindowAttributes" oor:type="xs:string">
    <value>70,89,952,533;4;0,0,0,0;</value>

value 内の5番目[4]の位置の書き換えですね。

非表示ドキュメントを開いていない状態で OOo 終了後に確認したら [4] になっていました。

非表示ドキュメントを開いた状態で OOo 終了後に確認したら [1] になっていました。
エディタで[4]に書き換えてから OOo を起動したら『全画面』で表示されました。


この書き換えを[OpenOffice.org > イベント > アプリケーション終了]で行なうと
いう事でしょうか?

Setup.xcu ファイルは OOo が掴んでいて更新がバッティングしないですかね?
あと、OOo 終了による『非表示ドキュメントのクローズ』と『アプリケーション終了』イベント
の実行タイミングが気になりますね。

Re: 最大化フラグ

K.Tsunoda (2009-10-09 22:19:26 (金))

> OOo 終了による『非表示ドキュメントのクローズ』と
>『アプリケーション終了』イベントの実行タイミングが気になりますね。

『アプリケーション終了』イベント内で非表示ドキュメントの有無確認を
しましたら、この時点で既にクローズされて消えていました。

Re:フラグの更新について

はにゃ? (2009-10-09 22:35:18 (金))

該当する設定がOOoにより書き換えられるのは Calc の部分であれば、最後のCalcドキュメントのウィンドウが閉じられた時です。
マクロの詳細がわからないのでなんともいえませんが、データベース用のファイルを閉じた後に変更すれば問題ないはずです。他に別の Calc ファイルが開いてあったとしても再度 OOo が設定を更新します。
すでに Calc ファイルが開かれている状態で該当する設定を書き換えてみましたが、次に開くウィンドウは変更後の設定が使用されていました。

";" で Split すればインデックス1で簡単に書き換えて Join しなおせるので・・・。

フラグ書き換えマクロ

K.Tsunoda (2009-10-10 11:49:39 (土))

一応、こんな感じで出来上がりました。
[OpenOffice.org > イベント > アプリケーション終了]に登録して、
・非表示ドキュメント有りで OOo終了によるクローズ
・マニュアルで縮小ウィンドウに変えてOOo終了
どちらも、次回のドキュメントオープンは全画面になりました。

何か気付いた点などありましたら、お知らせください。

'============================[ WindowMaximum4HiddenDocument ]====
'When HiddenDocument closes it, information of "Window size=reduction" is saved.
'Therefore a document opening next becomes the reduction window.
'It is rewrited the window size information by "maximum" not to become the reduction window.
'
Sub WindowMaximum4HiddenDocument()
Dim oSubstitutedPath As Object
Dim strURL As String
Dim intFileNo As Integer
Dim strLine As String
Dim strData() As String
Dim intFlag As Integer
Dim vntSplit As Variant
Dim blnUpdate As Boolean
Dim lngLineCnt As Long
Dim i As Long
Const cstKey1 As String = "<node oor:name=""Factories"">"
Const cstKey2 As String = "<node oor:name=""com.sun.star.sheet.SpreadsheetDocument"">"
Const cstKey3 As String = "<prop oor:name=""ooSetupFactoryWindowAttributes"" oor:type=""xs:string"">"
Const cstKey4 As String = "<value>"
'
  On Error Goto ErrorHandler
  oSubstitutedPath = CreateUnoService("com.sun.star.util.PathSubstitution")
  strURL = oSubstitutedPath.SubstituteVariables("$(user)/registry/data/org/openoffice/Setup.xcu", True)
'
  intFileNo = FreeFile
  Open strURL for Input as #intFileNo
  lngLineCnt = 0
  intFlag = 1
  blnUpdate = False
  Do While not Eof(intFileNo)
    Line Input #intFileNo, strLine
    lngLineCnt = lngLineCnt + 1
    If (lngLineCnt = 1) Then
      ReDim strData(1 to 1)
    Else
      ReDim Preserve strData(1 to lngLineCnt)
    End If
'
    Select Case intFlag
      Case 1
        If (InStr(1, strLine, cstKey1, 0) <> 0) Then
          intFlag = 2
        End If
      Case 2
        If (InStr(1, strLine, cstKey2, 0) <> 0) Then
          intFlag = 3
        End If
      Case 3
        If (InStr(1, strLine, cstKey3, 0) <> 0) Then
          intFlag = 4
        End If
      Case 4
        If (InStr(1, strLine, cstKey4, 0) <> 0) Then
          intFlag = 9
          '[ <value>26,45,952,533;4;0,0,0,0;</value> ]
          vntSplit = Split(strLine, ";")
          If (vntSplit(1) = "1") Then
            vntSplit(1) = "4"     '4:Maximum
            strLine = Join(vntSplit, ";")
            blnUpdate = True
          Else
            Exit Do
          End If
        End If
      Case Else
    End Select 
    strData(lngLineCnt) = strLine
  Loop
  Close #intFileNo
'
  If (lngLineCnt = 0) or (blnUpdate = False) Then
    Exit Sub
  End If
'
  intFileNo = FreeFile
  Open strURL for Output as #intFileNo
  For i = 1 to lngLineCnt
    Print #intFileNo, strData(i)
  Next i
  Close #intFileNo
  Exit Sub
'  
ErrorHandler:
  If (intFileNo <> 0) Then
    Close #intFileNo
  End If
End Sub

API で行うと

はにゃ? (2009-10-10 13:23:58 (土))

Sub Snippet()
 Dim oCP As Object
 Dim oCUA As Object
 Dim aProps(0) As New com.sun.star.beans.PropertyValue
 Dim sAttr As String
 Dim sItems As Variant

 oCP = CreateUnoService( _
   "com.sun.star.configuration.ConfigurationProvider" )
 aProps(0).Name = "nodepath"
 aProps(0).Value = "/org.openoffice.Setup/Office/Factories/Factory['com.sun.star.sheet.SpreadsheetDocument']"
 oCUA = oCP.createInstanceWithArguments( _
   "com.sun.star.configuration.ConfigurationUpdateAccess", aProps )
 sAttr = oCUA.ooSetupFactoryWindowAttributes
 sItems = Split(sAttr, ";")
 sItems(1) = "4"
 oCUA.ooSetupFactoryWindowAttributes = Join(sItems, ";")
 oCUA.commitChanges()
End Sub

Re:API

K.Tsunoda (2009-10-10 15:01:28 (土))

インターフェースがちゃんと有るんですね。

[ Generic > Configurations ]のページですね(ここは未だ読んだ事が無い)。
後半部分に絡む解説が無いのでAPIで探してから試してみます。

ありがとうございました♪

K.Tsunoda (2009-10-10 19:34:49 (土))

なんとか内容は理解しました。
XML絡みだと、API解説だけではなく、XML定義まで覗いてやらないと
判らないんですね。

[ $(user)/registry/data/org/openoffice/Setup.xcu ]ファイル

<oor:component-data (略)  oor:name="Setup" oor:package="org.openoffice">
 <node oor:name="Office">
  <node oor:name="Factories">
   <node oor:name="com.sun.star.sheet.SpreadsheetDocument">
    <prop oor:name="ooSetupFactoryWindowAttributes" oor:type="xs:string">
     <value>26,45,952,533;4;0,0,0,0;</value>
    </prop>
    <prop oor:name="ooSetupFactoryStyleFilter" oor:type="xs:int">
     <value>2</value>
    </prop>


「更新モード」でのアクセス設定

oCUA = oCP.createInstanceWithArguments( _
  "com.sun.star.configuration.ConfigurationUpdateAccess", aProps )


階層構造なし(最下層ノードに対するアクセス)

aProps(0).Name = "nodepath"


参照先のノード指定

aProps(0).Value = _
   "/org.openoffice.Setup/Office/Factories/Factory['com.sun.star.sheet.SpreadsheetDocument']"

最後の Factory['xxx'] が
Factories の中で「こういう記述法」を定義しているからなのか、
単に「最下層ノードなら、こういう書き方をする。Factories と Factory が似てるのは偶々」なのかが
判りませんでしたが、とにかく、これで参照先のパスを指定しているのは判りました。

参照先ノード内にあるプロパティ群の中から[ ooSetupFactoryWindowAttributes ]の
値を取得(定義により値は String)。

sAttr = oCUA.ooSetupFactoryWindowAttributes


更新の完了指示

oCUA.commitChanges()


このコードのまま利用させて頂きます。
ありがとうございました。

補:sItems の定義が抜けていたので加えておきました。

Issue が有るか探してみましたが無かったです。
検索単語が上手くなかっただけかもしれませんが・・・

お名前:
題名: