■87039 |
Re[15]: コントロールが全て削除されてしまう |
□投稿者/ 魔界の仮面弁士 -(2018/04/08(Sun) 14:53:23)
| 2018/04/08(Sun) 14:54:51 編集(投稿者)
■No87025 (FRMC さん) に返信 > iLabel = New Label > With iLabel
この iLabel はどこで宣言していますか?
ローカル変数であるのなら良いですが、 フィールド変数として Private iLabel As Label などとするのは NG ですよ。
■No87032 (Azulean さん) に返信 >> 先ほどは iPic が PictureBox と仮定しましたが、 >> だとしたら PointN というメンバーは無いはず…。 > なぜ、このスレッドでは明かしていないのか謎ですが、 No86825 では元のサンプルのサイトをリンクしています。
なるほど。そこまでは見ていませんでした。 No86812 から始まるスレッドですね。 http://bbs.wankuma.com/index.cgi?mode=al2&namber=86812#5
> 元としたサンプルの悪い使い方の影響を受けているのかもしれませんね。 Web ページに書かれた文章はそうなっていますが、 公開されている試作品では下記のように実装されていました。 一応、一意な名前を割り当てようとしているようですね。
'Name = "exL" & i 'Withの中だとName、tag、textが空白になる 'Tag = i 'Text = i End With Me.iLabel.Name = i Me.iLabel.Tag = i iLabel.Text = i
Name だけでなく Text もセットされているので、あちらの実装では 各頂点ラベルに [0]、[1]、[2] …の文字も表示させているようです。
■No87034 (FRMC さん) に返信 > だとしたら修正します。
頂点ラベルの位置も補正した方が良いと思います。
先ほどの https://pbs.twimg.com/media/DaF-QOYVwAAY1CR.jpg を見てみると、ラベルの左上が頂点になっていますが、 マーカーの中心が頂点にくるようにする方が綺麗に見えます。
.Width = 11 .Height = 11 .Location = ps(i) - New Point(5, 5)
もちろんドラッグ処理についても、同様の補正が必要になりますが。
で、本題となる「ラベルの削除」ですが、これについては既に 残ってしまう原因を No87031 で説明しており、 正しく消せる実例を No86986 で述べております。
すなわち、iPic に置き換えると 'これだと Label のハンドルがリークする 'iPic.Controls.Clear() ' 'なので No86986 の対策コードに差し替える For Each lbl In iPic.Controls.OfType(Of Label).ToArray() iPic.Controls.Remove(lbl) lbl.Dispose() Next ということですね。
もしも先の説明で分からなかった点があるようであれば、 理解できなかった部分を示していただければ、追加説明を加えることもできますよ。
> Expictureboxで線の描画をしています。 > pictureboxはあくまでも背景です。 うーん。あのサンプルをそのまま真似ているのだとすると、 ドラッグ処理のところで、直線の再描画のために Dim canvas As New Bitmap(Me.ExPictureBox1.Width, Me.ExPictureBox1.Height) Dim g As Graphics = Graphics.FromImage(canvas) ' '中略(描画処理) ' Me.ExPictureBox1.Image = canvas というコードが使われているのが気がかりです。 差し替える前の古い Image と、作成した Graphics が解放漏れとなっているので…。 (既に修正済みかもしれませんが) |
|