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

タイトル Re^4: Penの操作でエラー(VBS2005)
投稿日: 2008/05/23(Fri) 09:57
投稿者ひでと
遅くなりました。ありがとうございます。

> しかし、Dispose メソッド(正確には、IDisposable インターフェイス)を有する
> クラスの場合だけは例外です。IDisposable なクラスの場合には、処理の最後に
> Dispose を呼び出して、使い終わった内部リソースを破棄せねばなりません。
> (この処理を自動的にやってくれるのが、Using ステートメントです)
Disposeメソッドがあるものは 必須ということですね。分かりました。
(Usingはこれから見てみます)

>
> なお、Dispose は「内部リソースが破棄される」だけで、
> オブジェクトそのものが解放されるわけではありません。
>
> > 開放処理ができていれば dum.pen=pen.Clone でPenの設定をそっくり移す事が
> > できますよね。
> Pen.Clone は「同じ設定のペンをもう一本作成する」処理です。
> コピー後のペンもコピー元のペンも、使用後に破棄する必要があります。

破棄するタイミングがいまひとつ分からないのです。
実際の処理ではclsCiecleクラスにPenを持たせて、
それをShapeDrawクラスの中のコレクションに保存しています。
また、clsCircleクラスのTurnメソッドは同じclsCircleのインスタンスを返すメソッド(?)
として作っています。実際のShapeDrawクラスの中のコレクションを作る処理はForm1の
Button1_Clickで記載し、ShapeDraw(PicturBoxから継承)のPaintイベントで円弧を
描画する処理をしています。


PenをDisposeするタイミングですが、次のようにしてみました。(省略して記載)
ただ、これでいいのか?かなり不安なのです。アドバイスをお願いします。

Public Class ShapeDraw
    Public Circle As New clsCircle
    Public Circles As New List(Of 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

Public Class clsCircle
    Public pen As New Pen(Color.Black, 1)

    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


Public Class Form1
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim pen As New Pen(Color.Black, 1)
        pen.Width = 1
        pen.Color = Color.Black
        pen.DashStyle = Drawing2D.DashStyle.Solid
        With Me.ShapeDraw1
            pen.Color = Color.Red
            pen.DashPattern = New Single() {10.0F, 2.0F, 2.0F, 2.0F, 2.0F, 2.0F, 2.0F}
            .AddCircles(100, 100, 50, 90, 360, pen)

            pen.Color = Color.Green
            pen.DashStyle = Drawing2D.DashStyle.Solid
            .AddCircles(200, 200, 50, pen)
            .Refresh()
        End With
        pen.Dispose()'ここでPenの破棄
    '.AddCirclesでShapeDrawのCircles As New List(Of clsCircle)に保存されたPenも破棄しなければいけないのだろうか?
    End Sub
End Class

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

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