「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:2
昨日:0
総数:1624
現在:3


マクロで図形内のテキストを取得する

ページOpenOffice.org FAQの登録ページ
投稿者yokoyu
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2010-10-14 16:16:05 (木)
OSWindows 7
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

Writer、Calcで、長方形などの図形を挿入し、さらに中にテキストを入力しておきます。 図形を選択後、以下のマクロを実行します。

Sub Main
  Dim oDoc : oDoc = ThisComponent
  Dim oSel : oSel = oDoc.CurrentSelection
  Dim oObj : oObj = oSel.getByIndex(0)
  MsgBox(oObj.String)
End Sub

すると、図形内に入力したテキストが表示されます。
ここまでは良いのですが、さらにこの図形のテキストをすべて削除した後、同じマクロを実行します。すると、メッセージには削除したはずのテキストが表示されてしまいます。

これはOpenOffice側の不具合と認識してよいのでしょうか。それとも、図形内のテキストを間違いなく取得できる方法があるのでしょうか。
ご存知の方、ご回答のほどよろしくお願いします。


Objectを更新していないので無いですか?

new_OOo3 (2010-10-14 19:48:47 (木))

こんばんわ。
多分、図形内のTextをDelete後にそのまま、macroを実行されているのでは?
例えば、Calcならば、文字削除後に任意のCellをClickして図形Objectが保有している情報を更新すれば、ご質問の現象は生じません。
ご確認を。

現象出ます

yokoyu (2010-10-15 10:00:17 (金))

ご教示いただいた操作をやってみましたが、現象が出ました。
確認ですが、図形Objectが保有している情報は、任意のCellをClickするだけで更新されると考えてよいですか?それとも何らかのアクションが必要でしょうか?

> 多分、図形内のTextをDelete後にそのまま、macroを実行されているのでは?
上の操作でも削除したはずのテキストが表示されてしまうことは知ってはいました。これも、図形Objectが保有している情報が未更新のままだから、という理由でよいということですか?

結局、どちらにしても現象が出ます。

無題

tani (2010-10-15 16:17:50 (金))

私の環境(Ubuntu版OOo3.2.1)では現象でませんねー。(というか削除したあとマクロを実行するとoSel.getByIndex(0)のところでエラーが発生します。図形が選択されていない状態になっているので正しい動作のような気がします。)

参考までに。

Codeを試して下さい。

new_OOo3 (2010-10-15 20:32:06 (金))

こんばんわ。
cellを選んだ後に再度図形を選択しなければ、taniさんのご指摘の通りerrorになりますよ。

結局、どちらにしても現象が出ます。
=> 当方の環境(Windows 7 Professional 32bit版)では現象がでません。

質問者さんがされている手順の詳細が不明ですので、現象が「出る」「出ない」の水掛け論をしていても前向きでは無いので、当方が推定している質問者さんの手順を下記Codeに記します。
Codeを実行すると、一度目は「OOoMacro」、次のmessage Windowは何も表示されないと思います。

確認してみて下さい。

********** Code ***********
Sub oDShape
	Dim oPage     'Page on which to draw
	Dim oShape    'Shape to insert
	Dim oDoc
	Dim Dummy()
		oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_default", 0, Dummy())
		oPage = oDoc.DrawPages().getByIndex(0)
		' 四角形の中にTEXT
		oShape = oDoc.createInstance("com.sun.star.drawing.RectangleShape")
			oPage.add(oShape)
			oShape.setPosition(createPoint(1000, 1000))
			oShape.setSize(createSize(6000, 1000))
			oShape.setString("OOoMacro")
	'
	Dim oSelection
		oSelect = oDoc.CurrentController().select(oShape)
	'
       ' ここから先が質問者さんの手順
	Dim oSel : oSel = oDoc.CurrentSelection
 	Dim oObj : oObj = oSel.getByIndex(0)
 		MsgBox(oObj.String)  ' <= OOoMacro と表示 
 	'
 		oShape.setString("")
 	'
 		oSelect = oDoc.CurrentController().select(oShape)
	'
		oSel = oDoc.CurrentSelection
 		oObj = oSel.getByIndex(0)
 		MsgBox(oObj.String)	' <= 何も表示されない。		
End Sub
'
'[ Function 1 ]
Function CreatePoint(ByVal x As Long,ByVal y As Long) As com.sun.star.awt.Point
	Dim oPoint
		oPoint = createUnoStruct( "com.sun.star.awt.Point" )
		oPoint.X = x : oPoint.Y = y
		CreatePoint = oPoint
End Function
'
'[ Function 2 ]
Function CreateSize(ByVal x As Long,ByVal y As Long) As com.sun.star.awt.Size
	Dim oSize
		oSize = createUnoStruct( "com.sun.star.awt.Size" )
		oSize.Width = x : oSize.Height = y
		CreateSize = oSize
End Function

よこやり ですが

Wannwanno (2010-10-16 15:22:47 (土))

こんにちわ

自分の環境では、再現します(WindowsXP OOo3.2.1)
new_OOo3 さんの Code では再現しません、違いは setString にあります。
手入力で文字を削除(0サイズ文字列の入力)した場合、Shape上では消えた様に見えますが、
Stringプロパティ又はgetStringメソッドで読み出した場合消えていない(参照がNullになっていない)のです。
他の文字列に書き換えた場合は替わっています。
いろいろ試してみましたが、途中で文字列が(Shapeから消えてプロパティでは読める状態の時)破壊された事から、
メモリマネージャ内では、破棄済みの文字列であろうと思います。

はにゃ? さんの MRI で、Shape,TextCursor,Text の Diff を見てみましたが、文字列を消す前後で同じでした。
文字列を消した Shape を、マウス操作でコピーした場合はコピー先の Shape のプロパティが空文字列でしたので、
Shape 内部では正しく扱えている様です。

Refresh や Update メソッドがあれば良いのですが...

再現性について

はにゃ? (2010-10-16 15:32:49 (土))

私の環境でも再現できましたが、この状態でファイルを保存、開き直すと文字列が復元されるます。表示と食い違っているようです。

無題

Wannwanno (2010-10-16 17:17:33 (土))

開き直しですが、復元される時とされない時がある様です。
もう少し調べますが、コンテキストメニューでテキストを開いた時、全幅というオプションがあるのですが、これが絡んでいる様な感じがします。

わかりませんね~

new_OOo3 (2010-10-16 21:01:46 (土))

こんばんわ。
はにゃ?さんやWannwannoさんの情報を元に当方の環境で再現できました。
しかし、現象が出る時と出ない時があります。
確実に現象がでる訳ではないので、issueとして扱うのは難しと思います。
とりあえずの対策としては、下記stepで行えば、当方の環境では現象は現ません。現実的ではありませんが参考までに。

1)Shapeを選択してMacro実行 => Textが表示
2)Shape内のTextを削除
3)Shapeを選択せずにMacroを実行 => 当然Errorとなります。
4)Shapeを選択してMacroを実行 => 何も表示されません。

深く調べていないのですが、Macro Codeにて実行した場合はこのような現象は生じませんでした。
Wannwannoさんが記している「全幅というオプション」をつけても現象は生じないと思います。

とりあえず

Wannwanno (2010-10-18 19:40:36 (月))

こんばんは
new_OOo3 さんの対策方法から、このようにすればプロパティをクリア出来る事までは判りました。

Sub Main2
  Dim oDoc : oDoc = ThisComponent

  Dim oSel2 : oSel2 = oDoc.CurrentSelection
  oDoc.CurrentController.Select(Nothing)
  Dim oSel3 : oSel3 = oDoc.CurrentSelection
  oDoc.CurrentController.Select(oSel2)
  oSel2 = Nothing

  Dim oSel : oSel = oDoc.CurrentSelection
  Dim oObj : oObj = oSel.getByIndex(0)
  MsgBox(oObj.String)
End Sub

時間を空けてしまいました

yokoyu (2010-10-19 10:37:08 (火))

みなさまレスありがとうございます。

当方が行った手順はnew_OOo3さんが 2010-10-15 20:32:06 (金) に提示していただいたコードの通りです。図形に対してオプション等は一切付けておりません(デフォルトのまま)。

Wannwannoさんに提示していただいたコードで試してみましたが、Calcでは現象が出なくなりました。しかし、Writerではやはり現象が出ます。

当方はWriterで調査をしておりますが、何の糸口も見つかっていないのが現状です。

Writer

Wannwanno (2010-10-19 20:13:02 (火))

こんばんわ
すいません、Writer ではプロパティをクリア出来ていませんでした orz
とりあえず追加をしました、一見何をしたいのかよく解らないプログラムになってしまいました...

Sub Main9
  Dim oDoc : oDoc = ThisComponent

  Dim oCtrl : oCtrl = oDoc.CurrentController
  Dim oSel2 : oSel2 = oDoc.CurrentSelection
  if oDoc.supportsService("com.sun.star.text.GenericTextDocument") then
    createUnoService("com.sun.star.frame.DispatchHelper").executeDispatch( _
      oCtrl.Frame, ".uno:Escape", "", 0, array)
    oCtrl.Select(oCtrl.ViewCursor)
  else
    oCtrl.Select(Nothing)
  end if
  Dim oSel3 : oSel3 = oDoc.CurrentSelection
  oCtrl.Select(oSel2)
  oSel2 = Nothing

  Dim oSel : oSel = oDoc.CurrentSelection
  Dim oObj : oObj = oSel.getByIndex(0)
  MsgBox(oObj.String)
End Sub

ありがとうございます

yokoyu (2010-10-20 10:05:54 (水))

Wannwannoさん、ありがとうございます。

提示いただいたコードでWriter、Calcともに現象が出なくなりました。これを参考に処理を組んでいきたいと思います。
それにしても、ここまでいろいろとやらないといけなかったのですね…(--;

みなさまご回答ありがとうございました。

お名前:
題名: