Top > OOoBasic > Writer > faq

FAQ for OpenOffice.org Basic with Writer Edit

現在のカーソル位置にテキストを挿入する Edit

現在の位置範囲を取得することが必要です。そのために使用することができるのが,ビューカーソル (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

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

現在のカーソル位置にテキストコンテンツを挿入する Edit

フレームやフィールドのようなテキストコンテンツを挿入するときには 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

ブックマーク位置にドキュメントを挿入する Edit

ブックマーク位置にドキュメントを挿入します。

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 も参照。

二つのテキスト範囲の間のテキスト範囲を利用 Edit

二つのテキスト範囲の間にあるテキストフィールド (ブックマークやテキストフィールドなどの間) を利用します。

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

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

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

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

文字を画像で置換する Edit

検索、見つかった文字を画像に置き換えます。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
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

どこかにカーソルを移動する Edit

フィールドやブックマーク、テキストコンテンツの位置にテキストカーソルやビューカーソルを移動したい時があります。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