Windowsãã©ã¼ã ã¢ããªã±ã¼ã·ã§ã³ã§ãªã½ã¼ã¹ãªã¼ã¯ããªãããã«ï¼1ï¼
æè¿ã«ãªã£ã¦åãã¦*1ãæ¬æ ¼çãªWindowsãã©ã¼ã ã¢ããªã±ã¼ã·ã§ã³ãéçºããããã®ä¸ã§ããã¤ããªã½ã¼ã¹ãªã¼ã¯ãããããã¤ã³ããè¦ã¤ããã®ã§è¨é²ããã
æ¸ãã¦ã¿ãã¨ããªãã®åéã«ãªã£ãã®ã§ãåå²ãããã¨ã«ãããæ¬ã¨ã³ããªã¯ãã®ç¬¬1åã
Windowsãã©ã¼ã ã¢ããªã±ã¼ã·ã§ã³ã¨ã¯
ãããªããWindowsãã©ã¼ã ã¢ããªã±ã¼ã·ã§ã³ãã¨ããè¨èã使ã£ããã.NET Frameworkã®System.Windows.Forms名前空間以ä¸ã«å«ã¾ããåã使ã£ã¦ä½æããデスクトップアプリケーションã¨ããæå³ã§ä½¿ã£ãã以éããã®æå³ã§ä½¿ãã
ãã¦ãããããã主é¡ã
Image.Disposeãå¿ããªã
Windowsãã©ã¼ã ã¢ããªã±ã¼ã·ã§ã³ã§ç»åãæ±ãå ´åãä¸è¬çã«Imageクラスã使ãããã®ã¯ã©ã¹ã¯IDisposableインターフェイスãå®è£ ãã¦ããããã£ã¦ãã®ã¤ã³ã¹ã¿ã³ã¹ã使ãçµãã£ãæç¹ã§ãDisposeãã¦ããå¿ è¦ãããããªãåãããããä¾ã¨ãã¦Imageã¯ã©ã¹ãæããããSystem.Drawing名前空間ã®ãªãã¸ã§ã¯ãã¯ã»ã¨ãã©ï¼å ¨ã¦ï¼ï¼åæ§ã ã
ããã¾ã§ã ã¨å½ããåã«æããããæ¬¡ã®å ´åã¯ã©ãã ããã
PictureBox.Imageãè¦Dispose
Windowsãã©ã¼ã ã¢ããªã±ã¼ã·ã§ã³ã§ç»é¢ä¸ã«ç»åã表示ããå ´åãä¸è¬çã«PictureBoxコントロールã使ãããªã³ã¯å ï¼DOBON.NETããï¼ã«éè¦ãªãã¨ããµã©ãã¨æ¸ããã¦ããããPictureBox.Imageããããã£ã使ã£ã¦è¡¨ç¤ºããç»åãæ¶å»ãããã®ãµã³ãã«ã³ã¼ãã ãæ¬¡ã«å¼ç¨ããã
if (PictureBox1.Image != null) { PictureBox1.Image.Dispose(); PictureBox1.Image = null; }
PictureBox.Imageプロパティã«nullãè¨å®ããåã«ãDisposeãã¦ããã®ã ããããå¿ããã¨ãªã½ã¼ã¹ãªã¼ã¯ã«ç¹ããã
ç»åãæ¶å»ããå ´åã ã¨ã¾ã è¯ãããç»åãå·®ãæ¿ããå ´åãªã©ã«ã¯å¿ããã¡ã§ã¯ãªãã ããããç»åãå·®ãæ¿ããå ´åãå·®ãæ¿ããåã®PictureBox.Imageããããã£å¤ãDisposeããªããã°ãªããªãã*2ãããè¸ã¾ããã¨ã次ã®ãããªã¦ã¼ãã£ãªãã£ã¡ã½ãã*3ãæ¸ããã
public static void SwapImage(this PictureBox pictureBox, Image newImage) { if (pictureBox == null) { throw new ArgumentNullException("pictureBox"); } var oldImg = pictureBox.Image; pictureBox.Image = newImage; if (oldImg != null) { oldImg.Dispose(); } }
ç»åãæ¶å»ããå ´åã¯newImage弿°ã«nullãæå®ãããã¨ããã®ã¯ç´æçã§ãªãã®ã§ã次ã®ãããªã¡ã½ããã使ãã¦ããã¨è¯ãã ããã
public static void ClearImage(this PictureBox pictureBox) { SwapImage(pictureBox, null); }
DOBON.NETããã®ã³ã¼ãã¨ã¯Disposeã®ã¿ã¤ãã³ã°ãç°ãªããã¨ã«æ³¨æãããç§ã®ã³ã¼ãã§ã¯PictureBox.Imageããããã£ã®ä¸æ¸ãããå¾ã«ãå ã®Imageãªãã¸ã§ã¯ããDisposeãã¦ããããã®é åºã¯ç»åã®æ¶å»ã§ã¯ç¹ã«éè¦ã§ã¯ãªãã®ã ããç»åã®å·®ãæ¿ãã®å ´åã«é常ã«éè¦ã ããã®ç¹ã«ã¤ãã¦æ¬¡ã«èª¬æããã
PictureBox.Imageã®å¤ãå¤ã®Disposeã¯ãæ°ããå¤ã®è¨å®ããå¾ã§
å è¿°ã®ãµã³ãã«ã³ã¼ãã®SwapImageã¡ã½ããã§ã¯ãPictureBox.Imageããããã£ã®ä¸æ¸ãããå¾ã«ãå ã®Imageãªãã¸ã§ã¯ããDisposeãã¦ãããããã«ã¯å®ã¯æå³ããããDisposeâ䏿¸ãã®é ã ã¨ãããæ¡ä»¶ä¸ã§æ¬¡ã®ãããªä¾å¤ãçºçãã¦ãã¾ããã¨ãããã®ã ã
[ArgumentException: 使ç¨ããããã©ã¡ã¼ã¿ãæå¹ã§ã¯ããã¾ããã]
å ´æ System.Drawing.Image.get_Width()
å ´æ System.Drawing.Image.get_Size()
å ´æ System.Windows.Forms.PictureBox.ImageRectangleFromSizeMode(PictureBoxSizeMode mode)
å ´æ System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)
å ´æ System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
å ´æ System.Windows.Forms.Control.WmPaint(Message& m)
å ´æ System.Windows.Forms.Control.WndProc(Message& m)
å ´æ System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
å ´æ System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
å ´æ System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
ããæ¡ä»¶ã¨ã¯ä½ããç§ã確èªããç¯å²ã§ã¯ãæ¬¡ã®æ¡ä»¶ãã¨ãã«æºãããå ´åã«åç¾ããã
- Windows Server 2008ã§ããï¼Windows XPã§ã¯çºçããªãï¼
- éã¡ã¤ã³ã¹ã¬ããããControl.Invokeメソッドã¾ãã¯Control.BeginInvokeメソッドãéãã¦*4å¼ã³åºããã
ããã以å¤ã«ãæ¡ä»¶ããããããããªããããããã®ãã¡ã«åç¾æ§ã«ç¡é¢ä¿ãªæ¡ä»¶ããããããããªãããããããã§éè¦ãªã®ã¯ãDisposeâ䏿¸ãã®é ã ã¨ä¾å¤ãçºçãã¦ãã¾ãå ´åãããã¨ãããã¨ã ãæ¡ä»¶ã®æ£ç¢ºãã¯ããã»ã©éè¦ã§ã¯ãªããDisposeã¯ä¸è¬çã«ãåç §ãã¦ãã夿°ãããã¤ã³ã¹ã¿ã³ã¹ã«å¯¾ãã¦å¼ã³åºãããã¹ãã§ã¯ãªããããããã§ãããã«å¾ã£ã¦ä¸æ¸ãâDisposeã¨ãã¹ãã ããã
PictureBoxã®Disposeæã¯ãPictureBox.Imageãä¸ç·ã«Dispose
PictureBox.Disposeメソッドã¯PictureBox.Imageããããã£å¤ã®Imageãªãã¸ã§ã¯ããDisposeããªãããã®ãã¨ã¯ãªãã¡ã¬ã³ã¹ãè¦ã¦ãåãããªããããã©ããããªãã¡ã¬ã³ã¹ãè¦ãã¨ãå ¨ãéã®ãã¨ãæ³åãã¦ãã¾ãã ããã*5次ã«ãªãã¡ã¬ã³ã¹ãå¼ç¨ããã
disposing ãã©ã¡ã¼ã¿ã¼ã true ã®å ´åããã®ã¡ã½ããã¯ããã® PictureBox ããåç §ããããã¹ã¦ã®ããã¼ã¸ ãªãã¸ã§ã¯ããä¿æãã¦ãããªã½ã¼ã¹ããã¹ã¦è§£æ¾ãã¾ãã ãã®ã¡ã½ããã¯ãåç §ãããåãªãã¸ã§ã¯ãã® Dispose() ã¡ã½ãããå¼ã³åºãã¾ãã
ã¨ããã§PictureBox.DisposeãPictureBox.Imageããããã£å¤ãDisposeããªãã®ã¯ãèªç¶ãªãã¨ã ãPictureBoxã«ã¯Disposeãã¦è¯ãããåãããªãããã ãPictureBox.Imageããããã£å¤ã®Imageã¤ã³ã¹ã¿ã³ã¹ã¯ãPictureBoxã®Disposeå¾ã使ãç¶ããããå¯è½æ§ãããã
ãããéã«ãPictureBox.Disposeã®æç¹ã§PictureBox.Imageããããã£å¤ãä¸è¦ã«ãªããªããDisposeãå¿ãã¦ã¯ãªããªããæ®éã®ã¢ããªã±ã¼ã·ã§ã³ãªãã大æµã®å ´åããã該å½ããã®ã§ã¯ãªããããã®ãããªå ´åã®ããã«ã次ã®ãããªã¯ã©ã¹ã使ãã¦ããã¨è¯ãã ãããPictureBoxã¨åæã«Imageãªãã¸ã§ã¯ããDisposeãã¦è¯ãå ´é¢ã§ã¯ãåãªãPictureBoxã§ãªããã¡ãã使ãã
public sealed class AutoPictureBox : PictureBox { protected override void Dispose(bool disposing) // (1) { try { if (IsDisposed) { return; } if (disposing) { // ããã¼ã¸ããªã½ã¼ã¹ãè§£æ¾ this.ClearImage(); // (2) } // ã¢ã³ããã¼ã¸ããªã½ã¼ã¹ãè§£æ¾ } finally { base.Dispose(disposing); } } }
(2)ã®ClearImageã¡ã½ããã¯ãPictureBox.Imageãè¦Disposeãã§ä½æãããã®ã ã
(1)ã§Disposeã¡ã½ããããªã¼ãã¼ã©ã¤ããã¦ããããDisposeã¡ã½ãããæ£ããå®è£ ããã®ã¯ãç¥ããªãã¨ã§ããªãããç§ã¯ãã¤ãããアンマネージ リソースをクリーンアップするための Finalize および Dispose の実装ããåèã«ãã¦ããã
*1:ä»ããæãæ¼ãã
*2:ãã ãããã®Imageãªãã¸ã§ã¯ãã仿ã§ä½¿ã£ã¦ããªãå ´åã«éãã
*3:ç§ã®å¥½ã¿ã«ããæ¡å¼µã¡ã½ãã
*4:ç´æ¥å¼ã³åºãã¦ã¯ãªããªãçç±ã«ã¤ãã¦ã¯æ¬¡ã®URLãªã©ãåç § http://blogs.msdn.com/b/nakama/archive/2009/03/30/windows.aspx
*5:ãã®ãã¨ã¯ãã¤ã¯ãã½ããã«ææããã