14-11-17, 12:30 PM
(آخر تعديل لهذه المشاركة : 14-11-17, 01:00 PM {2} بواسطة silverlight.)
أي ملفات يتم توظيفها في المشروع عن طريق اضافتها الي Resources المشروع لا يمكن أن تتخلص منها بنفسك بسهولة كما تعتقد
لكن المشروع نفسه يتكفل بالتخلص منها عندما ينتهي من العمل و يتم اغلاق المشروع
دعي أوضح لك أكثر باستخدام مثال تجريبي
افتخ مشروع و اضف للفورم عدد واحد بكتشر بوكس
ثم اضف اي صورة بحجم مناسب الي Resources المشروع
طبعا الأفضل أنك تجعل Build Action الخاص بالصورة من النوع Embeded Resources
ولكي تفعل ذلك من داخل الفيجوال استوديو عليك تنفيذ التالي
تقف علي ملف الصورة الموجود في الريسورس
وتضغط يمين الماوس وهنا ستظهر لك قائمة جانبية منسدلة
أختار منها أخر أختيار وهو بعنوان Properties
المفروض هنا سيظهر لك في Solution Explorer شئ مثل Grid
منه اضبط Build Action فقط
ثم في الحدث laod الخاص بالفورم اكتب الكود التالي
دعتي افترض ان إسم الصورة التي تم اضافتها للريسورس هو dest.jpg
أو يمكنك كتابة الكود بالشكل التالي
الأن عليك تجربة الكود فقط قم بتتشغيل المشروع و لاحظ ماذا سيحدث معك
ستلاخظ أنه حدث خطأ أثناء التشغيل لأننا نقوم بعمل Dispose للصورة الموجودة في الريسورس
الأن عليك التعديل علي الكود و كتابته بالشكل التالي
لاحظ أننا لم نقوم بعمل Dispsoe للصورة من خلال الكود
ستلاحظ هنا أن البرنامج سيعمل بشكل صحيح
لأن عملية تمرير البيانات الي البكتشر بوكس تمت بشكل صحيح
لكن لو فعلا تريد عمل Dispose للصورة بشكل صحيح يجب أن تتعامل مع الصورة الموجودة في الريسورس بشكل أخر
والفكرة تنحصر إنك تحتاج الي الحصول علي Reference للصورة وهذا موضوع يطول شرحه قليلا
مثال توضيحي للعلم فقط
مثلا اضف الكود التالي للحدث Paint الخاص بالفورم أو اكتبه بالشكلل التالي
ستلاحظ وبالرغم أننا نقوم بعمل Dispose للصورة ستجد أن الصورة يتم رسمها بالفعل علي الفورم بدون أخطاء
ولكي لا أطيل عليك أكثر من ذلك
أرجو أن يكون التالي واضحا لك
الكونترول مصصم أنه و عندما يكون هناك صورة تم تمريرها بواسطة المبرمج فهنا يقوم الكونترول برسم اتلك الصورة في الحدث Paint الخاص بالكونترول
وعندما لا يجد الصورة فهنا يحدث الخطأ
شئ اخير وخاص بالكود الذي أنت استخدمته
ما فعلته أنت هو أنك أخذت نسخة من الصور الموجودة في الريسورس
لكن يظل عليك التخلص من ماهو موجود بالمصفوفة من صور عند اغلاق الفورم
أيضا ربما يكون غير مضمون تماما ما فعلته لأنك لا تضمن متي سييقوم نظأم التشغيل بالتخلص من المصفوفة نفسها كلها
من أجل ذلك فإن الكود الخاص بالمصفوفة يحتاج لتعديل قليلا
و عذرا علي الإطالة .........
لكن المشروع نفسه يتكفل بالتخلص منها عندما ينتهي من العمل و يتم اغلاق المشروع
دعي أوضح لك أكثر باستخدام مثال تجريبي
افتخ مشروع و اضف للفورم عدد واحد بكتشر بوكس
ثم اضف اي صورة بحجم مناسب الي Resources المشروع
طبعا الأفضل أنك تجعل Build Action الخاص بالصورة من النوع Embeded Resources
ولكي تفعل ذلك من داخل الفيجوال استوديو عليك تنفيذ التالي
تقف علي ملف الصورة الموجود في الريسورس
وتضغط يمين الماوس وهنا ستظهر لك قائمة جانبية منسدلة
أختار منها أخر أختيار وهو بعنوان Properties
المفروض هنا سيظهر لك في Solution Explorer شئ مثل Grid
منه اضبط Build Action فقط
ثم في الحدث laod الخاص بالفورم اكتب الكود التالي
دعتي افترض ان إسم الصورة التي تم اضافتها للريسورس هو dest.jpg
PHP كود :
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles 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 Object, e As EventArgs) Handles MyBase.Load
Using img As Bitmap = CType(My.Resources.dest, Bitmap)
If img IsNot Nothing Then
PictureBox1.Image = img
End If
End Using
End Sub
الأن عليك تجربة الكود فقط قم بتتشغيل المشروع و لاحظ ماذا سيحدث معك
ستلاخظ أنه حدث خطأ أثناء التشغيل لأننا نقوم بعمل Dispose للصورة الموجودة في الريسورس
الأن عليك التعديل علي الكود و كتابته بالشكل التالي
PHP كود :
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim img As Bitmap = CType(My.Resources.dest, Bitmap)
If img IsNot Nothing Then
PictureBox1.Image = img
End If
End Sub
لاحظ أننا لم نقوم بعمل Dispsoe للصورة من خلال الكود
ستلاحظ هنا أن البرنامج سيعمل بشكل صحيح
لأن عملية تمرير البيانات الي البكتشر بوكس تمت بشكل صحيح
لكن لو فعلا تريد عمل Dispose للصورة بشكل صحيح يجب أن تتعامل مع الصورة الموجودة في الريسورس بشكل أخر
والفكرة تنحصر إنك تحتاج الي الحصول علي Reference للصورة وهذا موضوع يطول شرحه قليلا
مثال توضيحي للعلم فقط
مثلا اضف الكود التالي للحدث Paint الخاص بالفورم أو اكتبه بالشكلل التالي
PHP كود :
Protected Overrides Sub OnPaint(e As PaintEventArgs)
MyBase.OnPaint(e)
Using bmp As Bitmap = CType(My.Resources.ResourceManager.GetObject("dest"), Bitmap)
e.Graphics.DrawImage(bmp, 0, 0)
End Using
End Sub
ستلاحظ وبالرغم أننا نقوم بعمل Dispose للصورة ستجد أن الصورة يتم رسمها بالفعل علي الفورم بدون أخطاء
ولكي لا أطيل عليك أكثر من ذلك
أرجو أن يكون التالي واضحا لك
الكونترول مصصم أنه و عندما يكون هناك صورة تم تمريرها بواسطة المبرمج فهنا يقوم الكونترول برسم اتلك الصورة في الحدث Paint الخاص بالكونترول
وعندما لا يجد الصورة فهنا يحدث الخطأ
شئ اخير وخاص بالكود الذي أنت استخدمته
ما فعلته أنت هو أنك أخذت نسخة من الصور الموجودة في الريسورس
لكن يظل عليك التخلص من ماهو موجود بالمصفوفة من صور عند اغلاق الفورم
أيضا ربما يكون غير مضمون تماما ما فعلته لأنك لا تضمن متي سييقوم نظأم التشغيل بالتخلص من المصفوفة نفسها كلها
من أجل ذلك فإن الكود الخاص بالمصفوفة يحتاج لتعديل قليلا
و عذرا علي الإطالة .........
Retired

