Top > OOobbs > 57

OOobbs/57 Edit

  • サマリ: LineShapeオブジェクトを一片に削除する方法
  • 環境: Calc
  • 状態: 解決
  • 投稿者: Kuma?
  • 投稿日: 2005-04-13 (水) 21:31:01

質問 Edit

LinuxでOOo1.1.2を使っています。 DrawPageに曲線(例えば放物線)を描く場合、多数のLineShapeオブジェクト(LineShapeオブジェクトの配列)を作成して、for-next文を使用して1個1個の短い直線を描き、それらの座標(位置とサイズ)を指定して接続すれば曲線を描ける事、また、作成するLineShapeオブジェクトの配列数は、Dim oLineshape(number)等の様に、動的に変化する配列とすれば良いと言うこと迄は分かりました。

ところが、この曲線を描く条件をcalcのセルから読み込み、繰り返し再描画を行う場合に、前に描いたLineShapeの集合を削除する必要があります。 その方法としてLineShapeオブジェクトの配列をfor-next文を用いて削除する方法が考えられますが、多数の異なった曲線を描いた場合に、この方法で削除するのは、for-next文を多数作成しなければならず不便な気がします。DrawPage上のLineShapeオブジェクトやその他(例えばテキストボックス)の色々なオブジェクトの集合を一気に選択して削除する命令文は有るのでしょうか?

ご教示を宣しくお願い致します。

回答 Edit

  • 「色々なオブジェクトの集合を一気に選択して削除する命令文」は残念ながらありません。またダイヤログを用いたマクロなのかシート上にフォームコントロールを配置して実行するマクロなのかで実現方法も変わってきます。対象ドローページ上のドローオブジェクトを全て削除するなら、以下の様な短い処理で済みます。
    REM  *****  BASIC  *****
    
    Sub TestErase
    Dim oDoc As Object
    Dim oController As Object
    Dim oDrawPage As Object
    
    	oDoc = StarDesktop.getCurrentComponent()
    	oDrawPage = oDoc.CurrentController.ActiveSheet.getDrawPage()
    	RemoveAllDrawObject(oDrawPage)
    End Sub
    
    ' 対象ページのドローオブジェクトを全て削除
    ' [注意]フォームコントロールも全て削除されます。
    Sub RemoveAllDrawObject(oPage As Object)
    Dim oShape As Object
    	While oPage.Count >0
    		oShape = oPage.getByIndex(0)
    		oPage.remove(oShape)
    	Wend
    End Sub

ですが、この方法では、同じドローページ上のフォームコントロールも削除されてしまいます。線やテキストオブジェクトを描くときに多少の処理の追加が必要ですが、以下の方法が使えるかもしれません。

REM  *****  BASIC  *****

Global oLineShapes As Object

Sub TestLine
Dim oDoc As Object
Dim oDrawPage As Object
Dim oLineShape(10) As Object
'Dim oLineShapes As Object
Dim oPoint As Object
Dim oSize As Object
Dim oGroup As Object
	
	oDoc = ThisComponent
	oDrawPage = oDoc.getSheets().getByIndex(0).DrawPage
	
	oPoint = CreateUnoStruct("com.sun.star.awt.Point")
	oSize = CreateUnoStruct("com.sun.star.awt.Size")
	
	oLineShapes = CreateUnoService("com.sun.star.drawing.ShapeCollection")
	
	for i=0 to 9
		oLineShape(i) = oDoc.createInstance("com.sun.star.drawing.LineShape")
		' ダミーのプロパティ
		oPoint.x = i * 100
		oPoint.y = i * 100
		oSize.Width = 100
		oSize.Height = 100
		With oLineShape(i)
			.LineWidth = 10
			.Size = oSize
			.Position = oPoint
		End With
		oDrawPage.add(oLineShape(i))
		oLineShapes.add(oLineShape(i))	'--> 作成時にあらかじめコレクションに追加しておく。
	next i
	' LineErase2を使う場合は、下のコメントをはずす
' 	oGroup = oDrawPage.group(oLineShapes)	'--> グループ化
' 	oGroup.Name = "CurveLine"	'--> 名前をつけておく。
End Sub

' 線コレクションを削除
Sub LineErase1
	oDoc = ThisComponent
	RemoveShapes(oDoc, oLineShapes)
End Sub

' 対象となるコレクションを削除
Sub RemoveShapes(oDoc As Object, oShapeCollection As Object)
Dim dispatcher As Object
Dim oController As Object
Dim oFrame As Object
	oController = oDoc.getCurrentController()
	oFrame = oController.getFrame()
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	oController.select(oShapeCollection)
	dispatcher.executeDispatch(oFrame, ".uno:Delete", "", 0, Array())	
End Sub

' グループ化された線オブジェクトを削除
Sub LineErase2
	oDoc = ThisComponent
	oDrawPage = oDoc.getSheets().getByIndex(0).DrawPage
	if oDrawPage.Count>0 then
		for i = 0 to oDrawPage.Count-1
			oShape = oDrawPage.getByIndex(i)
			if oShape.Name = "CurveLine" then
				oDrawPage.remove(oShape)
				Exit Sub
			end if
		next i
	end if
End Sub

TestLineを実行して描画した線オブジェクトをLineErase1もしくは、LineErase2を実行して削除するサンプルマクロです。グループ化するしないは、好みの問題もありますので両方の場合の処理を書いておきました。ShapeCollection オブジェクトを作り、それに追加する事でグループ化したり、まとめて選択させたりといった処理を実現しています。 -- 河井? 2005-04-14 (木) 13:55:45

  • 河井さん、丁寧な御指導有難うございました。描画のデータと描画を指示するコントロールボタンを設置するワークシートと、図を書くシートは別にするので、河井さんが2番目に記載してくださったコードでいけそうです。早速試してみます。色々な方法を示して頂き本当に有難う御座いました。それらのコードもこれから勉強させて頂きます。OOoのBasicは始めて間もないので分からぬ事が多く、お尋ねする機会が多いと思いますがよろしく御指導お願い致します。 -- Kuma? 2005-04-15 (金) 00:26:37


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