* Hiddenドキュメントを閉じた後に開くドキュメントが縮小Windowになる [#acd4bbc7]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|K.Tsunoda|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(普通,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(Calc 表計算,faq03,category)|
 |~投稿日|2009-10-09 10:58:13 (金)|
 |~OS|WindowsXP|
 |~依存するページ||
 |~バージョン|#listbox3(3.0.0,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#e24ad0c0]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 普段、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 ウィンドウサイズ(全画面)で表示されます。~
 
 
 
 ----
 ***非表示ドキュメントを最大化? [#j307584e]
 >M.Kamataki (2009-10-09 11:09:49 (金))~
 ~
 >多分、非表示オープン処理が、その時の OOo ウィンドウサイズを無視して~
 >常に縮小ウィンドウサイズで行なわれている為、そのウィンドウサイズが~
 >最新情報として残る為だろうと思われます。~
 ~
 わたしもそう思います。ということで、非表示時のドキュメントを最大化する処理を加えてみると、上記仮説の真偽も確認できるかと思います。Windowsに限りますが、最大化の処理をfaq/4/1670「画面の最大化、最小化」で紹介しています。試していただけないでしょうか。~
 ~
 あるいは、ちょっとあれかと思いますが、「ドキュメントを開く」イベントに最大化処理を割り付けるとか。~
 
 //
 ***最大化が Visible にしてしまう [#pd4d0554]
 >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終了後も残る [#p104d052]
 >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段階かな・・・~
 
 //
 ***これも駄目 [#na18225a]
 >K.Tsunoda (2009-10-09 17:06:28 (金))~
 ~
 >[Hidden=True]⇒[最大化]⇒[Window.Visible=False]の3段階かな・・・~
 シート部分は非表示になっていますが、ウィンドウタイトルとタスクバーには~
 非表示ドキュメントの名前が出て来ます。~
 ~
 「閉じるボタン」も効くので、非表示ドキュメントを閉じる事も出来ます。~
 ~
 ~
 開発中の郵便番号変換アドイン用のDB(Calc ドキュメント)を非表示で開こうと~
 思って試しているんですが、どうやっても駄目みたいですね。~
 ~
 『使った後は縮小ウィンドウになります。ごめんなさい』で逃げようか・・・~
 
 //
 ***画面サイズ設定の最大化フラグを復元 [#jaec8f0a]
 >はにゃ? (2009-10-09 20:52:51 (金))~
 ~
 Configuration の /org.openoffice.Setup/Office/Factories/Factory['com.sun.star.sheet.SpreadsheetDocument'] の ooSetupFactoryWindowAttributes の値のインデックス二番目の値を4にすると新しく作成される Calc のウィンドウが最大化されるので、該当ドキュメントを閉じた後に設定を変更すればいいかもしれません。~
 
 //
 ***Re: 最大化フラグ [#qd9d46a1]
 >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: 最大化フラグ [#p88d6de0]
 >K.Tsunoda (2009-10-09 22:19:26 (金))~
 ~
 > OOo 終了による『非表示ドキュメントのクローズ』と~
 >『アプリケーション終了』イベントの実行タイミングが気になりますね。~
 ~
 『アプリケーション終了』イベント内で非表示ドキュメントの有無確認を~
 しましたら、この時点で既にクローズされて消えていました。~
 
 //
 ***Re:フラグの更新について [#a8dbf22a]
 >はにゃ? (2009-10-09 22:35:18 (金))~
 ~
 該当する設定がOOoにより書き換えられるのは Calc の部分であれば、最後のCalcドキュメントのウィンドウが閉じられた時です。~
 マクロの詳細がわからないのでなんともいえませんが、データベース用のファイルを閉じた後に変更すれば問題ないはずです。他に別の Calc ファイルが開いてあったとしても再度 OOo が設定を更新します。~
 すでに Calc ファイルが開かれている状態で該当する設定を書き換えてみましたが、次に開くウィンドウは変更後の設定が使用されていました。~
 ~
 ";" で Split すればインデックス1で簡単に書き換えて Join しなおせるので・・・。~
 
 //
 ***フラグ書き換えマクロ [#y4587bcd]
 >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 で行うと [#q6e5597e]
 >はにゃ? (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 [#n3a99a9d]
 >K.Tsunoda (2009-10-10 15:01:28 (土))~
 ~
 インターフェースがちゃんと有るんですね。~
 ~
 [ Generic > Configurations ]のページですね(ここは未だ読んだ事が無い)。~
 後半部分に絡む解説が無いのでAPIで探してから試してみます。~
 
 //
 ***ありがとうございました♪ [#r40b7b1e]
 >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 が有るか探してみましたが無かったです。~
 検索単語が上手くなかっただけかもしれませんが・・・~
 
 //
 #article