* マクロで図形内のテキストを取得する [#d032c224]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|yokoyu|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(低,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(その他,faq03,category)|
 |~投稿日|2010-10-14 16:16:05 (木)|
 |~OS|Windows 7|
 |~依存するページ||
 |~バージョン|#listbox3(3.2.1,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#n8fc6a98]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 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を更新していないので無いですか? [#r57b6682]
 >new_OOo3 (2010-10-14 19:48:47 (木))~
 ~
 こんばんわ。~
 多分、図形内のTextをDelete後にそのまま、macroを実行されているのでは?~
 例えば、Calcならば、文字削除後に任意のCellをClickして図形Objectが保有している情報を更新すれば、ご質問の現象は生じません。~
 ご確認を。~
 
 //
 ***現象出ます [#s7e56124]
 >yokoyu (2010-10-15 10:00:17 (金))~
 ~
 ご教示いただいた操作をやってみましたが、現象が出ました。~
 確認ですが、図形Objectが保有している情報は、任意のCellをClickするだけで更新されると考えてよいですか?それとも何らかのアクションが必要でしょうか?~
 ~
 > 多分、図形内のTextをDelete後にそのまま、macroを実行されているのでは?~
 上の操作でも削除したはずのテキストが表示されてしまうことは知ってはいました。これも、図形Objectが保有している情報が未更新のままだから、という理由でよいということですか?~
 ~
 結局、どちらにしても現象が出ます。~
 
 //
 ***無題 [#ed1e9e16]
 >tani (2010-10-15 16:17:50 (金))~
 ~
 私の環境(Ubuntu版OOo3.2.1)では現象でませんねー。(というか削除したあとマクロを実行するとoSel.getByIndex(0)のところでエラーが発生します。図形が選択されていない状態になっているので正しい動作のような気がします。)~
 ~
 参考までに。~
 
 //
 ***Codeを試して下さい。 [#q19bebc8]
 >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
 
 //
 ***よこやり ですが [#m14507af]
 >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 メソッドがあれば良いのですが...~
 
 //
 ***再現性について [#t270e909]
 >はにゃ? (2010-10-16 15:32:49 (土))~
 ~
 私の環境でも再現できましたが、この状態でファイルを保存、開き直すと文字列が復元されるます。表示と食い違っているようです。~
 
 //
 ***無題 [#md43daae]
 >Wannwanno (2010-10-16 17:17:33 (土))~
 ~
 開き直しですが、復元される時とされない時がある様です。~
 もう少し調べますが、コンテキストメニューでテキストを開いた時、全幅というオプションがあるのですが、これが絡んでいる様な感じがします。~
 
 //
 ***わかりませんね~ [#t2d4f61c]
 >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さんが記している「全幅というオプション」をつけても現象は生じないと思います。~
 
 //
 ***とりあえず [#id0df0a5]
 >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
 
 //
 ***時間を空けてしまいました [#o8387dc4]
 >yokoyu (2010-10-19 10:37:08 (火))~
 ~
 みなさまレスありがとうございます。~
 ~
 当方が行った手順はnew_OOo3さんが 2010-10-15 20:32:06 (金) に提示していただいたコードの通りです。図形に対してオプション等は一切付けておりません(デフォルトのまま)。~
 ~
 Wannwannoさんに提示していただいたコードで試してみましたが、Calcでは現象が出なくなりました。しかし、Writerではやはり現象が出ます。~
 ~
 当方はWriterで調査をしておりますが、何の糸口も見つかっていないのが現状です。~
 
 //
 ***Writer [#df24f0d7]
 >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
 
 //
 ***ありがとうございます [#h1c0fcd8]
 >yokoyu (2010-10-20 10:05:54 (水))~
 ~
 Wannwannoさん、ありがとうございます。~
 ~
 提示いただいたコードでWriter、Calcともに現象が出なくなりました。これを参考に処理を組んでいきたいと思います。~
 それにしても、ここまでいろいろとやらないといけなかったのですね…(--;~
 ~
 みなさまご回答ありがとうございました。~
 
 //
 #article