Hiddenドキュメントを閉じた後に開くドキュメントが縮小Windowになる †
ページ | OpenOffice.org FAQの登録ページ |
---|---|
投稿者 | K.Tsunoda |
分類 | |
優先順位 | |
状態 | |
カテゴリー | |
投稿日 | 2009-10-09 10:58:13 (金) |
OS | WindowsXP |
依存するページ | |
バージョン |
メッセージ †
回答ページでは行末に「~」を付加する必要はありません |
普段、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 が有るか探してみましたが無かったです。
検索単語が上手くなかっただけかもしれませんが・・・