تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
المساعده في الخطاء out of memory
#5
أي ملفات يتم توظيفها في المشروع عن طريق اضافتها الي Resources المشروع لا يمكن أن تتخلص منها بنفسك بسهولة كما تعتقد
لكن المشروع نفسه يتكفل بالتخلص منها عندما ينتهي من العمل و يتم اغلاق المشروع

دعي أوضح لك أكثر باستخدام مثال تجريبي

افتخ مشروع و اضف للفورم عدد واحد بكتشر بوكس
ثم اضف اي صورة بحجم مناسب الي Resources المشروع
طبعا الأفضل أنك تجعل Build Action الخاص بالصورة من النوع Embeded Resources
ولكي تفعل ذلك من داخل الفيجوال استوديو عليك تنفيذ التالي
تقف علي ملف الصورة الموجود في الريسورس
وتضغط يمين الماوس وهنا ستظهر لك قائمة جانبية منسدلة
أختار منها أخر أختيار وهو بعنوان Properties
المفروض هنا سيظهر لك في Solution Explorer شئ مثل Grid
منه اضبط Build Action فقط

ثم في الحدث laod الخاص بالفورم اكتب الكود التالي
دعتي افترض ان إسم الصورة التي تم اضافتها للريسورس هو dest.jpg

PHP كود :
  Private Sub Form1_Load(sender As ObjectAs EventArgsHandles MyBase.Load
        Dim bmp 
As Bitmap CType(My.Resources.ResourceManager.GetObject("dest"), Bitmap)
 
       If bmp IsNot Nothing Then
            PictureBox1
.Image bmp
        End 
If

 
       If bmp IsNot Nothing Then
            bmp
.Dispose()
 
           bmp Nothing
        End 
If

 
   End Sub 

أو يمكنك كتابة الكود بالشكل التالي

PHP كود :
   Private Sub Form1_Load(sender As ObjectAs EventArgsHandles MyBase.Load
        Using img 
As Bitmap CType(My.Resources.destBitmap)
 
           If img IsNot Nothing Then
                PictureBox1
.Image img
            End 
If
 
       End Using
    End Sub 

الأن عليك تجربة الكود فقط قم بتتشغيل المشروع و لاحظ ماذا سيحدث معك
ستلاخظ أنه حدث خطأ أثناء التشغيل لأننا نقوم بعمل Dispose للصورة الموجودة في الريسورس

الأن عليك التعديل علي الكود و كتابته بالشكل التالي

PHP كود :
   Private Sub Form1_Load(sender As ObjectAs EventArgsHandles MyBase.Load
        Dim img 
As Bitmap CType(My.Resources.destBitmap)
 
       If img IsNot Nothing Then
            PictureBox1
.Image img
        End 
If
 
   End Sub 

لاحظ أننا لم نقوم بعمل Dispsoe للصورة من خلال الكود
ستلاحظ هنا أن البرنامج سيعمل بشكل صحيح
لأن عملية تمرير البيانات الي البكتشر بوكس تمت بشكل صحيح

لكن لو فعلا تريد عمل Dispose للصورة بشكل صحيح يجب أن تتعامل مع الصورة الموجودة في الريسورس بشكل أخر
والفكرة تنحصر إنك تحتاج الي الحصول علي Reference للصورة وهذا موضوع يطول شرحه قليلا

مثال توضيحي للعلم فقط
مثلا اضف الكود التالي للحدث Paint الخاص بالفورم أو اكتبه بالشكلل التالي

PHP كود :
   Protected Overrides Sub OnPaint(As PaintEventArgs)
 
       MyBase.OnPaint(e)
 
       Using bmp As Bitmap CType(My.Resources.ResourceManager.GetObject("dest"), Bitmap)
 
           e.Graphics.DrawImage(bmp00)
 
       End Using

    End Sub 

ستلاحظ وبالرغم أننا نقوم بعمل Dispose للصورة ستجد أن الصورة يتم رسمها بالفعل علي الفورم بدون أخطاء

ولكي لا أطيل عليك أكثر من ذلك
أرجو أن يكون التالي واضحا لك
الكونترول مصصم أنه و عندما يكون هناك صورة تم تمريرها بواسطة المبرمج فهنا يقوم الكونترول برسم اتلك الصورة في الحدث Paint الخاص بالكونترول
وعندما لا يجد الصورة فهنا يحدث الخطأ

شئ اخير وخاص بالكود الذي أنت استخدمته
ما فعلته أنت هو أنك أخذت نسخة من الصور الموجودة في الريسورس
لكن يظل عليك التخلص من ماهو موجود بالمصفوفة من صور عند اغلاق الفورم
أيضا ربما يكون غير مضمون تماما ما فعلته لأنك لا تضمن متي سييقوم نظأم التشغيل بالتخلص من المصفوفة نفسها كلها
من أجل ذلك فإن الكود الخاص بالمصفوفة يحتاج لتعديل قليلا


و عذرا علي الإطالة .........
Retired
الرد }}}
تم الشكر بواسطة: Rabeea Qbaha


الردود في هذا الموضوع
RE: المساعده في الخطاء out of memory - بواسطة silverlight - 14-11-17, 12:30 PM


التنقل السريع :


يقوم بقرائة الموضوع: