Bitmap( Stream stream )コンストラクタ
昨日書いた問題に続けてまた落とし穴に落ちました。
ImageList に bitmap を追加するのに、こんなコードを書きました。
1: System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); 2: using ( Stream stream1 = asm.GetManifestResourceStream( "Hoge.resources.cat.bmp" ) ) 3: using ( Stream stream2 = asm.GetManifestResourceStream( "Hoge.resources.dog.bmp" ) ) 4: { 5: imageList1.Images.Add( new Bitmap( stream1 ) ); 6: imageList1.Images.Add( new Bitmap( stream2 ) ); 7: }
これを実行すると、
'System.Runtime.InteropServices.ExternalException' のハンドルされていない例外が system.windows.forms.dll で発生しました。 追加情報 : GDI+ で一般的なエラーが発生しました。
と言われる。一般的なエラーなんて曖昧なことを言われても困ってしまう。
デバッガで、5行目で止めて imageList1 を見ながらステップ実行してみると、今度は例外が発生せずビットマップも表示できてしまった。あ〜、こういうの嫌だ。
次に5行目のブレークを外して、7行目でブレークすると、今度は imageList1 に Images が追加されてない。stream を開放しているのが悪そうなので、Bitmapのヘルプを読んでみました。
すると、解説に「Bitmap オブジェクトの有効期間の間は、このストリームを開いておく必要があります。」とのこと。ありゃ。そうだったのか。
Stream を開放しないように修正するとすんなり動きました。
System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); imageList1.Images.Add( new Bitmap( asm.GetManifestResourceStream( "Hoge.resources.cat.bmp" ) ) ); imageList1.Images.Add( new Bitmap( asm.GetManifestResourceStream( "Hoge.resources.dog.bmp" ) ) );
道のりは遠く険しい…。4/1ですが、いつも通り。
(4/2 追記)問題は実は別のところでした。詳しくは http://d.hatena.ne.jp/siokoshou/20050402/1112409533