Top > OOoBasic > Writer > faq
#contents

*FAQ for OpenOffice.org Basic with Writer [#uad9c1cc]

**現在のカーソル位置にテキストを挿入する [#ta6ed527]
現在の位置範囲を取得することが必要です。そのために使用することができるのが,ビューカーソル (ViewCursor) です。

ビューカーソルオブジェクトを取得することで,現在のカーソル位置範囲となります。ビューカーソルオブジェクトは ''getViewCursor'' メソッドを使用して取得します。

 Sub currentcursorposition
 Dim oDoc As Object, oController As Object
 Dim oViewCursor As Object
   
   oDoc = ThisComponent
   oController = oDoc.getCurrentController()
   oViewCursor = oController.getViewCursor()
   oViewCursor.setString("Now!")
 End Sub

このようにすると,普通のテキストなら挿入することができます。また,カーソル範囲が選択状態のときは置換されます。

**現在のカーソル位置にテキストコンテンツを挿入する [#za795c4b]
フレームやフィールドのようなテキストコンテンツを挿入するときには ''insertTextContent'' メソッドを使用します。しかし,このメソッドは引数に範囲オブジェクトをとるため,この範囲オブジェクトが現在のカーソル位置でなければ現在のカーソル位置へ挿入することができません。

そこで,利用するのがビューカーソルです。このビューカーソルは範囲オブジェクトでもあるのです。そこで,次のようにするとフレームオブジェクトを現在のカーソル位置へ挿入することができます。

 Sub insertcurrentcursorposition
 Dim oDoc As Object, oController As Object
 Dim oViewCursor As Object
 Dim oFrame As Object, oText As Object
   
   oDoc = ThisComponent
   oFrame = oDoc.createInstance("com.sun.star.text.TextFrame")
   oController = oDoc.getCurrentController()
   oText = oDoc.getText()
   oViewCursor = oController.getViewCursor()
   oText.insertTextContent(oViewCursor,oFrame,false)
 End Sub
**ブックマーク位置にドキュメントを挿入する [#q08ccb1b]
ブックマーク位置にドキュメントを挿入します。

 Sub insertDocumentAtBookmarkPosition
   oDoc = ThisComponent
   oText = oDoc.getText()
   oBookmarks = oDoc.Bookmarks
   
   oBookmark = oBookmarks.getByName("doc2")
   oTextRange = oBookmark.Anchor
   oCursor = oText.createTextCursorByRange(oTextRange)
   oCursor.insertDocumentFromURL("file:///C:/usr/2.odt",Array())
 End Sub

ドキュメントの挿入 [[insertDocument>OOoBasic/Writer/insertDocument]] も参照。
**二つのテキスト範囲の間のテキスト範囲を利用 [#s4cbe19a]
二つのテキスト範囲の間にあるテキストフィールド  (ブックマークやテキストフィールドなどの間) を利用します。

二つのブックマーク doc1 および doc3 があり、doc1 が doc3 より前にあるときです。どちらが前にあるかどうかは[[テキスト範囲の比較>OOoBasic/Writer/text#d00b2eef]]を利用して調べます。

まず、二つのブックマークからそれぞれのアンカーのテキスト範囲を取得します。そして、テキストカーソルを一つ目の位置に移動、つづいて選択しながら二つ目の位置に移動します。二つ目の位置に移動終了時には二つ目のブックマークが選択されているので一つ前に戻って選択を解除します。このとき二つのテキスト範囲の位置関係によって左もしくは右に移動させます。

 Sub textrangebetween
   oDoc = ThisComponent
   oText = oDoc.getText()
   oBookmarks = oDoc.Bookmarks
   
   oBookmarkA = oBookmarks.getByName("doc1")
   oTextRangeA = oBookmarkA.Anchor
   
   oBookmarkB = oBookmarks.getByName("doc3")
   oTextRangeB = oBookmarkB.Anchor
   
   oCursor = oText.createTextCursor()
   oCursor.gotoRange(oTextRangeA,False)
   oCursor.gotoRange(oTextRangeB,True)
   oCursor.goLeft(1,True)
   msgbox oCursor.String()
 End Sub

テキストカーソルから二つのテキスト範囲の間のテキスト範囲にアクセスできます。

**文字を画像で置換する [#i482a6e0]
検索、見つかった文字を画像に置き換えます。

#code(ob){{
Sub ReplaceWithImage
  oDoc = ThisComponent
  oText = oDoc.getText()
  
  ' create search descriptor with search string "a"
  oSearchDesc = oDoc.createSearchDescriptor()
  oSearchDesc.SearchString = "a"
  
  ' get first result
  oResult = oDoc.findFirst(oSearchDesc)
  While (NOT IsNull(oResult))
    ' new image
    oImg = CreateImg(oDoc)
    ' create cursor with result range
    'oCursor = oText.createTextCursorByRange(oResult)
    ' replace the result textrange with image
    oText.insertTextContent(oResult,oImg,True)
    'oResult.String = ""
    ' search next
    oResult = oDoc.findNext(oResult,oSearchDesc)
  WEnd
End Sub


Function CreateImg(oDoc)
  oImg = oDoc.createInstance("com.sun.star.text.TextGraphicObject")
  oImg.GraphicURL = "file:///C:/usr/img.png"
  oImg.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
  CreateImg = oImg
End Function
}}

** どこかにカーソルを移動する [#l3702764]
フィールドやブックマーク、テキストコンテンツの位置にテキストカーソルやビューカーソルを移動したい時があります。css.text.XTextCursor インターフェースの gotoRange メソッドで指定したテキスト範囲に移動できます。テキスト範囲とは、css.text.XTextRange インターフェースをサポートしているオブジェクトのことです。
フィールドなどのテキストコンテンツは自身が配置される位置付近にアンカーを持っており、css.text.XTextContent インターフェースの getAnchor メソッドでアンカー位置のテキスト範囲オブジェクトを取得できます。

次の例ではブックマークの位置にテキストカーソルを移動します。gotoRange メソッドの二番目の引数はカーソル移動中に選択するかどうかを指定します。

 Sub MoveCursor
   oDoc = ThisComponent
   oText = oDoc.getText()
   oCursor = oText.createTextCursor()
   oBookmarks = oDoc.getBookmarks()
   oMark = oBookmarks.getByIndex(0)
   
   oCursor.gotoRange(oMark.getAnchor(), False)
 End Sub

このアンカーですが、表オブジェクトはアンカーを返しません (利用しようとするとクラッシュします)。

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