التخلص ثابت فرشاة
-
19-08-2019 - |
سؤال
أنا أكتب بيولوجي التطبيق.لاختبار ذلك علي شكل مع زر PictureBox.عندما كنت اضغط على زر أفعل
myPictureBox.Image = GetBiorhythm2();
الذي يمتد موافق لأول مرة ، ولكن في النقرة الثانية أنه يسبب الاستثناء التالي:
System.ArgumentException: Parameter is not valid.
at System.Drawing.Graphics.CheckErrorStatus
at System.Drawing.Graphics.FillEllipse
at Larifari.Biorhythm.Biorhythm.GetBiorhythm2 in c:\delo\Horoskop\Biorhythm.cs:line 157
at Larifari.test.Button1Click in c:\delo\Horoskop\test.Designer.cs:line 169
at System.Windows.Forms.Control.OnClick
at System.Windows.Forms.Button.OnClick
at System.Windows.Forms.Button.OnMouseUp
at System.Windows.Forms.Control.WmMouseUp
at System.Windows.Forms.Control.WndProc
at System.Windows.Forms.ButtonBase.WndProc
at System.Windows.Forms.Button.WndProc
at ControlNativeWindow.OnMessage
at ControlNativeWindow.WndProc
at System.Windows.Forms.NativeWindow.DebuggableCallback
at ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop
at ThreadContext.RunMessageLoopInner
at ThreadContext.RunMessageLoop
at System.Windows.Forms.Application.Run
at Larifari.test.Main in c:\delo\Horoskop\test.cs:line 20
قطع أسفل وظيفة مما يسبب الخطأ هو :
public static Image GetBiorhythm2() {
Bitmap bmp = new Bitmap(600, 300);
Image img = bmp;
Graphics g = Graphics.FromImage(img);
Brush brush = Brushes.Black;
g.FillEllipse(brush, 3, 3, 2, 2); //Here the exception is thrown on the second call to the function
brush.Dispose(); //If i comment this out, it works ok.
return img;
}
إذا كنت التعليق-من فرشاة التخلص أنه يعمل على ما يرام, ولكن أنا لست سعيد بذلك وأتمنى أن تجد حلا بديلا.هل يمكنك مساعدتي من فضلك ؟
المحلول
يبدو أنك تحاول التخلص من الساكنة ، مما يسبب بعض المشاكل في المرة القادمة انها تستخدم:
Brush brush = Brushes.Black;
g.FillEllipse(brush, 3, 3, 2, 2); //Here the exception is thrown on the second call to the function
brush.Dispose(); //If i comment this out, it works ok.
عند تعيين فرشاة = الفرش.الأسود, كنت في الواقع وضع فرشاة كمرجع (أو مؤشر) إلى ثابت الفرش.الأسود.عن طريق التخلص من أنت فعليا الكتابة:
Brushes.Black.dispose();
عندما كنت أعود إلى استخدام الفرشاة السوداء مرة أخرى ، runtime يقول لك لا يمكن لأنه بالفعل تم التخلص منها, و ليس حجة صحيحة g.FillEllipse()
أفضل طريقة لكتابة هذا قد يكون ببساطة:
g.FillEllipse(Brushes.Black, 3, 3, 2, 2);
أو إذا كنت تريد أن تكون معقدة حقا حول هذا الموضوع:
Brush brush = Brushes.Black.Clone();
g.FillEllipse( brush, 3, 3, 2, 2 );
brush.Dispose();
أو إذا كنت لا تهتم حول الأشياء التي يبحث الخطأ فقط التعليق من الفرشاة.Dispose () ؛ خط في رمز الأصلي.
نصائح أخرى
Bruhes.الأسود هو نظام الموارد, وليس المقصود بالنسبة لك للتخلص منها.وقت التشغيل يدير الفرش فرش الطبقة ، الأقلام ، وغيرها من مثل هذه الكائنات.فإنه يخلق يتصرف في هذه الكائنات كما هو مطلوب, حفظ العناصر المستخدمة بشكل متكرر على قيد الحياة حتى أنه لا يجب أن تخلق باستمرار وتدميرها.
وثائق فرش الطبقة يقول:
فرش الطبقة تحتوي ثابت خصائص للقراءة فقط أن يعود فرشاة وجوه اللون هو مبين من قبل اسم الخاصية.تفعل عادة لا صراحة التخلص من فرشاة إرجاعها بواسطة الخاصية في هذا فئة ، ما لم يتم استخدامه لبناء فرشاة جديدة.
باختصار, لا ندعو التصرف على النظام الموردة الكائنات.
لا أعتقد أنك تحتاج إلى الاتصال .التصرف على ساكنة الفرش فقط إذا قمت بإنشاء مؤسسات جديدة.على الرغم من أن, شخصيا, وأود أن استخدام باستخدام بناء الجملة..أي:
using (Brush brush = new SolidBrush(...))
{
g.FillEllipse(brush, 3, 3, 2, 2);
}
أنك يجب أن تفعل نفس الشيء مع الرسومات الكائن الذي خلق.