OOobbs/51
質問
DrawPage 上のオブジェクトの位置及びサイズ情報を取得及び設定する為に .Size / .Position プロパティが利用できますが、.FrameRect プロパティというものもあり、位置とサイズ情報が両方格納される構造体なので利用出来ると便利なのですが、以下のコードを Writer で実行した時だけ異なる値を示します。 REM ************************************************** REM *** Draw/Impress/Calc/Writer で、選択された DrawPage 上 REM *** のオブジェクトの位置情報を比較するサンプル REM *** -- OpenOffice 1.9m79 以降への対応化 -- REM ************************************************** Sub CheckRect Dim Doc As Object Dim Page As Object Dim Shapes As Object Dim Group As Object Dim objfX As Double, objfY As Double, objfW As Double, objfH As Double Dim objX As Double, objY As Double, objW As Double, objH As Double Doc = StarDesktop.CurrentComponent Page = GetDrawPageAllways(Doc) '-- Debug tool としてXray 使用していない時はコメント化 ' Globalscope.BasicLibraries.LoadLibrary( "Xray" ) ' Xray.Xray Page Shapes = Doc.getCurrentSelection() if IsNull(Shapes) then MsgBox "選択されたオブジェクトはありません。" elseif Not HasUnoInterfaces(Shapes, "com.sun.star.drawing.XShapes") then '--> 1.9m79 での挙動に対応 MsgBox "選択されたオブジェクトは、サイズ情報取得対象ではありません。" else if Shapes.Count = 1 then '--> 1つの時はグループ化しない。(主として Writer への対応措置) Group = Shapes.getByIndex(0) else ' 選択されたオブジェクトをグループ化 Group = Page.group(Shapes) end if ' 選択されたオブジェクトの情報表示 objW = Group.Size.Width / 100 : objH = Group.Size.Height / 100 objfW = Group.FrameRect.Width / 100 : objfH = Group.FrameRect.Height / 100 if IsDrawOrImpress(Doc) then objX = (Group.Position.X - Page.BorderLeft) / 100 : objY = (Group.Position.Y - Page.BorderTop)/ 100 objfX = (Group.FrameRect.X - Page.BorderLeft) / 100 : objfY = (Group.FrameRect.Y - Page.BorderTop) / 100 else objX = Group.Position.X / 100 : objY = Group.Position.Y / 100 objfX = Group.FrameRect.X / 100 : objfY = Group.FrameRect.Y / 100 end if MsgBox "【選択された DrawPage 上のオブジェクトについて】" & chr$(13) & _ "-- Size 及び Position プロパティによる取得値 --" & chr$(13) & _ "幅:" & objW & "mm 高さ:" & objH & "mm" & chr$(13) & _ "X座標:" & objX & "mm Y座標:" & objY & "mm" & chr$(13) & _ "-- FrameRect プロパティによる取得値 --" & chr$(13) & _ "幅:" & objfW & "mm 高さ:" & objfH & "mm" & chr$(13) & _ "X座標:" & objfX & "mm Y座標:" & objfY & "mm" if Shapes.Count > 1 then '--> 1つ以上の時はグループ化しているので、 ' 選択されたオブジェクトをグループ解除 Page.ungroup(Group) end if end if End Sub Sub IsWriter(oDocument As Object) As Boolean IsWriter = oDocument.supportsService("com.sun.star.text.TextDocument") End Sub Sub IsDrawOrImpress(oDocument As Object) As Boolean if oDocument.supportsService("com.sun.star.drawing.DrawingDocument") or _ oDocument.supportsService("com.sun.star.presentation.PresentationDocument") then IsDrawOrImpress = True else IsDrawOrImpress = False end if End Sub Sub GetDrawPageAllways(oDocument As Object) As Object '-- Draw or Impress if oDocument.supportsService("com.sun.star.drawing.DrawingDocument") or _ oDocument.supportsService("com.sun.star.presentation.PresentationDocument") then GetDrawPageAllways = oDocument.CurrentController.getCurrentPage() Exit Sub '-- Calc elseif oDocument.supportsService("com.sun.star.sheet.SpreadsheetDocument") then GetDrawPageAllways = oDocument.CurrentController.ActiveSheet.getDrawPage() Exit Sub '-- Writer elseif oDocument.supportsService("com.sun.star.text.TextDocument") then GetDrawPageAllways = oDocument.CurrentController.Model.getDrawPage() Exit Sub '-- other, DB? else end if End Sub
Doc.CurrentController.Model.PagePrintSettings
回答
Draw で .TopBorder などが DrawPage から取得できるのは,Draw ではページのスタイルが存在しないことが理由のようです。 Draw と Impress はプレゼンテーション以外の部分はほぼ同じものと思ってください。 Writer および Calc ではページの設定をページスタイルで行います。そのため,ドローページに個別にページの設定を行うプロパティーはありません。 PagePrintSettings に関しては Developer's Guide 7.2 Printing Multiple Pages on one Page に記述がありました。印刷する一枚のページに複数のページをまとめて印刷するときに使用されるもののようです。なので,シェープを取り扱う上では関係ないようです。 あまり関係ないのですが, Doc.CurrentController.Model.PagePrintSettings に関して, Doc.CurrentController.Model として取得したオブジェクトは Doc = StarDesktop.CurrentComponent でドキュメントオブジェクトを取得できたときと同じものになっているはずです。インターフェースが同じです。
残念ながら Writer の FrameRect は位置の取得のためには使うことができないようです。Position や Size プロパティーをお勧めします。Developer's Guide には記述はありませんでした。IDL Reference には載っていましたが。 Writer での場合は,シェープのアンカーが絡んでくるために位置はかなり複雑になってきます。アンカーはいくつも種類があります。同じシェープのアンカーを「段落」から「ページ」へ変更するだけで Y 座標が変わってきます。 そのため,位置の表示というのが他のドキュメント形式と同じように取り扱っていいのか疑問です。(まあ,そこのところはマクロを書く人それぞれでしょうが)
Sub Main Dim oDoc As Object Dim oController As Object Dim oViewCursor As Object oDoc = ThisComponent oController = oDoc.getCurrentController() oViewCursor = oController.ViewCursor() MsgBox oViewCursor.PageStyleName End Sub しかし,シェープのページに対する絶対的な位置の取得が Writer では難しいようなのでページスタイルを取得できても意味が ...
elseif IsWriter(Doc) then objX = Group.Position.X / 100 : objY = Group.Position.Y / 100 objfX = (Group.FrameRect.X - Group.AnchorPosition.X) / 100 objfY = (Group.FrameRect.Y - Group.AnchorPosition.Y) / 100 座標は、望んでいた「位置とサイズ」が示す座標を示すようになりました。
個々のプロパティが絶対座標かどうかは、Draw/Calc/Writerで異なるので、詳細な挙動はアプリ別に分けて書く必要があると思います。「はにゃ」さん、旨くまとめてやってください。-- 河井? 2005-03-04 (金) 15:47:39
|