C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.87031 の関連記事表示

<< 0 >>
■87031  Re[12]: コントロールが全て削除されてしまう
□投稿者/ 魔界の仮面弁士 -(2018/04/07(Sat) 23:10:48)
    No87025 (FRMC さん) に返信
    > iPic.Controls.Clear() '←ここ

    iPic というのが何を指しているのか不明瞭ですが、PictureBox の名前でしょうか?
    だとしたら、 No86971No86986 でも述べているように、これでは NG です。

    https://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.controlcollection.clear%28v=vs.100%29.aspx

    》 Clear メソッドを呼び出しても、コントロールのハンドルが
    》 メモリから削除されることはありません。 メモリ リークを防ぐには、
    》 Dispose メソッドを明示的に呼び出す必要があります。


    Dispose 漏れ自体は、Label が消えずに残る問題とは別の話ですが、
    コントロールの動的生成・削除を繰り返すようなアプリならばなおの事、
    確実に解放するコードを用意すべきでしょう。


    > 'For Each l As Control In iPic.Controls
    > ' If TypeName(l) = "Label" Then 'これだと頂点が残ってしまうコード
    > ' iPic.Controls.Remove(l)
    > ' End If
    > 'Next

    そりゃそうですよ。
    For Each で Controls を列挙している最中に、Remove や Add で
    Controls の数を増減させてはいけません。列挙位置がズレちゃいます。

    No86986 のコードにしても、.Controls を直接 For Each してはいなかったですよね?


    > ' If TypeName(l) = "Label" Then 'これだと頂点が残ってしまうコード
    わざわざ TypeName で型名を文字列化してから判定させるのではなく、
     If TypeOf l Is Label Then
    のように、型そのものを直接判定する方が望ましいです。
    コンパイル時にチェックされるので、スペルミスも防げます。

    それと Label だけを列挙させたいのであれば、先の例にも挙げた
    OfType メソッドを使うのが便利ですよ。



    > .Name = iPic.Name
    これはあまり望ましくないですね…。
    これでは、すべての Label が同じ名前になってしまっています。
    (それも、コンテナとなる iPic と同じ名前に)

    Visual Studio のフォームデザイナでも、
    複数の Label に同じ名前を付けることはできませんよね?

    デザイン時とは違って、名前が競合したとしても Add はできるのですが、
    すべて同じ Name を付けてしまうと、個々の名前では識別できなくなってしまいます。
    というか、どうせ識別に使わない予定なら、Name は未設定のままでも十分でしょう。


    > ps = iPic.PointN.ToArray

    んん…?

    先ほどは iPic が PictureBox と仮定しましたが、
    だとしたら PointN というメンバーは無いはず…。

    ということは、iPic は UserControl もしくは Form なのかな…?


    > For i As Long = 0 To UBound(ps)
    これも違っていますね。As Long ではなく、As Integer が正しいです。
    VB.NET では UBound の戻り値は Integer です。配列の添字も Integer 型で指定します。


    > GC.Collect(GC.MaxGeneration)
    Label が消せなかったのは、列挙方法に問題があったからであって、
    ガベージコレクションとは無関係です。

    不用意にガベージコレクトを強制発動させることはデメリットにもなりえるので、
    ここで呼ぶべきでは無いでしょう。Controls.Add するたびに呼ぶような物ではありません。
記事No.86964 のレス /過去ログ149より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -