سؤال

أنا أكتب بيولوجي التطبيق.لاختبار ذلك علي شكل مع زر 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);
}

أنك يجب أن تفعل نفس الشيء مع الرسومات الكائن الذي خلق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top