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

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

C# と VB.NET の入門サイト

コントロールが全て削除されてしまう

[トピック内 30 記事 (1 - 20 表示)]  << 0 | 1 >>

■86964 / inTopicNo.1)  コントロールが全て削除されてしまう
  
□投稿者/ FRMC (21回)-(2018/04/05(Thu) 20:26:02)

分類:[.NET 全般] 

2018/04/06(Fri) 19:30:12 編集(投稿者)

例えばコードで作成したLabelAとLabelBがpictureboxにあったとします。ここでLabelAだけ削除したい時、Picturebox.controls.clear()とすると、LabelBも削除されてしまいます。

個別にLabelAだけ、LabelBだけ削除したい場合、どうすればいいのでしょうか。

環境↓
Windows 10
Visual studio 2015 community

引用返信 編集キー/
■86969 / inTopicNo.2)  Re[1]: コントロールが全て削除されてしまう
□投稿者/ Azulean (944回)-(2018/04/05(Thu) 22:43:17)
自分がどのようなクラスを使っていて、そのクラスにどんなメンバーがあるのか調べられるようになった方が良いでしょうね。

PictureBox でぐぐると System.Windows.Forms と名前のついた PictureBox のページが見つかります。
https://msdn.microsoft.com/ja-jp/library/system.windows.forms.picturebox

ここから、Controls プロパティのリンクに飛びます。
そのページではプロパティの戻り値が ControlCollection であると書かれており、それがリンクになっているので ControlCollection クラスのページに飛びます。

そのページではメソッドの一覧としていろいろと並んでいるので、説明を読んでいくと良いでしょう。

引用返信 編集キー/
■86971 / inTopicNo.3)  Re[1]: コントロールが全て削除されてしまう
□投稿者/ 魔界の仮面弁士 (1604回)-(2018/04/06(Fri) 09:33:32)
No86964 (FRMC さん) に返信
> 個別にLabelAだけ、LabelBだけ削除したい場合、どうすればいいのでしょうか。

.Controls.Clear のかわりに
 .Controls.Remove( 子コントロールのインスタンス )
 .Controls.RemoveAt( 子コントロールのインデックス番号 )
 .Controls.RemoveByKey( 子コントロールの名前 )
を使うようにすれば、個別に取り除くことができます。


ただし、それだけでは子コントロールのハンドルはメモリから削除されません。
子コントロールを動的に追加・削除するような場合には、メモリリークを防ぐため、
.Controls から取り除いた後で LabelA.Dispose() を呼び出して、
個々のコントロールを処分しておく必要があります。


もしも .Controls に割り当てられたままの状態であれば、より上位のコントロールが
Dispose されるときに一緒に処分されるので安全です。最上位のコントロールは
Form ですから、通常はフォーム終了時に自動的に処分され、
子コントロールに対して明示的に Dispose を呼ぶ必要がありません。

しかし、.Controls から取り除いてしまったものについては、その管理から
外れてしまうので、明示的に Dispose を呼び出す必要があります。
引用返信 編集キー/
■86975 / inTopicNo.4)  Re[2]: コントロールが全て削除されてしまう
□投稿者/ FRMC (22回)-(2018/04/06(Fri) 10:52:48)
No86971 (魔界の仮面弁士 さん) に返信
> .Controls.Clear のかわりに
>  .Controls.Remove( 子コントロールのインスタンス )
>  .Controls.RemoveAt( 子コントロールのインデックス番号 )
>  .Controls.RemoveByKey( 子コントロールの名前 )
> を使うようにすれば、個別に取り除くことができます。

実践してみました。しかし、後々LabelBがコントロールの移動時に残ってしまい、最終的にエラーになってしまいます。

こうなると、残ってしまうのは必然的なのでしょうか?
Disposeも実践しましたが、コード上ラベルを再描画するアプリケーションなので、それができず消えてしまいます。

引用返信 編集キー/
■86977 / inTopicNo.5)  Re[3]: コントロールが全て削除されてしまう
□投稿者/ tecaka (1回)-(2018/04/06(Fri) 11:28:29)
> 実践してみました。しかし、後々LabelBがコントロールの移動時に残ってしまい、最終的にエラーになってしまいます。

「コントロールの移動時」とは、具体的に何をどう移動させる時ですか?
LabelBの削除を行わなければ、当然、LabelBはPictureBox上に残るわけなのですが、
「残ってしまい」とは、具体的にLabelBがどういう状態になっているのですか?
「最終的にエラー」とは、どのようなエラーになるのですか?
引用返信 編集キー/
■86978 / inTopicNo.6)  Re[4]: コントロールが全て削除されてしまう
□投稿者/ FRMC (24回)-(2018/04/06(Fri) 11:35:01)
No86977 (tecaka さん) に返信

> 「コントロールの移動時」とは、具体的に何をどう移動させる時ですか?
線の描画で頂点がラベルになっていてそれを移動させるときです。

> LabelBの削除を行わなければ、当然、LabelBはPictureBox上に残るわけなのですが、
> 「残ってしまい」とは、具体的にLabelBがどういう状態になっているのですか?
本来無いはずのラベルの頂点が残ってしまい、それを動かすと不安定になり、

> 「最終的にエラー」とは、どのようなエラーになるのですか?
不安定になってエラーになる=最終的にエラー。
引用返信 編集キー/
■86979 / inTopicNo.7)  Re[5]: コントロールが全て削除されてしまう
□投稿者/ tecaka (2回)-(2018/04/06(Fri) 12:36:31)
Picturebox上でPaintイベント等でオーナードローを行っていますか?
もしそうならば、そこら辺をもう少し詳しく書かないと、
希望する回答は付きませんよ。
引用返信 編集キー/
■86980 / inTopicNo.8)  Re[5]: コントロールが全て削除されてしまう
□投稿者/ 魔界の仮面弁士 (1607回)-(2018/04/06(Fri) 12:37:46)
2018/04/06(Fri) 12:39:36 編集(投稿者)

No86978 (FRMC さん) に返信
>>「コントロールの移動時」とは、具体的に何をどう移動させる時ですか?
> 線の描画で頂点がラベルになっていてそれを移動させるときです。

それをどのように実装しているかを説明しないと、第三者には伝わりませんよ。

いずれにせよ、「描画」の話と、「Controls への Add / Remove」を、
それぞれ切り分けて考えましょう。


System.Windows.Forms のコントロールの場合、画像のレイヤーは
 0: 親コントロールの背景
 1: 背景色 (BackgroundColor)
 2: 背景画像 (BackgroundImage)
 3: 前景画像 (Image)
 4: 描画処理 (Label の文字、Paint イベントでの描画など)
 5: 子コントロール
の順で重ね合わさります。

http://bbs.wankuma.com/index.cgi?mode=al2&namber=40235&KLOG=69#3

たとえば 2 の BackgroundImage に透過画像や半透明画像をセットすると、
透明な部分から、1 の 背景色が透けて見えます。
(数字の小さいものから大きいものへと、重ね併せて描画されていきます)


また、子コントロール(今回は Label)の背景色を Transparent にしておけば、
親コントロールである PictureBox の内容(3 番まで)が透過して描画されます。

ただし、コントロールへの描画はそのコントロール自身にしか適用されません。
Paint イベントや、CreateGraphics で PictureBox へ描画した場合、
それは 5 の子コントロール上には反映されず、クリッピングされます。

5 の、背景透過な子コントロールにも透けさせて見せるようにするには、
線の描画を 4 で行うのではなく、3 で実施することで実現できます。
(Bitmap を生成してそこに線を描き、それを Image プロパティに割り当てるということ)


>>「残ってしまい」とは、具体的にLabelBがどういう状態になっているのですか?
> 本来無いはずのラベルの頂点が残ってしまい、それを動かすと不安定になり、
コントロールが削除されずに残ってしまうという事でしょうか。
それとも、コントロールは削除されているのに、描画が残ってしまっているのでしょうか。

いずれにせよ、現在のコーディング内容が間違っているのだと思いますが、
実際のコードが一切記述されていない以上、問題点を指摘することができません。


>>「最終的にエラー」とは、どのようなエラーになるのですか?
> 不安定になってエラーになる=最終的にエラー。
そのエラーが、具体的にどのようなものであるのかを尋ねています。

例外メッセージが出るのなら、どの行で何という例外が生じているのかを明示してみてください。

エラーメッセージが出るのではなく、想定とは異なる動きをしている(論理エラー)という意味なら、
どのようなコードを書いていて、どのような動作を期待していたのに、
どうなってしまうのか、再現可能な実験用簡易コードにまとめてみてください。
引用返信 編集キー/
■86981 / inTopicNo.9)  Re[6]: コントロールが全て削除されてしまう
□投稿者/ kaina (41回)-(2018/04/06(Fri) 14:15:32)
FRMCさん

あなたがこれまで当掲示板で質問した内容を全て拝見しましたが
どれも第三者に伝わるような内容になっていない為、
不要なやり取りが発生しています。

以下の点に気を付けて、質問するように心がければ、あなた自身も
やり取りする回数が減るし、回答者側も不要な労力を
かける手間が減ります。

 @タイトルは質問概要が推測出来るような簡潔な内容にしましょう。
  回答する人はC#を専門にやってきた人、VBを専門にやってきた人、
  Webアプリを専門にやってきた人等様々な人がいます。
  大まかな内容がタイトルである程度推測出来る内容だとベターです。
 A利用方法/規約は必ず読みましょう。
  ここの掲示板の場合は下記ページにありますので、全て目を通して下さい。
   http://bbs.wankuma.com/index.cgi?mode=man
  また、他の掲示板であっても、利用方法/規約があれば読んでその
  ルールを守るのがマナーであり、掲示板を上手に利用する近道です。
 B質問の最初には必ず自分の環境(OS、言語、フレームワークのバージョン、使用ライブラリ等)を
  書くようにしましょう。
  また、前回の質問を回答者全ての人が見ているとは限らないので、
  質問する度に書くようにして下さい。
 C質問は第三者が見て分かるように、より具体的な内容で書くようにしましょう。
  ・エラーが発生している場合には、エラー発生個所、エラーメッセージを書きましょう。
   可能であれば、問題が発生する再現可能な手順、ミニマムコードを書きましょう。
   また、外部の画像投稿可能な場所に画面の画像を投稿し、見てもらうのも効果的です。
  ・これまでどのようなことを試したのか。
  ・どのような意図で作っているプログラムなのか。
  ・これまでどのようなことを試したのか。
 D投稿前に、一度自分の質問内容を読み直しましょう。
  誤字や第三者に伝わりづらい内容になっていないか確認しれば
  より良い質問が出来るようになります。
 E解決した場合には、どのようにして解決したか書きましょう。
  他に同じような悩みがある人が後日あなたの解決方法を参考にする可能性があります。

長くなりましたが、以上のようなことを気を付けると
きっとあなた自身の為にもなりますので、質問する際には
頭の片隅に置いて質問するようにして下さい。

引用返信 編集キー/
■86982 / inTopicNo.10)  Re[7]: コントロールが全て削除されてしまう
□投稿者/ Jitta (370回)-(2018/04/06(Fri) 14:46:08)
例えば、UIの仕様書を作るために、
コントロールをそのまま使いながら、自由にお絵描きもしたい。
という要求と読んだのですが、違うでしょうか。
あっているなら、消されたスレッドに書いたとおりです。
Imageに描いたものと、
Imageを表示しているPictureBoxに乗せたコントロールは別のものです。
それぞれを分けて考えましょう。
引用返信 編集キー/
■86983 / inTopicNo.11)  Re[6]: コントロールが全て削除されてしまう
□投稿者/ FRMC (25回)-(2018/04/06(Fri) 15:45:46)
No86980 (魔界の仮面弁士 さん) に返信
> 2018/04/06(Fri) 12:39:36 編集(投稿者)
> >>「残ってしまい」とは、具体的にLabelBがどういう状態になっているのですか?
>>本来無いはずのラベルの頂点が残ってしまい、それを動かすと不安定になり、
> コントロールが削除されずに残ってしまうという事でしょうか。
> それとも、コントロールは削除されているのに、描画が残ってしまっているのでしょうか。

まず、頂点の追加をし、それから追加したモノ以外の頂点(ラベル)を動かすと動かす前のラベルが残ってしまい、それが無限に続いてしまいます。
そのためにclearをしていますが、今回はclearをすると全コントロールが削除されるので、clear以外のremoveみたいな感じでできるものを探しています。
(ただし探しても見つからなさそうですし、不要なやりとりが続いてしまっているので、代替案も考えています)

> いずれにせよ、現在のコーディング内容が間違っているのだと思いますが、
> 実際のコードが一切記述されていない以上、問題点を指摘することができません。

clearとremoveです。

>
> >>「最終的にエラー」とは、どのようなエラーになるのですか?
>>不安定になってエラーになる=最終的にエラー。
> そのエラーが、具体的にどのようなものであるのかを尋ねています。
>
> 例外メッセージが出るのなら、どの行で何という例外が生じているのかを明示してみてください。
>
でません。

> エラーメッセージが出るのではなく、想定とは異なる動きをしている(論理エラー)という意味なら、

そうです。全く異なる感じです。

まとめると、以前出直した質問の代替案です。


引用返信 編集キー/
■86984 / inTopicNo.12)  Re[8]: コントロールが全て削除されてしまう
□投稿者/ FRMC (26回)-(2018/04/06(Fri) 15:46:35)
No86982 (Jitta さん) に返信
> 例えば、UIの仕様書を作るために、
> コントロールをそのまま使いながら、自由にお絵描きもしたい。
> という要求と読んだのですが、違うでしょうか。
> あっているなら、消されたスレッドに書いたとおりです。
> Imageに描いたものと、
> Imageを表示しているPictureBoxに乗せたコントロールは別のものです。
> それぞれを分けて考えましょう。

分けて考えてきましたが、最終的には合成したいのでこの質問をしています。
引用返信 編集キー/
■86986 / inTopicNo.13)  Re[7]: コントロールが全て削除されてしまう
□投稿者/ 魔界の仮面弁士 (1608回)-(2018/04/06(Fri) 16:52:12)
No86778 では VB2017 をお使いだったようなので、その前提で回答します。

No86983 (FRMC さん) に返信
> まず、頂点の追加をし、それから追加したモノ以外の頂点(ラベル)を動かすと動かす前のラベルが残ってしまい、それが無限に続いてしまいます。

どのタイミングで処理しているのか(Timer 処理? クリックした位置に移動? マウスドラッグに追従?)が
分かりませんが、とにかく「動かす」ということは、ラベルの座標を変更しているという事ですよね。
だとすれば、この移動処理の段階では、Add / Remove / Clear の出番は一切無いはず。

ということで、座標変更のために各ラベルの Location プロパティ、あるいは Left と Top プロパティを
編集するだけのコードを書いているのであろうかと想像します。(あるいは SetBounds メソッド)

たとえば
 Me.LabelA.Left += 10
のようにすれば、このコードが呼ばれるたびに、10 ドットずつ右にずれることになりますね。
もちろん実際には、親コントロールの領域内に収まるようなコードなのだとは思いますが。


…で、この座標変更においては、「どのラベルを動かすのか」が重要となるわけですが、
追加したばかりの頂点ラベルと、それ以前に追加してあった既存のラベルを、
どのようなコードで区別されているのでしょうか?
そこの手続きが間違っているので、おかしな動きをしているのではないかと想像しています。


また、「残ってしまう」としか説明されていませんが、具体的にはどのような残り方をするのでしょうか。
実際にはそこに存在しないのに残像として残ってしまうといるだけなのか、
それとも本当にラベルが増殖してしまっているのかも確認しておいた方が良いと思います。

子コントロールが増殖しているかどうかは、移動のたびに
 Debug.WriteLine( Me.PictureBox1.Controls.Count )
などを呼び出すようにすれば追跡できます。この値が予期せず増加するなら、
コントロールの管理方法に問題があるということになります。

Count 値が変化していないのに、残像が残ってしまっているのなら、
 Me.PictureBox1.Refresh()
で再描画することで解決できるかもしれません。



> そのためにclearをしていますが、

うまく移動させられないので、一旦すべてクリアして再配置してみた、ということでしょうか?


> 今回はclearをすると全コントロールが削除されるので、clear以外のremoveみたいな感じでできるものを探しています。

PictureBox1 に載っている Label をすべて削除するという意味であれば、
 For Each lbl In Me.PictureBox1.Controls.OfType(Of Label).ToArray()
  Me.PictureBox1.Controls.Remove(lbl)
  lbl.Dispose()
 Next
と書けます。


すべての Label ではなく、特定の Label だけを削除したいのであれば、たとえば
 Me.PictureBox1.Controls.Remove( 削除したいLabelインスタンスを格納した変数 )
 削除したいLabelインスタンスを格納した変数.Dispse()
 削除したいLabelインスタンスを格納した変数 = Nothing
というコードになります。


特定の Label 以外をすべて削除したいのであれば、
 For Each lbl In Me.PictureBox1.Controls.OfType(Of Label).ToArray()
  If lbl IsNot 残したいLabelのインスタンス Then
   Me.PictureBox1.Controls.Remove(lbl)
   lbl.Dispose()
  End If
 Next
などとなるでしょう。


このあたりの手続きは、それぞれの Label をどのように管理しているのかによっても
コーディングが変わってくるので、ご自身の実装に合わせて適宜調整してみてください。
(頂点数が可変個数の場合は、配列やコレクション等で管理されているのでしょうし)



>>いずれにせよ、現在のコーディング内容が間違っているのだと思いますが、
>>実際のコードが一切記述されていない以上、問題点を指摘することができません。
> clearとremoveです。

Clear や Remove で取り除いたラベルは、後で再利用しますか?
それとも再利用せずに破棄して、必要になったら、もういちど New しなおす感じですか?

前者だとしたら、どのラベルが使用中で、どれが利用されていない物なのか
インスタンス管理に気を使う必要があるでしょう。

後者だとしたら、Remove や Clear の後で Dispose を呼び出せねばなりませんし、
Dispose 済みのラベルが再利用されないよう注意せねばなりません。(再度作り直す必要がある)


>>エラーメッセージが出るのではなく、想定とは異なる動きをしている(論理エラー)という意味なら、
> そうです。全く異なる感じです。
では、どういう操作をした時に、どういう結果になるのか、再現手順を示してください。


> まとめると、以前出直した質問の代替案です。
まとまってはいないですよね。
引用返信 編集キー/
■86988 / inTopicNo.14)  Re[9]: コントロールが全て削除されてしまう
□投稿者/ MUSAKA (1回)-(2018/04/06(Fri) 18:16:05)
こういう質問には回答してあげない、というのも
一つの礼儀のような気がする。
引用返信 編集キー/
■86989 / inTopicNo.15)  Re[10]: コントロールが全て削除されてしまう
□投稿者/ FRMC (27回)-(2018/04/06(Fri) 18:46:07)
No86988 (MUSAKA さん) に返信
> こういう質問には回答してあげない、というのも
> 一つの礼儀のような気がする。

それは困ります…ここ以外の質問掲示板を知らないし…本もありますが…あまり頼れないのが現実です…

引用返信 編集キー/
■86991 / inTopicNo.16)  Re[11]: コントロールが全て削除されてしまう
□投稿者/ 魔界の仮面弁士 (1610回)-(2018/04/06(Fri) 19:13:04)
No86989 (FRMC さん) に返信
> ここ以外の質問掲示板を知らないし…

まずは第三者に分かるよう、状況を『具体的』に説明するよう心がけてください。

隣で同じ画面を見ながらマンツーマンで教えているわけでは無いのですから、今のような断片的な質問のしかたでは、手助けのしようがありません。

極力、行間を読み取って、そちらの状況を類推しようとは思いますが、今後も説明不足な投稿が続くようであれば、申し訳ありませんが私が手助けできることはなさそうです。
引用返信 編集キー/
■86992 / inTopicNo.17)  Re[8]: コントロールが全て削除されてしまう
□投稿者/ FRMC (28回)-(2018/04/06(Fri) 19:39:58)
No86986 (魔界の仮面弁士 さん) に返信
> また、「残ってしまう」としか説明されていませんが、具体的にはどのような残り方をするのでしょうか。
> 実際にはそこに存在しないのに残像として残ってしまうといるだけなのか、
> それとも本当にラベルが増殖してしまっているのかも確認しておいた方が良いと思います。

こんな感じで描画している線の頂点が残ってしまいます。説明不足を避けるために一応画像を載せます。
https://twitter.com/frmcteam/status/982205013396090882


引用返信 編集キー/
■86996 / inTopicNo.18)  Re[9]: コントロールが全て削除されてしまう
□投稿者/ 魔界の仮面弁士 (1613回)-(2018/04/06(Fri) 20:30:03)
No86992 (FRMC さん) に返信
> こんな感じで描画している線の頂点が残ってしまいます。説明不足を避けるために一応画像を載せます。
> https://twitter.com/frmcteam/status/982205013396090882

これは実行結果でしか無いですよね。そこに至るまでの状況を説明してください。

そもそも掲示板を見ている第三者は、FRMC さんが作っているものが
どういうアプリケーションなのかを知りえません。

座標データファイルを取り込んで描画してくようなものなのか、
マウス操作に応じて描画していくものなのか…。

たとえばマウス操作なら、どこをどういう順番でクリック(あるいはドラッグ)したときに
先の画面になってしまったのか。そして、実際のコードはどのようなものであるのか。


繰り返しになりますが、具体的な説明をお願いします。
引用返信 編集キー/
■87011 / inTopicNo.19)  Re[10]: コントロールが全て削除されてしまう
□投稿者/ 魔界の仮面弁士 (1620回)-(2018/04/07(Sat) 01:41:25)
No86996 (魔界の仮面弁士) に追記
> そもそも掲示板を見ている第三者は、FRMC さんが作っているものが
> どういうアプリケーションなのかを知りえません。

もしかしてこれかな…?
http://ossiy.net/?page_id=121

そこにある情報を見ても、まだ『頂点(ラベル)を動かす』というのが、
どういう操作を指しているのかは読み取れませんでした。


>> https://twitter.com/frmcteam/status/982205013396090882
頂点の表現に Label が使われている理由はさておき、
とりあえず描画処理はある程度完成していて、問題は
動的に配置した子コントロールの削除がうまくいかない、ということなのですよね?


削除の手順自体は、既に何パターンか提示しているわけですが、
それを組み込んでみて、それでもうまく削除できずに残ってしまうというのなら、
削除処理を行おうとしているそのコードに間違いがあるものと考えます。

問題となっている個所のコードを提示することはできないのでしょうか?
引用返信 編集キー/
■87014 / inTopicNo.20)  Re[11]: コントロールが全て削除されてしまう
 
□投稿者/ MUSAKA (2回)-(2018/04/07(Sat) 11:28:48)
> それは困ります…ここ以外の質問掲示板を知らないし…本もありますが…あまり頼れないのが現実です…

回答する側も、情報が足りなくて困っているのですよ。
それでは有効な回答が付かないのも当然でしょ?

これまでのやり取りを見ていると、
そもそも基礎ができていないのではないかと思う。
それだから、伝えたいことがうまく伝えられないのだと思う。
Picturebox上に線を引くということをやっているのならば、別の人が言っているように、
最低限「オーナードロー」とか「Paintイベント」という類のキーワードが
あなたの書き込みに出てくるはず。

それに、どこかのサイトを参考にしながら新しいことをやってみているのだろうけど、
基礎が出来ていないからうまく応用できない。

それならば、どのようなコードを書いているのかを見せることが
相手に伝える最後の方法なのだけれど、
恐らく、アプリの概要をHPで公開しているから、
コードを出すのが難しいかも知れないね。
HP訪問者がそれを知ったら、どう思うか。
(そもそも、HP訪問者がこの掲示板でのやり取りを知ったらどう思うか。)

でも、やりたいことをうまく伝えられないならば、諦めるしかないよ。
引用返信 編集キー/

このトピックをツリーで一括表示

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -