タイトル : Re^5: Penの操作でエラー(VBS2005) 投稿日 : 2008/05/23(Fri) 11:53 投稿者 : 魔界の仮面弁士
> 破棄するタイミングがいまひとつ分からないのです。 よく分からないのであれば、 「使う直前にその都度作成、使い終わったら即時破棄」 という方法を用いることができます。その方が実装難易度は下がります。 その方法を使いたく無い(都度作成するのではなく、使いまわしたい)のであれば、 Pen を管理するクラスの寿命をキチンと管理せねばならないので、多くの場合、 その管理クラスには、IDisopsable Finalize パターンを実装する事になるでしょう。 http://msdn.microsoft.com/ja-jp/library/b1yfkh5e.aspx > 実際の処理ではclsCiecleクラスにPenを持たせて、 > それをShapeDrawクラスの中のコレクションに保存しています。 その場合、clsCiecle が Pen を管理する事になりますね。 その場合、clsCiecle を管理・作成するのが、どのクラスの役割なのかを 事前にはっきりさせておく必要があるでしょう。 (Form で作成/管理するのか、ShapeDraw が作成/管理するのか) > また、clsCircleクラスのTurnメソッドは同じclsCircleのインスタンスを返すメソッド(?) 「同じインスタンス」という事は、その Turn メソッドの実装は、 Public Function Turn() clsCircle Return Me End Function という事になりますが…それはあまり意味のある実装には思えません。 > Button1_Clickで記載し、ShapeDraw(PicturBoxから継承)のPaintイベントで円弧を > 描画する処理をしています。 その円弧が、PictureBox 以外に描画させる事は絶対にない、というのならば良いですが、 もし、その PictureBox 以外にも描画させたい場合(たとえば印刷処理など)が 生じた場合、同じような処理を再実装せねばならなくなるかも知れません。 もし、他の個所にも同様の描画処理が発生しえる場合は、描画処理部分だけを 別クラスにするという設計も方法あります。 たとえば、.NET 2.0 では、『ボタンを描画する処理』のために ButtonRenderer クラス、 『コンボボックスを描画する処理』のために ComboBoxRenderer クラスを用意していますが、 これらは Graphics クラスに対して処理するだけのクラスなので、特定の PictureBox などに 限定される事無く、フォームに直接描画したり、印刷したりする場合にも利用できます。 # どちらの実装方法が良いのかは、アプリの仕様次第なので、一概には言えませんが。 > Public Class ShapeDraw > Public Circle As New clsCircle > Public Circles As New List(Of clsCircle) この実装は、安全では無いように思えます。 AddCircles 等を介することなく、呼び出し側から ShapeDraw1.Circles.Clear ShapeDraw1.Circles.Add(New clsCircle()) のように直接操作する事もできてしまいますから。 > Public Sub AddCircles(ByVal 中心x As Single, ByVal 中心y As Single, ByVal 半径 As Single, ByVal 始点角 As Single, ByVal 終点角 As Single, ByVal pen As Pen) > Dim mCircle As New clsCircle > With mCircle > .pen = pen.Clone > End With > Circles.Add(mCircle) > End Sub その実装の場合、pen を破棄するのは「ShapeDraw1.AddCircles を呼び出した側」の役割ですが、 pen.Clone を破棄するのは、「clsCircle クラス」の役割となりますね。 ShapeDraw 側は、Circles を破棄する場合(Circles.Clear とか、Circles.RemoveAt など)に、 clsCircle クラス(内の Pen)が解放させる義務が生じるので、お忘れなく。 > Public Function Turn(ByVal Angle As Single) As clsCircle > Dim dum As New clsCircle > dum.pen = pen.Clone > pen.Dispose()'ここでclsCircleのpenを破棄 > Return dum'ここではdum.penの破棄は行えないはず > End Function あれ? 先ほどは、同じインスタンスを返すと言っていたような…。 でも実際には、別のインスタンスを返していますね。 もしかして、『同じclsCircleのインスタンスを返すメソッド』というのは、 「同じclsCircle型の異なるインスタンスを返すメソッド」のような意味だったのかな。 |