- PR -

【C#】最前面表示コントロールの切り替えを繰り返すと例外が発生する

1
投稿者投稿内容
みんくる
会議室デビュー日: 2005/11/27
投稿数: 3
投稿日時: 2005-11-27 02:47
初めて投稿します。

Panelに複数のユーザコントロールを登録し、各コントロールに対応するボタンが押下される毎に当該コントロールを最前面表示するプログラムを作成したところ、100回程度繰り返すと例外が発生してダウンしてしまいます。

発生する例外は、「GDI+で一般的なエラーが発生しました」または「パラメータが無効です」のどちらかです。

原因が分からず、困っているのですが、どなたか似たような現象について解決策をご存知の方はいらっしゃいますでしょうか?

最前面表示には BringToFrontを使用しています。
また、BringToFront を使用せず、各コントロールのvisibleプロパティを切り替えることで対象コントロールだけを表示させた場合にも、同じエラーが発生しました。
sia
常連さん
会議室デビュー日: 2004/05/02
投稿数: 38
投稿日時: 2005-11-27 12:51
はじめまして。

とりあえず、情報が足らないように思いますので。
1.どこで例外が発生するのか。(可能ならば例外スタックも)
2.貼り付けているユーザコントロールはどのようなものか。
などの情報があると良いと思います。

ただ、約100回と回数が決まっているのでしたら、リソースリークが怪しいかもしれません。タスクマネージャで、ハンドルの数を観察してみて、ハンドルが増加していないかどうかを確かめてみてはいかがでしょうか?

・・・ところでそもそも何をしたいプログラムなのでしょうか?
フォームではなくてコントロールを最前面にしたいのですか?
それとも、単にフォーカスを得たいのでしょうか?
みんくる
会議室デビュー日: 2005/11/27
投稿数: 3
投稿日時: 2005-11-27 17:12
siaさん、ご返答ありがとうございました。
投稿して初めてのことでしたので、とても感激いたしました。

さて本題ですが、作成したいプログラムは、「フォーム」ではなく「コントロール」を最前面に出すプログラムです。コントロールはUserControlで作成し、親フォーム内に配置したPanelのControlsにAddしてあります。各コントロールには、目的別に様々な入力用オブジェクトが配置されています。(ボタン、ラベル、テキストetc.)

状況説明を補足すると、コントロールを最前面に表示するにはBringToFrontを使用するのが一般的だと思い、例にもれず使用していたのですが、必ず約100回程度切り替えを行なうとエラーが発生することが分かりました。そこで、BringToFront部分をコメントアウトすると200回繰り返してもエラーは発生しなかったのです。
もしかしてBringToFrontに何かよく知られた問題でもあるのだろうかと思い、こちらの会議室に投稿させていただいた次第です。

siaさんがご指摘くださったように、リソースが疑わしいですよね。「ハンドル」について、私は不勉強で知識がありませんでしたので、調べてみます。また、エラーの発生している非ユーザコードは、現在手元にないため、改めて明日こちらに掲載させていただこうと思います。

何かご存知でしたら、ぜひご助言をお願いいたします。
ありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-27 22:20
引用:

みんくるさんの書き込み (2005-11-27 17:12) より:

もしかしてBringToFrontに何かよく知られた問題でもあるのだろうかと思い、こちらの会議室に投稿させていただいた次第です。


とりあえず、UserControl で試してみたのですが、大丈夫でした。
作成した UserControl が何か悪さをしているかもしれません。
他のコントロールで試して頂けますか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
みんくる
会議室デビュー日: 2005/11/27
投稿数: 3
投稿日時: 2005-11-28 21:43
じゃんぬねっとさん、ご返信ありがとうございました。

siaさんのご助言に従い、タスクマネージャを監視していたところ、ハンドル数は増加していませんでしたが、GDIオブジェクトがびっくりするほどの速度で増加していることがわかりました。例外発生していたのは、MAXの10000に達した時点でした。

原因は、UserControl上に多数配置していた、某社から提供されているコントロールです。驚いたことにこのコントロールは、再描画される度にGDIオブジェクトを蓄積してしまうのです。Form上にこれらのコントロールを配置しただけの簡単なプログラムを作成して、その上を他のアプリケーションのウィンドウをドラッグさせてみたところ、それだけで、50〜100ものGDIオブジェクトが増加しました。ドラッグを繰り返すと瞬く間に10000に達し、GDIエラーが発生しました。

原因がはっきりしたことで、例外発生を回避させることができるようになりました。

siaさん、じゃんぬねっとさん、ありがとうございました。

1

スキルアップ/キャリアアップ(JOB@IT)