tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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型の異なるインスタンスを返すメソッド」のような意味だったのかな。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。