Top > OOoBasic > Generic > document
*ドキュメント [#lb7e0db0]
OOo Basic でドキュメントを操作する場合に知っておくとよさそうなこと。既存のドキュメントを読み込んだり保存する方法は[[読み込みと保存>OOoBasic/Generic/LoadAndStore]]を参照してください。

#contents
**ドキュメント [#ma25e2aa]
開いているドキュメントの Basic コードからそのコードがあるドキュメントにアクセスするには ''ThisComponent'' ステートメントを使用します。
  Dim oDoc As Object
  oDoc = ThisComponent
ドキュメントオブジェクトにしたい変数 (ここでは oDoc) に代入します。
このドキュメントオブジェクトを通じてドキュメントの様々な内容にアクセス操作できるようになります。 


すでに開いているドキュメントでも,''StarDesktop'' からアクセスできます。
  Dim oDoc As Object
  oDoc = StarDesktop.CurrentComponent
''StarDesktop'' のプロパティー ''CurrentComponent'' を用いると,Basic コードを実行したドキュメントオブジェクトが取得できます。

**新規ドキュメント [#x9146b18]

新しい空のドキュメントを開くときは ''loadCompoentFromURL'' の引数の URL を次のように指定します。

,document,URL
,writer,private:factory/swriter
,web,private:factory/swriter/web
,global,private:factory/swriter/GlobalDocument
,calc,private:factory/scalc
,draw,private:factory/sdraw
,impress,private:factory/simpress
,math,private:factory/smath
,label,private:factory/swriter?slot=21051
,card,private:factory/swriter?slot=21052

  Dim oDoc As Object
  oDoc = StarDesktop.loadComponentFromURL( _
       "private:factory/scalc, _
       "_blank", 0, Array() )
**ThisComponent &aname(thiscomponent); [#qf343011]

''ThisComponent'' は実行される Basic のコードがドキュメントのライブラリにあるときは,そのドキュメントのオブジェクトです。しかし,アプリケーションのライブラリで ''ThisComponent'' が用いられたときはドキュメントがありません。このとき,''ThisComponent'' はそのコードを実行したドキュメントのオブジェクトとなります。
**CurrentComponent &aname(currentcomponent); [#bfe83c34]

''StarDesktop.CurrentComponent'' を用いると,別のドキュメントのライブラリにあるコードも実行したドキュメントのオブジェクトが返されるので,別のドキュメントからも使用できます。

  Sub CurrentComponent_test()
  Dim oDoc As Object
    oDoc = StarDesktop.CurrentComponent
    MsgBox oDoc.URL
  End Sub

ドキュメントをいくつか用意してどれか一つのドキュメントに上のコードを入れます。コードを実行すると実行したドキュメントの URL が表示されます。それぞれ実行したドキュメントのオブジェクトが返っていることが分かります。

**ThisComponent と CurrentComponent [#q2bf165c]

ThisComponent と CurrentComponent 二つのどちらを使えばいいのでしょうか?

どちらかを選ぶときには,まず次のことを判断して決めます。

-そのコードをどこのライブラリに入れておくか

OOoBasic のマクロコードを入れておく (保存しておく) ことができるのは次の二つです。

-アプリケーションのライブラリ
-ドキュメントごとのライブラリ

アプリケーションのライブラリに入れておくときには,ThisComponent を使うといいでしょう。

ドキュメントごとのライブラリに入れておくときには,もう一つ,次のことを判断して決めます。

-コードをどこから実行するか

「コードをどこから実行するか」というのを,「そのコードを入れてあるドキュメント以外のドキュメントからも実行するかどうか」と言い換えます。

-「そのドキュメントからのみ実行する」 -> ThisComponent
-「他のドキュメントからも実行する」-> CurrentComponent

をそれぞれ使用することになります。
**ドキュメントの種類 [#uf5c2f9a]
ドキュメントの種類を判断する必要がある時にはサポートされているサービス名を調べることでドキュメントの種類を区別することができます。

各ドキュメントはそれぞれ特有のサービスをサポートしています。特有なサービスは次のものです。

,document,サービス名
,writer,com.sun.star.text.TextDocument
,calc,com.sun.star.sheet.SpreadsheetDocument
,draw,com.sun.star.drawing.DrawingDocument
,impress,com.sun.star.presentation.PresentationDocument
,math,com.sun.star.formula.FormulaProperties

これらのサービス名は大文字と小文字を正確に入力する必要があります。

このサービス名を ''ThisComponent'' などのドキュメントへのインターフェースに対して ''supportsService'' メソッドで判断します。

次のコードでは Writer ドキュメントかどうかを判断しています。

 Sub document_1
 Dim oDoc As Object
   oDoc = ThisComponent
   If oDoc.supportsService( "com.sun.star.text.TextDocument" ) Then
     MsgBox "Supported"
   Else
     MsgBox "Not Supported"
   End If
 End Sub

**ドキュメントの URL [#y1dc4936]
ドキュメントの URL はドキュメントが保存されていないと空文字列です。
 msgbox ThisComponent.getURL()

''hasLocation'' メソッドで保存されているかどうか調べられます。


**ドキュメントの種類とオブジェクト [#b174d2a8]
ドキュメントのオブジェクト構造はドキュメントの種類により異なります。

**Writer ドキュメント [#r68d5b1b]

&ref(writer_doc.png,left,nolink);

-ページの概念がなく単一のページです。
-テキストにはセクション、段落があります。
-ドローページが一つしかありません。

**Draw, Impress ドキュメント [#g37dabe1]

&ref(drawimpress_doc.png,nolink);

-複数のページがあります。
-ページはドローページに対応します。

** 特定のドキュメントのオブジェクト [#z684ac43]
[[ドキュメントオブジェクトを取得>OOoBasic/Generic/Desktop#o1eb3b0e]]参照。

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes